gpt4 book ai didi

c# - 快速刷新的 DataGridView 中的按钮单击事件未持续触发

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:42 24 4
gpt4 key购买 nike

我有一个 WinForms 应用程序,我在其中使用 DataGridView 来显示一些快速变化的数据。我使用间隔为 50-100 毫秒的 System.Windows.Forms.Timer() 来限制 DataSource 的更新频率,从而限制 UI。我希望能够删除网格中的行,因此我添加了一个 DataGridViewButtonColumn,我通过 CellContentClick 事件处理它。问题是,由于相当“高”的更新频率,此事件不会持续触发。有时会着火,有时不会。有什么方法可以解决这个问题,我将按钮保留在网格中并仍然使用快速的 UI 更新速率(最大大约 100 毫秒)?

这是我的代码的精简版:

private IBindingList _bindingList = new BindingList<MyData>();
private BindingSource _bindingSource = new BindingSource(_bindingList, null);

private void Form1_Load(object sender, EventArgs e)
{
dataGridView.DataSource = _bindingSource;

var uiTimer = new System.Windows.Forms.Timer();
uiTimer.Interval = 100;
uiTimer.Tick += uiTimer_Tick;
uiTimer.Start();
}

private void uiTimer_Tick(object sender, EventArgs e)
{
// Get the underlying list of the binding source
var list = ((IList<MyData>)_bindingSource.List);

// Manipulate affected items in the bindinglist here...

// Update DataGridView
_bindingSource.ResetBindings(false);

}

private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var senderGrid = (DataGridView)sender;

if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
e.RowIndex >= 0)
{
MessageBox.Show("Button clicked!");
// Do remove stuff here...
}
}

最佳答案

一些想法...

  1. 代替 _bindingSource.ResetBindings(false);

也许使用 SuspendBinding/ResumeBinding 组合更有效

_bindingSource.SuspendBinding();
// affected items in the bindinglist here...
_bindingSource.ResumeBinding();

还要确保 _bindingList 没有在其他地方修改,而是在定时器事件中修改

  1. [首选] 使用 Reactive Extensions 而不是计时器来缓冲您的更新 http://www.introtorx.com/content/v1.0.10621.0/13_TimeShiftedSequences.html

关于c# - 快速刷新的 DataGridView 中的按钮单击事件未持续触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33210362/

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