提问人:kevin rowe 提问时间:1/6/2023 最后编辑:Rand Randomkevin rowe 更新时间:1/7/2023 访问量:86
在绑定的文本框、组合框和复选框中放置检测用户更改的代码的位置
where to put code detecting user changes in bound textboxes, comboboxes and checkboxes
问:
我正在尝试学习 c# 表单并构建一个简单的表格编辑器应用程序。 我已经创建了所有控件、一个 BindingNavigator、一个 BindingSource 和一个 DataSet。 大多数控件都是文本框到文本字段,因此绑定没有大问题。 我必须创建格式化和解析函数并将它们绑定到复选框和下拉框控件,但这工作正常。 当用户更改控件时,我需要使控件激活保存和取消按钮,但是 我尝试连接的任何事件都会被最初加载或绑定的数据触发。
我尝试过在绑定完成事件和项目更改事件中进行标记,但它们似乎在表单上的加载完成之前就被触发了。
我应该在哪里放置代码来说明此记录已加载,并且对控件的任何更改现在都是用户交互?
如果bindingsource.current为null,我尝试检查textbox_changed事件。 如果 LoadData() 函数,我尝试在最后设置一个标志。 我尝试在bindingsource bindingcomplete事件中设置标志。
这些都无法让我有效地检测显示第一条(或下一条)记录的表单何时有效地准备好供用户开始编辑。
我已经查看了表单、bindingnavigator、bindingsource 和 dataset 的事件,但看不到一个明显的地方来检测“我现在已经完成了使用此记录的加载和格式化”我查看了在线教程,但它们都显示了如何实现绑定而不是设置编辑。
答:
由于您使用的是 DataTable,因此可以处理 DataTable.ColumnChanged 事件并在那里启用保存按钮。
该事件在列的值更改后引发,默认情况下,该值在验证控件属性 (DataSourceUpdateMode.OnValidation) 后发生,具体取决于控件的数据绑定设置;如果要立即引发事件,甚至在离开和验证控件之前,请使用代码或设计器将其更改为 DataSourceUpdateMode.OnValidation。
例
假设您有一个按钮 (button1) 和两个文本框控件(textBox1 和 textBox2),请将窗体的代码修改为以下内容,以查看在通过文本框控件修改其中一列后如何启用 button1:
public partial class Form1 : Form
{
DataTable dt = new DataTable();
public Form1()
{
InitializeComponent();
dt.Columns.Add("C1", typeof(int));
dt.Columns.Add("C2", typeof(string));
textBox1.DataBindings.Add("Text", dt, "C1",
true, DataSourceUpdateMode.OnPropertyChanged);
textBox2.DataBindings.Add("Text", dt, "C2",
true, DataSourceUpdateMode.OnPropertyChanged);
}
private void Form1_Load(object sender, EventArgs e)
{
dt.Rows.Add(1, "One");
dt.Rows.Add(2, "Two");
dt.AcceptChanges();
button1.Enabled = false;
dt.ColumnChanged += Dt_ColumnChanged;
}
private void Dt_ColumnChanged(object sender, DataColumnChangeEventArgs e)
{
button1.Enabled = true;
}
}
阅读更多
评论