【问题标题】:Adding Event Handler for Dynamically Created to window Form将动态创建的事件处理程序添加到窗口窗体
【发布时间】:2014-07-11 18:11:36
【问题描述】:

我有一个创建复选框列表的窗口窗体。创建的复选框数量取决于从数据库返回的项目数。我已经能够创建复选框;但是,我不确定如何为这些复选框添加事件处理程序。例如,我想添加一个 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]);
            }

        }

【问题讨论】:

    标签: c# asp.net window


    【解决方案1】:
    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 }
    

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

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

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

    【讨论】:

    • @Chris....谢谢。至于我设置复选框位置的方式,有没有更好或更有效的方法。
    • 我不知道在哪里问这个问题,所以我将在这里作为评论提出。当我不确定如何使用控件时,学习如何使用它的最佳方法是什么?例如,我阅读了微软在 system.windows.forms.checkbox 上发布的一些文档,但我并没有完全理解我在阅读的内容。
    • 对于动态创建的对象,您必须手动设置位置,因此您的代码看起来不错。 Microsoft 文档的末尾通常有示例,请尝试从这些示例中学习不同控件的不同属性。
    【解决方案2】:
            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());
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2018-04-23
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多