我有一个TextBox
,ComboBox
和CheckBox
的表单,这些表单是从函数填充的(例如textbox.text = "newValue";
)。
private void updateIdentite(Contact c, Dal dal)
{
Identite id = dal.GetIdentite(c);
if (id != null)
{
idCivilite.SelectedValue = id.type_civilite;//example of a ComboBox
...
idNom.Text = id.pers_nom;//example of a TextBox
...
idAi.IsChecked = (id.cont_drap_ai == "1");//example of a CheckBox
...
}
}
我需要在用户手动编辑项目时捕获事件,但使用TextChanged
,SelectionChanged
或Checked
时,表单填充时也会触发这些事件上一个功能。
foreach (object item in identiteGrid.Children)
{
TextBox tb = item as TextBox;
if (tb != null)
{
tb.TextChanged += new TextChangedEventHandler(idTextBox_TextChanged);
continue;
}
ComboBox droplist = item as ComboBox;
if (droplist != null)
{
droplist.SelectionChanged += new SelectionChangedEventHandler(idCombobox_SelectionChanged);
continue;
}
CheckBox cb = item as CheckBox;
if (cb != null)
{
cb.Checked += new RoutedEventHandler(idCheckbox_Checked);
continue;
}
}
有没有办法捕获这些控件的“onInput”事件?
由于
答案 0 :(得分:1)
考虑使用:Control.OnKeyDown
方法。
为了让用户输入 ,他必须专注于控件并点击一些键。
此外,如果您想完全覆盖,您还可以在控件上挂钩Control.MouseClick
事件......
详细了解这些事件。
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.onkeydown(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.mouseclick(v=vs.110).aspx
答案 1 :(得分:1)
您可以连接事件处理程序,即执行foreach循环, 之后设置初始值。
或者您可以在以编程方式设置值之前暂时取消挂起事件处理程序:
private void updateIdentite(Contact c, Dal dal)
{
Identite id = dal.GetIdentite(c);
if (id != null)
{
idCivilite.SelectionChanged -= idCombobox_SelectionChanged;
idCivilite.SelectedValue = id.type_civilite;//example of a ComboBox
idCivilite.SelectionChanged += idCombobox_SelectionChanged;
tb.TextChanged -= idTextBox_TextChanged;
idNom.Text = id.pers_nom;//example of a TextBox
tb.TextChanged += idTextBox_TextChanged;
idAi.Checked -= idCheckbox_Checked;
idAi.IsChecked = (id.cont_drap_ai == "1");//example of a CheckBox
idAi.Checked += idCheckbox_Checked;
}
}
或者您可以使用布尔标志来防止事件处理程序中的代码在特定情况下运行:
private bool handleSelectionChanged = true;
private void updateIdentite(Contact c, Dal dal)
{
...
handleSelectionChanged = false;
idCivilite.SelectedValue = id.type_civilite;//example of a ComboBox
handleSelectionChanged = true;
...
}
private void idCombobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!handleSelectionChanged)
return;
//your code...
}