在动态点击事件(上下文菜单)上传递 Variables/ID
Passing Variables/ID on dynamic click event(context menu)
如何在上下文菜单的动态循环中将变量或 ID 传递给特定的点击事件。我的目标是在上下文菜单中动态加载技术人员的姓名,并且他们的每个点击事件都必须通过他们的id 然后调用我的名为 assign_tech()
的方法
到目前为止我的代码和我尝试过的都在这里
void loadContext()
{
query = "SELECT * FROM `tbl_technician`";
using (MySqlConnection conn = constrings.GetDBConnection())
{
try
{
conn.Open();
using (MySqlCommand cmd = new MySqlCommand(query, conn))
{
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
ToolStripMenuItem cm = startToolStripMenuItem as ToolStripMenuItem;
cm.DropDownItems.Add(reader["technician"].ToString()).Click += MyMethod;
//cm.DropDownItems.Add(reader["technician"].ToString()).Click += (sender, e) => { MyMethod(sender, e); };
//cm.DropDownItems.Add(reader["technician"].ToString()).Click += (_sender, _e) =>
//{
// tech_id = Convert.ToInt32(reader[0]);
// //MessageBox.Show(tech_id.ToString());
//};
}
}
}
}
catch (Exception ex)
{
CMessageBox m = new CMessageBox("error\n" + ex);
m.ShowDialog();
}
finally
{
conn.Close();
}
}
}
我的点击事件代码
void MyMethod(object sender, EventArgs e)
{
// MessageBox.Show("test");
DialogResult dr = new DialogResult();
DialogueBox db = new DialogueBox("Are you sure you want to assign this Record!");
dr = db.ShowDialog();
if (dr == DialogResult.Yes)
{
assign_tech();
loadData();
loadTechnicianData();
}
}
我的分配技术代码
void assign_tech()
{
if (tech_id>0)
{
using (MySqlConnection conn = constrings.GetDBConnection())
{
try
{
conn.Open();
query = "UPDATE `tbl_job_order` SET `t_id` = @tech_id, status= 'Servicing' WHERE `tbl_job_order`.`j_id` = @id;";
using (MySqlCommand cmd = new MySqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@tech_id", tech_id);
cmd.Parameters.AddWithValue("@id", selected_id);
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
CMessageBox m = new CMessageBox("error \n" + ex);
m.ShowDialog();
}
finally
{
conn.Close();
}
}
}
}
ToolStripDropDownItem
从 ToolStripItem
继承了一个 Tag
属性 专门用于此目的。 Tag
是一个 object
属性,所以你可以给它分配任何你喜欢的东西。在 API 文档 (here) 中,他们使用它来保存字符串,但您可以在其中放入任何您喜欢的东西。
在您的 loadContext
方法中,在内循环中将新创建的 ToolStripDropDownItem
的 Tag
属性 设置为您的 tbl_technician
记录的 ID :
while (reader.Read())
{
ToolStripMenuItem cm = startToolStripMenuItem as ToolStripMenuItem;
var item = cm.DropDownItems.Add(reader["technician"].ToString());
item.Click += MyMethod;
item.Tag = Convert.ToInt32(reader[0]);
}
现在在您的处理程序中,您可以提取 ID 值并将其传递给 assign_tech
方法:
void MyMethod(object sender, EventArgs e)
{
// get tech id from sender's Tag
if (!(sender is TooStripDropDownItem item) || !(item.Tag is int tech_id))
return;
// MessageBox.Show("test");
DialogResult dr = new DialogResult();
DialogueBox db = new DialogueBox("Are you sure you want to assign this Record!");
dr = db.ShowDialog();
if (dr == DialogResult.Yes)
{
assign_tech(tech_id);
loadData();
loadTechnicianData();
}
}
如果您想更深入一点,可以将您的记录加载到适当的 class 实例中,并将该实例存储在 Tag
属性 中,以便您可以获得更多信息给你。
如何在上下文菜单的动态循环中将变量或 ID 传递给特定的点击事件。我的目标是在上下文菜单中动态加载技术人员的姓名,并且他们的每个点击事件都必须通过他们的id 然后调用我的名为 assign_tech()
到目前为止我的代码和我尝试过的都在这里
void loadContext()
{
query = "SELECT * FROM `tbl_technician`";
using (MySqlConnection conn = constrings.GetDBConnection())
{
try
{
conn.Open();
using (MySqlCommand cmd = new MySqlCommand(query, conn))
{
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
ToolStripMenuItem cm = startToolStripMenuItem as ToolStripMenuItem;
cm.DropDownItems.Add(reader["technician"].ToString()).Click += MyMethod;
//cm.DropDownItems.Add(reader["technician"].ToString()).Click += (sender, e) => { MyMethod(sender, e); };
//cm.DropDownItems.Add(reader["technician"].ToString()).Click += (_sender, _e) =>
//{
// tech_id = Convert.ToInt32(reader[0]);
// //MessageBox.Show(tech_id.ToString());
//};
}
}
}
}
catch (Exception ex)
{
CMessageBox m = new CMessageBox("error\n" + ex);
m.ShowDialog();
}
finally
{
conn.Close();
}
}
}
我的点击事件代码
void MyMethod(object sender, EventArgs e)
{
// MessageBox.Show("test");
DialogResult dr = new DialogResult();
DialogueBox db = new DialogueBox("Are you sure you want to assign this Record!");
dr = db.ShowDialog();
if (dr == DialogResult.Yes)
{
assign_tech();
loadData();
loadTechnicianData();
}
}
我的分配技术代码
void assign_tech()
{
if (tech_id>0)
{
using (MySqlConnection conn = constrings.GetDBConnection())
{
try
{
conn.Open();
query = "UPDATE `tbl_job_order` SET `t_id` = @tech_id, status= 'Servicing' WHERE `tbl_job_order`.`j_id` = @id;";
using (MySqlCommand cmd = new MySqlCommand(query, conn))
{
cmd.Parameters.AddWithValue("@tech_id", tech_id);
cmd.Parameters.AddWithValue("@id", selected_id);
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
CMessageBox m = new CMessageBox("error \n" + ex);
m.ShowDialog();
}
finally
{
conn.Close();
}
}
}
}
ToolStripDropDownItem
从 ToolStripItem
继承了一个 Tag
属性 专门用于此目的。 Tag
是一个 object
属性,所以你可以给它分配任何你喜欢的东西。在 API 文档 (here) 中,他们使用它来保存字符串,但您可以在其中放入任何您喜欢的东西。
在您的 loadContext
方法中,在内循环中将新创建的 ToolStripDropDownItem
的 Tag
属性 设置为您的 tbl_technician
记录的 ID :
while (reader.Read())
{
ToolStripMenuItem cm = startToolStripMenuItem as ToolStripMenuItem;
var item = cm.DropDownItems.Add(reader["technician"].ToString());
item.Click += MyMethod;
item.Tag = Convert.ToInt32(reader[0]);
}
现在在您的处理程序中,您可以提取 ID 值并将其传递给 assign_tech
方法:
void MyMethod(object sender, EventArgs e)
{
// get tech id from sender's Tag
if (!(sender is TooStripDropDownItem item) || !(item.Tag is int tech_id))
return;
// MessageBox.Show("test");
DialogResult dr = new DialogResult();
DialogueBox db = new DialogueBox("Are you sure you want to assign this Record!");
dr = db.ShowDialog();
if (dr == DialogResult.Yes)
{
assign_tech(tech_id);
loadData();
loadTechnicianData();
}
}
如果您想更深入一点,可以将您的记录加载到适当的 class 实例中,并将该实例存储在 Tag
属性 中,以便您可以获得更多信息给你。