gpt4 book ai didi

c# - 控制从数据 GridView 中删除项目的执行速度

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:04 26 4
gpt4 key购买 nike

大家好,我有一个包含大约 10 个项目的数据 GridView 。我想从网格中删除特定项目。现在,虽然我设法做到了这一点,但我还想控制删除每个项目的执行速度,即我希望它足够慢,以便用户看到每个项目被删除。我试过像这样在每次迭代中停止线程

for (int i = dataGridView1.Rows.Count - 1; i <= 0; i--){
if (dataGridView.Rows[i] == null){
continue;
}

if (dataGridView.Rows[i].Cells[3].Value.ToString().Contains("Remove")){

// stop the thread
System.Threading.Thread.Sleep(900);
dataGridView1.Rows.RemoveAt(i);
}
}

虽然此代码确实会删除项目,但它仍然很快,并且会立即删除所有匹配的项目。我尝试使用计时器,但运气不好,是否可以实现此目的?

最佳答案

问题的可能原因:

我认为这里的问题是您的 for 循环永远不会离开,直到所有 行都被删除。也就是说,您的程序永远不会给 GUI(Winforms?)一个 self 更新的机会,直到所有行都被删除。

这就是为什么您的 Thread.Sleep 一个接一个地发生(您仍在循环中),并且在它们之间安排要删除的行。一旦循环结束,您的 GUI 就有机会 self 更新。它看到计划删除的几行并立即将它们全部删除。

可能的解决方案:

您可以做的是创建一个后台任务,处理要删除的行队列。后台任务等待一段指定的时间,然后删除队列。在此步骤中,您必须使用类似 dataGridView1.Invoke(...) 的方式在 UI 线程上回调。

最后,您修改向我们展示的循环,以便在第一步中填充队列;循环后,启动后台任务。

示例代码:

我将尝试展示一些临时示例代码。请注意,这可能无法开箱即用,我还没有彻底检查它的正确性。

// the queue of rows that need to be deleted:
var rowsToDelete = new List<DataGridViewRow>();

// fill the queue:
foreach (var row in dataGridView.Rows)
{
if (removeCriteriaMetBy(row) == true)
{
rowsToDelete.Add(row);
}
}

// work off the queue:
var queueWorker = new BackgroundWorker();
queueWorker.DoWork += (sender, e) =>
{
foreach (var row in rowsToDelete)
{
// sleep per item:
Thread.Sleep(900);
// call back on the UI thread in order to modify the GUI control:
dataGridView.Invoke(new Action( () =>
{
dataGridView.Rows.Remove(row);
}));
}
};
queueWorker.RunWorkerAsync();

这应该有效,因为您的行删除循环在后台运行,即。与 UI 线程并行。这意味着 UI 线程不必等待您的删除循环完成。每当计划删除一行时,UI 线程都可以并行响应。 (对 dataGridView.Invoke(someAction) 的调用本质上是在 UI 线程的消息队列中放置一条消息,内容为“执行此工作 (someAction)。”)

关于c# - 控制从数据 GridView 中删除项目的执行速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4698886/

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