我知道我可以始终为文本框等使用TextChanged事件,但这需要多个事件编码。我想使用一个特定的事件处理程序,它检测与我的BindingSource相关联的任何字段中的值的更改。
我已经像这样绑定了我的列:
textbox1.DataBindings.Add("Text", this.bindingSource1, "dbcolumn_1", true);
textbox1.DataBindings.Add("Text", this.bindingSource1, "dbcolumn_1", true);
这样的东西可行吗?
在表单中定义一个changedFlag变量,初始值为false。
private changedFlag = false; // 表单值已更改,在关闭表单时检查
将以下代码放入退出按钮的事件处理程序中,或者调整为表单关闭处理程序:
if (this.changedFlag && MessageBox.Show("保存更改后再退出吗?", "保存更改?", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
this.Save();
}
创建一个函数,该函数接受一个控件容器并递归地查找其控件以连接更改处理程序(在步骤4中定义)。
private void AddOnChangeHandlerToInputControls(Control ctrl)
{
foreach (Control subctrl in ctrl.Controls)
{
if (subctrl is TextBox)
{
((TextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is CheckBox)
{
((CheckBox)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is RadioButton)
{
((RadioButton)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is ListBox)
{
((ListBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is ComboBox)
{
((ComboBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange);
}
else
{
if (subctrl.Controls.Count > 0)
{
this.AddOnChangeHandlerToInputControls(subctrl);
}
}
}
}
创建一个通用的更改处理程序函数,将changedFlag设置为true。
private void InputControls_OnChange(object sender, EventArgs e)
{
this.changedFlag = true;
}
一旦您的控件构建完成(不确定是否动态生成,但您在示例中使用了textbox1
,因此我假设没有),请从步骤3调用该函数并传入输入的容器控件。
AddOnChangeHandlerToInputControls(panelFormContainer);
changedFlag = false;
。nothingIsNecessary的答案非常接近,但我仍然需要查找一下才能使其正常工作。
问题在于
AddOnChangeHandlerToInputControls(panelFormContainer);
应该是
AddOnChangeHandlerToInputControls(this);
panelFormContainer不起作用,我也找不到相关文档。
另外,根据需要,我还添加了更多的控件类型。
对于日期选择器,我使用了MouseCaptureChanged,因为复选框有时会触发ValueChanged事件,有时却不会。¯_(ツ)_/¯
private void AddOnChangeHandlerToInputControls(Control ctrl)
{
foreach (Control subctrl in ctrl.Controls)
{
if (subctrl is TextBox)
{
((TextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is CheckBox)
{
((CheckBox)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is RadioButton)
{
((RadioButton)subctrl).CheckedChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is ListBox)
{
((ListBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is ComboBox)
{
((ComboBox)subctrl).SelectedIndexChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is MaskedTextBox)
{
((MaskedTextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is DateTimePicker)
{
((DateTimePicker)subctrl).MouseCaptureChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is RichTextBox)
{
((RichTextBox)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else if (subctrl is NumericUpDown)
{
((NumericUpDown)subctrl).TextChanged += new EventHandler(InputControls_OnChange);
}
else
{
if (subctrl.Controls.Count > 0)
{
this.AddOnChangeHandlerToInputControls(subctrl);
}
}
}
}
定义 on_closing 事件处理程序; http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.onclosing.aspx
在此处理程序内启动一个窗体,询问用户是否要保存并以对话框形式打开它,以便将焦点强制放在该窗体上(链接中的示例代码展示了如何完成所有这些操作)。