C# 当绑定控件更改值时更新数据集

C# 当绑定控件更改值时更新数据集,c#,winforms,data-binding,C#,Winforms,Data Binding,我将控件绑定到如下数据集: txt.DataBindings.Add("Text", ds, true, DataSourceUpdateMode.OnPropertyChanged); 然后,我为这样的更改添加侦听器 private void attatchChangeListeners(DataSet ds) { foreach (DataTable dt in ds.Tables) { dt.

我将控件绑定到如下数据集:

txt.DataBindings.Add("Text", ds, true, DataSourceUpdateMode.OnPropertyChanged);
然后,我为这样的更改添加侦听器

private void attatchChangeListeners(DataSet ds)
        {
            foreach (DataTable dt in ds.Tables)
            {
                dt.RowChanged += new DataRowChangeEventHandler(dt_RowChanged);
                dt.RowDeleted += new DataRowChangeEventHandler(dt_RowDeleted);
                dt.TableNewRow += new DataTableNewRowEventHandler(dt_TableNewRow);
            }

        }

        void dt_TableNewRow(object sender, DataTableNewRowEventArgs e)
        {
            if (!View.Dirty)
            {
                View.Dirty = true;
            }
        }

        void dt_RowDeleted(object sender, DataRowChangeEventArgs e)
        {
            if (!View.Dirty)
            {
                View.Dirty = true;
            }
        }

        void dt_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            if (!View.Dirty)
            {
                View.Dirty = true;
            }
        }
但当我在表单中更改textbox中的值时,我不会得到事件

我必须在所有行上调用endEdit才能触发事件

我是否误解了数据绑定,或者我做了其他错误的事情?

是的,在“误解”:-

数据绑定可以被认为是UI对象和DataSouce(通常是DataSet中的DataTable)之间的中间层。要使UI中的更改在底层数据源中生效,必须调用BindingSource的EndEdit。同样,如果您决定不这样做,则始终可以使用“CancelEdit”取消更改(即,如果您希望恢复UI所做的更改以获取数据源的值)。您可能需要将BindingSource的连接到您的需求中。

在“误解”处选择“是”:-”


数据绑定可以被认为是UI对象和DataSouce(通常是DataSet中的DataTable)之间的中间层。要使UI中的更改在底层数据源中生效,必须调用BindingSource的EndEdit。同样,如果您决定不这样做,则始终可以使用“CancelEdit”取消更改(即,如果您希望恢复UI所做的更改以获取数据源的值)。您可能希望连接BindingSource的链接以满足您的需求。

我试图做的是检测页面是否“脏”。我可以在文本框上的TextCanged事件上触发此事件吗?我需要为控件获取bindingsource,对吗?不,您可以让EndEdit按原样进行。然后用UI值更新底层数据源。此时,您可以检查DataSource的HasChanges()方法(假设您的DataSource是一个DataSet)。我可以在文本框上的TextCanged事件上触发此事件吗?我需要为控件获取bindingsource,对吗?不,您可以让EndEdit按原样进行。然后用UI值更新底层数据源。此时,您可以检查DataSource的HasChanges()方法(假设您的DataSource是一个DataSet)。