winforms 在绑定文本框、组合框和复选框中放置用于检测用户更改的代码的位置

2exbekwf  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(72)

我正在尝试学习c#表单,并建立了一个简单的表格编辑器应用程序。我已经创建了所有的控件,一个bindingnavigator,一个bindingsource和一个数据集。大多数控件是文本框到文本字段,所以没有大问题绑定。我必须创建格式和解析函数,并将它们绑定到复选框和下拉框控件,但这是工作正常。我需要使控件激活一个保存和取消按钮时,用户已经改变了他们,但任何事件,我试图underwire得到激发的数据是最初加载或绑定。
我试过在bindingcomplete事件和item changed事件中添加标记,但是它们似乎在表单加载完成之前就被触发了。
我应该在哪里放置代码来声明此记录已加载,并且对控件的任何更改现在都是用户交互?
如果bindingsource.current为null,我尝试检查textbox_changed事件。如果LoadData()函数为end,我尝试设置标志。我尝试在bindingsource bindingcomplete事件中设置标志。
所有这些都不允许我有效地检测包含要显示的第一条(或下一条)记录的表单何时可以有效地供用户开始编辑。
我已经查看了表单、bindingnavigator、bindingsource和dataset的事件,但没有发现明显的地方可以检测到“我现在已经完成了对该记录的加载和格式化”。我查看了在线教程,但它们都显示了如何实现绑定,但没有设置编辑。

guicsvcw

guicsvcw1#

由于您使用的是DataTable,因此可以处理DataTable.ColumnChanged事件并在那里启用保存按钮。
该事件在列的值更改后引发,根据控件的数据绑定设置,默认情况下在验证控件属性(DataSourceUpdateMode.OnValidation)后引发;如果要立即引发事件(甚至在离开和验证控件之前),请使用代码或设计器将其更改为DataSourceUpdateMode.OnValidation。

    • 示例**

假设您有一个按钮(button1)和两个文本框控件(textBox1和textBox2),请将窗体的代码修改为以下代码,以查看在通过textbox控件修改其中一列后如何启用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;
    }
}

相关问题