Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在筛选器处于活动状态时保存绑定DataGridView中的更改_C#_Winforms_Datatable_Datagridview_Bindingsource - Fatal编程技术网

C# 在筛选器处于活动状态时保存绑定DataGridView中的更改

C# 在筛选器处于活动状态时保存绑定DataGridView中的更改,c#,winforms,datatable,datagridview,bindingsource,C#,Winforms,Datatable,Datagridview,Bindingsource,我有一个DataGridView,它由BindingSource填充。每次用户修改一行并移动到另一行时(每次修改的行失去焦点时),它都会触发事件RowValidated 在这种情况下,DataGridView.CurrentRow的元素在SQLServer中使用存储过程进行修改 当BindingSource的筛选器处于活动状态时,这种方法不会。因为if修改了被过滤的列的单元格,所以行dissapers(因为过滤器)和我的方法将DataGridView.CurrentRow捕获为下一个 我无法使用

我有一个DataGridView,它由BindingSource填充。每次用户修改一行并移动到另一行时(每次修改的行失去焦点时),它都会触发事件
RowValidated

在这种情况下,
DataGridView.CurrentRow
的元素在SQLServer中使用存储过程进行修改

当BindingSource的筛选器处于活动状态时,这种方法不会。因为if修改了被过滤的列的单元格,所以行dissapers(因为过滤器)和我的方法将
DataGridView.CurrentRow
捕获为下一个

我无法使用方法
TableAdapter.Update()
,因为数据集是多个表的联接,并且不会自动生成

是否有任何事件在过滤器生效前触发? 我会接受任何不同的方法作为答案

编辑:修改单元格时,该行的ID值保存在列表中。
RowValidated
中的代码封装在

if(ListOfIds.Contains(DataGridView.CurrentRow.Cells[“ID”]){StoredProcedure();}

自己读写单元格的值很少是个好主意。使用数据绑定通常是一种更简单的方法

看起来您已经使用了BindingSource,但由于某种原因,您从显示的数据中读取了更改的行,而不是从原始BindingSource中读取

我不确定在操作员移动到新行时立即更新数据库是否明智。如果他不知道要填写的值,想向下滚动查看另一行,该怎么办?考虑更改接口,这样操作员可以指示他完成了对所有数据的编辑。比如一个按钮。但这有点超出了你的问题范围

如果将数据放在中,并将此数据分配给DataGridView的数据源,则DataGridView中数据的每次更改都会在BindingList中自动更新。使用事件获取通知,或在处理更改的数据之前使用上述按钮

BindingList<Customer> DisplayedCustomers {get; } = new BindingList<Customer>();

public MyForm()
{
    this.InitializeComponents();

    this.DataGridView1.DataSource = this.DisplayedCustomers();
    this.BindingListView.ListChanged += BindingListChanged;
}

你能给我们看一下相关的代码吗?我看问题是一般性的。您希望看到什么代码?不要使用
RowValidated
事件保存数据。因为它甚至会在你将焦点移过行的时候触发。非常感谢你详细的回答。我正在实习,这让我有了一个清晰的视角。在设计你的软件时,一定要把数据和数据的显示方式分开。这使得在没有用户界面的情况下更容易对数据进行单元测试。如果要更改数据的显示方式,则不必更改内部模型、填充方式和保存方式。模型和视图的分离还有一个效果,即内部模型中的微小变化并不意味着显示中的重大变化。考虑读取关于模型-视图-视图模型的背景信息
private InitializeDataGridView()
{
    IEnumerable<Customer> customers = this.QueryCustomers();
    foreach (var customer in Customers)
        this.Customers.Add(customer);
}
private void BindingListChanged(object sender, ListChangedEventArgs e)
{
     BindingList<Customer> bindingList = (BindingList<Customer>)sender;
     // use e.ListChangedType to detect what has changed:
     // item added / removed / moved to a new location / value changed?

     switch (e.ListChangedType)
     {
         case ListChangedType.ItemChanged:
             var changedCustomer = bindingList[e.NewIndex];
             ProcessChangedCustomer(changeCustomer);
             break;
         case ...
    }
}
List<Customer> customers = GetCustomers();
BindingListView<Customer> view = new BindingListView<Customer>(customers);
dataGridView1.DataSource = view;
void FilerCustomersByCity(string city)
{
    view.ApplyFilter(delegate(Customer) customer => customer.City == city);
}