【发布时间】:2014-06-05 11:46:25
【问题描述】:
在我设置的构造函数中:
dataGridView1.ScrollBars = ScrollBars.Both;
然后,我在 dataGridView1 中添加了行,我从计时器事件中调用此方法,然后清除项目并每 5 秒再次添加。问题是当我将右侧的滚动条向下拖动以查看其他进程时,它会自动将滚动条向上移动。
在 Windows 任务管理器中它没有这样做。我可以向下滚动,它会不断更新它。
这是从计时器滴答事件开始每 5 秒调用一次的方法:
void PopulateApplications()
{
dataGridView1.Rows.Clear();
foreach (Process p in Process.GetProcesses())
{
try
{
if (File.Exists(p.MainModule.FileName))
{
var icon = Icon.ExtractAssociatedIcon(p.MainModule.FileName);
ima = icon.ToBitmap();
ima = resizeImage(ima, new Size(25, 25));
ima.Save(@"c:\temp\ima.jpg");
String status = p.Responding ? "Running" : "Not Responding";
dataGridView1.Rows.Add(ima, p.ProcessName, status);
DoubleBuffered1(dataGridView1, true);
}
}
catch
{
string t = "error";
}
}
如果我删除 dataGridView1.Rows.Clear();行然后它会工作,但它也会每 5 秒重新添加行。
Clearing 使滚动条在每次我向下滚动时自动向上滚动。
这是我用椭圆标记的图像,我正在谈论的滚动条:
【问题讨论】:
-
您每次都在清除网格,这会强制重绘。重绘会重置一切。您会在任务管理器中注意到,它会根据您单击的列更新行和/或重新排序。它永远不会清除整个网格并重绘
-
首先将代码包装到
dataGridView1.BeginUpdate()/EndUpdate(),否则每个Row.Add()之后都会更新datagridview。其次,DoubleBuffered1()看起来很可疑,你确定要在添加完每个项目后调用它吗?根据我的经验,重新设置内容(不确定它是否是 datagridview,更可能是ListView)不会改变滚动位置,只有选择(viewport 仍然在原处,如果我可以这样说的话方式),这里的关键是使用BeginUpdate/EndUpdate。如果您关心选择,您可以在Clear之前保存选择然后恢复它。 -
Sinatr dataGridView1 没有任何 beginupdate 或 endupdate 属性。
-
user303642 我清除它的原因是因为我正在使用计时器,我想确保如果我运行一个新进程或停止运行进程,它将更新 dataGridView1 中的整个进程列表。您的想法是清除每个单击的列,但我想在每次新进程运行或停止时更新/清除。
-
我现在看到 treeview 列表框 listview 有 beginupdate endupdate 但 datagridview dosent 有它。