gpt4 book ai didi

c# - 修改DataGridView绑定(bind)的大数据集需要很长时间?

转载 作者:行者123 更新时间:2023-11-30 15:35:47 25 4
gpt4 key购买 nike

我有一个自定义对象 (MyObject),它实现了 INotifyPropertyChanged 并具有三个属性(一个 int、一个 string 和一个 bool)。这是该对象的代码:

public class MyObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}

private int _Index;
public int Index
{
get { return _Index; }
set
{
if (_Index == value)
{
return;
}

_Index = value;
OnPropertyChanged(new PropertyChangedEventArgs("Index"));
}
}

private string _Name;
public string Name
{
get { return _Name; }
set
{
if (_Name == value)
{
return;
}

_Name = value;
_Modified = true;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}

private bool _Modified;
public bool Modified
{
get { return _Modified; }
set
{
if (_Modified == value)
{
return;
}

_Modified = value;
OnPropertyChanged(new PropertyChangedEventArgs("Modified"));
}
}

public MyObject()
{
}

public MyObject(int index, string number, bool modified)
{
Index = index;
Number = number;
Modified = modified;
}
}

长话短说,我将这些对象的 BindingList 连接到 DataGridView,如下所示:

BindingList<MyObject> myObjectList = new BindingList<MyObject>();
BindingSource bindingSourceForMyObjects = new BindingSource();

bindingSourceForMyObjects.DataSource = myObjectList;
dataGridViewMyObjects.DataSource = bindingSourceForMyObjects;

当我的应用程序运行时,myObjectList 将填充 100,000 个对象(从文件读取)并显示在我的 DataGridView 中。我在 DataGridView 中只有一列显示我的对象的字符串属性。我的用户可能想要选择 DataGridView 中的所有行并“删除”它们。我在术语 delete 周围使用引号,因为这些对象实际上并没有被删除,而是所有 100,000 个对象的字符串属性都设置为 string.Empty。现在,我使用以下代码执行该操作:

myObjectList.ToList().ForEach(c => c.Name = string.Empty);

此操作大约需要 55 秒才能完成。我也试过:

foreach (DataGridViewRow row in dataGridViewMyObjects.SelectedRows)
{
row.Cells["NAME"].Value = string.Empty;
}

这花费的时间略少,为 49 秒,但仍然是一个很长的操作。另外,我还为 bindingSourceForMyObjects 定义了一个 ListChanged 事件处理程序,如下所示:

private void bindingSourceForMyObjects_ListChanged(object sender, ListChangedEventArgs e)
{
if (e.ListChangedType == ListChangedType.ItemChanged)
{
dataGridViewMyObjects.Rows[e.NewIndex].DefaultCellStyle.BackColor = Color.Red;
dataGridViewMyObjects.Rows[e.NewIndex].DefaultCellStyle.ForeColor = Color.White;
}
}

如您所见,当我以编程方式更改我的基础对象列表时(就像我将它们全部设置为 string.Empty 时所做的那样),我使用它来直观地指示 DataGridView 中已更改的行).当我“删除”所有对象时,这确实会增加一些开销,但即使没有这个事件处理程序,它仍然是一个冗长的操作。

最后,我的 WinForms 应用程序目前是单线程的,但我正计划使用多线程代码来实现这一点。此操作可能是其中一种情况,但在我走那条路之前,是否还有其他我遗漏的东西(或者我不需要做的事情)会提高此操作的性能,所以它不会几乎需要一分钟才能完成?或者这只是处理 100,000 个对象的本质?

最佳答案

@User685869 感谢您发布扩展对象。

完成一些快速测试示例后,似乎是引发 PropertyChanged 事件导致速度变慢。对于我的电脑上的 10 万条记录,删除对它的调用将导致操作在一两秒内完成。

即使事件没有处理程序,也会发生这种情况。

我假设您已经根据需要实现了接口(interface);如果您不这样做,则将其删除将解决您的问题。

我可以建议的唯一解决方案是创建一个 boolean 变量,您可以将其设置为 true 以防止在进行批量更新时引发事件并在之后切换回正常状态。这样做的缺点当然是在执行批量操作时不会引发任何事件。

例如:-

我的对象

public boolean bulk = false;
public string Name
{
get { return _Name; }
set
{
if (_Name == value)
{
return;
}

_Name = value;
_Modified = true;
OnPropertyChanged(new PropertyChangedEventArgs("Name"));
}
}

家长代码

_bindingList.ToList().ForEach(c =>
{
c.bulk = true;
c.Name = string.Empty;
c.bulk = false;
});

关于c# - 修改DataGridView绑定(bind)的大数据集需要很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14484385/

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