C# 如何避免每次更新时从dataGridView中的滚动条向上移动?
在我设置的构造函数中:C# 如何避免每次更新时从dataGridView中的滚动条向上移动?,c#,.net,winforms,C#,.net,Winforms,在我设置的构造函数中: dataGridView1.ScrollBars = ScrollBars.Both; 然后,我在dataGridView1中添加了行,我从计时器事件调用此方法,然后清除这些项,并每5秒再次添加一次。问题是,当我向下拖动右侧的滚动条以查看其他进程时,它会自动将滚动条向后移动 在windows任务管理器中,它没有这样做。我可以向下滚动保持向下,它会不断更新它 这是从计时器滴答声事件每隔5秒调用的方法: void PopulateApplications()
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秒
清除使滚动条在每次我按下时自动向上滚动
这是我用滚动条标记的图像:
据我所知,每次刷新时您都要向下滚动,对吗?试试这个代码
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.RowCount - 1;
代码选择第一个项目,因此它会滚动到顶部。如果保存上一个选择,则可以回滚到该选择。更新前,保存对行的引用:
DataGridViewRow selectedRow = null;
if (dataGridView1.SelectedRows.Count > 0)
selectedRow = dataGridView1.SelectedRows[0];
然后在更新后滚动到该行:
if (selectedRow != null)
dataGridView1.FirstDisplayedScrollingRowIndex = selectedRow.Index;
每次都要清除网格,这将强制重新绘制。重画会重置一切。您会注意到,在任务管理器中,它会根据您单击的列更新行和/或重新排序。它从不清除整个网格并重新绘制将所有代码包装到
dataGridView1.BeginUpdate()
/EndUpdate()
,否则datagridview的更新将在每个行之后进行。Add()
。其次,DoubleBuffered1()
看起来可疑,您确定要在添加每个项目后调用它吗?根据我的经验,重新设置内容(不确定是否是datagridview,更有可能是ListView
)不会改变滚动位置,只会改变选择(视口仍在原处,如果我可以这样说的话),这里的关键是使用BeginUpdate
/EndUpdate
。您可以在清除之前保存所选内容,然后将其还原,如果您关心选择。Sinatr dataGridView1没有任何beginupdate或endupdate属性。user303642我清除它的原因是因为我正在使用计时器,我想确保如果我运行新进程或停止运行进程,它将更新dataGridView1中的整个进程列表。您的想法是清除每个单击的列,但我想在每次新进程运行或停止时更新/清除。我现在看到treeview listbox listview有beginupdate endupdate,但datagridview没有。