【问题标题】:C# dynamically generate button for single event handlerC#为单个事件处理程序动态生成按钮
【发布时间】:2018-11-23 11:43:55
【问题描述】:

我需要为多个按钮使用单个事件处理程序。我根据数据库查询通过while循环生成了这些按钮。我创建了一个方法

void MyButtonClick(object sender, EventArgs e)
{ 
}

我是 C# 新手。如何将所有按钮的事件绑定到单个处理程序。

生成按钮的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {         
        try
        {
            MydbConnection db = new MydbConnection();
            MySqlConnection con = db.connection();
            MySqlCommand cmd = new MySqlCommand();

            cmd.CommandText = "select * from categories where online = 1";
            cmd.Connection = con;

            MySqlDataReader rd;
            con.Open();
            rd = cmd.ExecuteReader();

            int i = 1;
            while (rd.Read())
            {
                Button btn = new Button();
                btn.Name = "btn-" + i.ToString();
                btn.Tag = i;
                btn.Text = rd.GetString(2).ToString();

                btn.Height = 60;
                btn.Width = 100;
                btn.Location = new Point(900, 60 * i + 10);

                this.Controls.Add(btn);
                i++;
            }
        }
        catch (Exception ex) 
        {
            MessageBox.Show(ex.Message);
        }
    }
}

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    欢迎来到 SO。你可以在this.Controls.Add(btn);之前添加这个

    btn.Click += MyButtonClick;
    

    【讨论】:

    • 如何将btn.name 设置为MyButtonClick()..请
    • 您无法设置名称。因为它是只读的。我怀疑您需要获取名称,才能知道单击了哪个按钮?如果是这种情况,您可以像这样转换 sender 对象:var btn = (Button)sender 并且不要忘记检查 null。
    【解决方案2】:

    您需要将它们的所有 CLICK 属性设置为同一个事件处理程序:

    btn.Click += new EventHandler(MyButtonClick);

    这应该使得任何时候您单击任何按钮时,MyButtonClick() 都会触发事件。当然,如果您需要确定单击了哪个按钮,则需要检查事件中的sender 参数,其中“i”是您在循环中分配给按钮的数值之一:

    (if sender == btn-i) then ....   
    

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2018-12-20
      相关资源
      最近更新 更多