为窗口窗体添加动态创建的事件处理程序

本文关键字:事件处理 程序 创建 动态 窗口 窗体 添加 | 更新日期: 2023-09-27 18:12:27

我有一个窗口窗体,我正在创建一个复选框列表。所创建的复选框的数量取决于从数据库返回的项的数量。我已经能够创建复选框;但是,我不确定如何为这些复选框添加事件处理程序。例如,我想添加一个OnCheckedChanged或CheckStateChanged事件。我如何添加这些事件?另外,如果有其他建议,我也很感激。我对编程完全是个新手。

private void Form1_Load(object sender, EventArgs e)
        {
            CheckBoxes = new CheckBox[listGroup.Count()];
            for (int i = 0; i < listGroup.Count(); i++)
            {
                CheckBoxes[i] = new CheckBox();
                CheckBoxes[i].Text = listGroup.ElementAt(i).GroupName;
                CheckBoxes[i].Name = "txt" + listGroup.ElementAt(i).GroupName.Replace(' ', '_');
                CheckBoxes[i].CheckedChanged += new EventHandler(CheckBoxes[i]+"_CheckedChanged");
                CheckBoxes[i].Width = 200;
                if (i == 0)
                {
                    CheckBoxes[i].Location = new System.Drawing.Point(5, 10);
                }
                else if (i == 1)
                {
                    CheckBoxes[i].Location = new System.Drawing.Point(5, 40);
                }
                else if (i == 2)
                {
                    CheckBoxes[i].Location = new System.Drawing.Point(5, 80);
                }
                this.Controls.Add(CheckBoxes[i]);
            }
        }

为窗口窗体添加动态创建的事件处理程序

private void Form1_Load(object sender, EventArgs e)
{
    //...
    CheckBoxes[i].CheckedChanged += checkBoxes_CheckedChanged;
    CheckBoxes[i].CheckStateChanged += checkBoxes_CheckStateChanged;
}
void checkBoxes_CheckedChanged(object sender, EventArgs e)
{ //do stuff when checked changed }
void checkBoxes_CheckStateChanged(object sender, EventArgs e)
{ //do stuff when check state changed }

注意:这将为您的所有复选框提供相同的事件处理。如果你想为不同的文本框做不同的事情,你必须以不同的方式命名eventandler并定义该eventandler。

设置复选框位置的更有效方法

    for (int i = 0; i < listGroup.Count(); i++)
    {
        CheckBoxes[i] = new CheckBox();
        CheckBoxes[i].Text = listGroup.ElementAt(i).GroupName;
        CheckBoxes[i].Name = "txt" + listGroup.ElementAt(i).GroupName.Replace(' ', '_');
        CheckBoxes[i].CheckedChanged += new EventHandler(CheckBoxes[i] + "_CheckedChanged");
        CheckBoxes[i].Width = 200;
        //set location based on index of i
        CheckBoxes[i].Location = new System.Drawing.Point(5, 10 + (i * 30));
        this.Controls.Add(CheckBoxes[i]);
    }
        private void LoadNewCheckboxes()
    {
        dynamic listGroupCount = 10;
        List<System.Windows.Forms.CheckBox> CheckBoxes = new List<System.Windows.Forms.CheckBox>();
        for (int i = 0; i <= listGroupCount - 1; i++)
        {
            System.Windows.Forms.CheckBox chkbox = new System.Windows.Forms.CheckBox();
            chkbox.Text = i.ToString();
            //listGroup.ElementAt(i).GroupName
            chkbox.Name = "txt" + i.ToString();
            //listGroup.ElementAt(i).GroupName.Replace(" "c, "_"c)
            chkbox.CheckedChanged += new EventHandler(chkbox_CheckedChanged);
            chkbox.CheckStateChanged += new EventHandler(chkbox_CheckStateChanged);
            chkbox.Width = 200;
            chkbox.AutoSize = true;
            this.Controls.Add(chkbox);
            CheckBoxes.Add(chkbox);
            if (i == 0)
            {
                chkbox.Location = new System.Drawing.Point(5, 10);
            }
            else
            {
                chkbox.Location = new System.Drawing.Point(5, (CheckBoxes[i - 1].Top + CheckBoxes[i - 1].Height + 10));
            }
        }
    }
    private void chkbox_CheckedChanged(object sender, EventArgs e)
    {
        System.Windows.Forms.CheckBox chkbox = (System.Windows.Forms.CheckBox)sender;
        if (chkbox != null)
        {
            //do somthing
            Debug.WriteLine("chkbox_CheckedChanged");
            Debug.WriteLine(chkbox.Text);
            Debug.WriteLine(chkbox.Checked.ToString());
            Debug.WriteLine(chkbox.Name.ToString());
        }
    }
    private void chkbox_CheckStateChanged(object sender, EventArgs e)
    {
        System.Windows.Forms.CheckBox chkbox = (System.Windows.Forms.CheckBox)sender;
        if (chkbox != null)
        {
            //do somthing
            Debug.WriteLine("chkbox_CheckStateChanged");
            Debug.WriteLine(chkbox.Text);
            Debug.WriteLine(chkbox.Checked.ToString());
            Debug.WriteLine(chkbox.Name.ToString());
        }
    }