我有一个DataGridView
和一个GroupBox
控件,其中包含一些ComboBoxes
根据{{1}}中选择的内容,网格中的元素会发生变化。
有没有办法说出来
ComboBoxes
(不为每个方框写一个If (Something Changes Within The GroupBox)
{
//Update the grid
}
事件)
我不想要更新部分的代码,我只需要一个事件或者我可以使用的东西来检查控件的值是否在OnSelectedIndexChange
内发生了变化。
有什么想法吗?
更新
好的,我想我没有以正确的方式解释它
忘掉GroupBox
。
假设我在ComboBox
中有一堆控件可以说:
只要其中一个控件的值发生变化,就创建一个事件。
答案 0 :(得分:9)
您可以将每个组合框SelectedIndexChanged事件连接到一个方法:
comboBox1.SelectedIndexChanged += new System.EventHandler(GroupBoxComboBoxChange);
comboBox2.SelectedIndexChanged += new System.EventHandler(GroupBoxComboBoxChange);
comboBox3.SelectedIndexChanged += new System.EventHandler(GroupBoxComboBoxChange);
comboBox4.SelectedIndexChanged += new System.EventHandler(GroupBoxComboBoxChange);
或使用LINQ为任何组合框选择更改设置事件处理程序:
GroupBox.Controls.OfType<ComboBox>.ForEach(cb => cb.SelectedIndexChanged += new System.EventHandler(GroupBoxComboBoxChange));
回答您的更新:您正在寻找ControlValueChanged()事件。我认为这里的问题是所有控件都不同。为ComboBox定义“ValueChanged”事件的内容对于TextBox来说不一定相同。这将是一个语义挑战,并不是很清楚。希望这是有道理的。
答案 1 :(得分:2)
GroupBoxes通常只是装饰性的,除非他们管理单选按钮或复选框,因此期望他们了解对组合框所做的更改并不是一件容易的事情。如果可以,为什么不编写一个方法来执行您想要它做的事情,然后从所有组合框的SelectedIndexChanged事件中调用该方法?
答案 2 :(得分:2)
GroupBoxes没有“改变我的内容”,但你可以像这样“欺骗”和DYI(它只是一个概念验证,没有错误检查和排序):
// In a new Windows Forms Application, drop a GroupBox with a ComboBox and a CheckBox inside
// Then drop a TextBox outside the ComboBox. Then copy-paste.
// this goes somewhere in your project
public static class handlerClass
{
public static string ControlChanged(Control whatChanged)
{
return whatChanged.Name;
}
}
// And then you go like this in the Load event of the GroupBox container
void Form1_Load(object sender, EventArgs args)
{
foreach (Control c in groupBox1.Controls)
{
if (c is ComboBox)
(c as ComboBox).SelectedValueChanged += (s, e) => { textBox1.Text = handlerClass.Handle(c); };
if (c is CheckBox)
(c as CheckBox).CheckedChanged += (s, e) => { textBox1.Text = handlerClass.Handle(c); }; }
}
}
由于每个Control
都有自己的“我改变了!”这种事件,我认为它不会像样板那么短。行为仅仅是一个示例,用于写入在ComboBox中更改的控件的名称