gpt4 book ai didi

winforms - 删除行时刷新 DataGridView 绑定(bind)到列表

转载 作者:行者123 更新时间:2023-12-03 18:24:46 25 4
gpt4 key购买 nike

我有一个 WinForm 应用程序,其中有多个绑定(bind)到 SortableBindingLists 的 DataGridView。

在某些情况下,我需要以编程方式从网格绑定(bind)到的列表中删除一个项目。

我似乎无法让 DGV 识别出它的数据已更改,或者具体来说,它的行数减少了。我正在调用 dataGridView1.Invalidate(),它正在重新绘制网格,但它尝试重新绘制与以前一样多的行,并引发一系列“索引不存在”的异常,每一列都有一个异常。

这是一个展示问题的简化代码示例:(只是一个带有 DGV 和一个按钮的 WinForm。)

    private List<Employee> list;
private void Form1_Load(object sender, EventArgs e)
{
list = new List<Employee>();
for (int ix = 0; ix < 3; ix++)
{
list.Add(ObjectMother.GetEmployee(ix+1));
}

dataGridView1.DataSource = list;
}

private void cmdDeleteARow_Click(object sender, EventArgs e)
{
list.Remove(list[0]);
dataGridView1.Invalidate();

}

在 ASP.NET 中,当使用 GridView 控件时,可以调用“DataBind()”方法来强制它刷新数据。 WinForms 中似乎没有任何这样的东西,或者我错过了什么?

最佳答案

为了获得 DataGridView了解对其 DataSource 的更改,源应实现IBindingList . List<T>没有,所以它不会广播它的变化,DataGridView不知道需要更新。

在这种情况下,一个简单的解决方法是放置 BindingSource在列表和 DataGridView 之间,然后调用Remove()代替它:

private List<Employee> list;
private BindingSource bindingSource;
private void Form1_Load(object sender, EventArgs e)
{
list = new List<Employee>();
for (int ix = 0; ix < 3; ix++)
{
list.Add(ObjectMother.GetEmployee(ix+1));
}

dataGridView1.DataSource = bindingSource;
bindingSource.DataSource = list;
}

private void cmdDeleteARow_Click(object sender, EventArgs e)
{
bindingSoruce.Remove(list[0]); // or, RemoveAt(0)

// Probably not necessary:
// dataGridView1.Invalidate();
}

或者,您可以使用 BindingList<T> 而不是 List<T> , 或创建您自己的列表类来实现 IBindingList .

关于winforms - 删除行时刷新 DataGridView 绑定(bind)到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1435479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com