获取多个控件并更改属性

3

好的,我的请求有点复杂需要解释一下。当我点击一个按钮时,它会执行以下操作:

peopleNum = 0;
topPosition = 10;
public void submitStudent(string name)
    {
        peopleNum++;
        topPosition += 25;

            ComboBox people_comboBox = new ComboBox();
            people_comboBox.Name = "people_comboBox" + peopleNum;
            //ComboBox people_label_finder = this.Controls.Find("people_comboBox" + peopleNum, true).FirstOrDefault as ComboBox;
            people_comboBox.Left = 150;
            people_comboBox.Top = topPosition;

            string[] people_comboBox_itemList = new string[3];
            people_comboBox_itemList[0] = "Present";
            people_comboBox_itemList[1] = "Late";
            people_comboBox_itemList[2] = "Absent";

            people_comboBox.DataSource = people_comboBox_itemList;
            people_comboBox.MouseEnter += new EventHandler(people_comboBox_enter);
            people_comboBox.MouseLeave += new EventHandler(people_comboBox_leave);

        this.Controls.Add(people_comboBox);
    }

接下来是"people_comboBox_enter"和"people_comboBox_leave"函数的代码:

private void people_comboBox_enter(object sender, EventArgs e)
        {
            ComboBox people_comboBox = this.Controls["people_comboBox" + peopleNum] as ComboBox;
            if (people_comboBox != null)
            {
                people_comboBox.BackColor = Color.Red;
            }
        }

        private void people_comboBox_leave(object sender, EventArgs e)
        {
            ComboBox people_comboBox = this.Controls["people_comboBox" + peopleNum] as ComboBox;
            if (people_comboBox != null)
            {
                people_comboBox.BackColor = Color.White;
            }
        }

我希望当鼠标悬停在组合框上时,它会变成红色,当鼠标离开时它会恢复白色。但实际结果是,当有多个组合框时,只有最后一个发生了变化。我该怎么做才能达到预期效果呢?非常感谢。

顺便提一下:通常人们在对迭代变量进行闭包时会遇到这个问题,但你明确编码了它 - 将最后一个 peopleNum 存储在成员变量中,然后惊讶地发现它实际上是最后一个... - Alexei Levenkov
1个回答

4
不要费心使用 this.Controls。触发事件的控件已经在 sender 中了。
在你的“enter”和“leave”事件中尝试这个:
var people_comboBox = sender as ComboBox;

使用当前的方法,每次单击 submitStudent 按钮时,peopleNum 都会增加。因此,如果您单击3次,您基本上会每次运行以下代码:

ComboBox people_comboBox = this.Controls["people_comboBox2"] as ComboBox;

+1,如果进行空值检查会更好。因为如果事件处理程序是手动触发的,sender 可能是不同类型或为空。虽然这种情况不太可能,但仍有可能发生。 - Selman Genç

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接