在动态点击事件中传递变量/ ID(上下文菜单)

时间:2019-09-10 01:31:30

标签: c# contextmenu

如何在上下文菜单的动态循环中将变量或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();
                }
            }
        }          
    }

1 个答案:

答案 0 :(得分:1)

ToolStripDropDownItem专门从Tag继承ToolStripItem属性。 Tagobject的属性,因此您可以为其分配任何所需的内容。在API文档(here)中,他们使用它来保存字符串,但是您可以在其中放置任何喜欢的东西。

在内部循环的loadContext方法中,将新创建的Tag的{​​{1}}属性设置为ToolStripDropDownItem记录的ID:

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]); } 方法:

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(); } } 属性中,以便可以使用更多信息。

相关问题