【问题标题】:Getting multiple controls and changing propertys获取多个控件并更改属性
【发布时间】:2014-03-11 02:04:51
【问题描述】:

好的,所以我的请求解释起来有点复杂。我有一个按钮,单击时会执行以下操作:

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 存储在成员变量中,然后惊讶于它实际上是最后一个...

标签: c# winforms controls


【解决方案1】:

不要打扰使用this.Controls。触发事件的控件已经在sender

在你的“进入”和“离开”事件中试试这个:

var people_comboBox = sender as ComboBox;

使用您当前的方法,每次单击 submitStudent 按钮时,peopleNum 都会递增。所以如果你点击它3次,你基本上每次都在运行这段代码:

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

【讨论】:

  • +1 使用空检查会更好。因为如果手动触发事件处理程序,sender 可能是不同的类型或 null。这不太可能但可能。
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多