Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免每次更新时从dataGridView中的滚动条向上移动?_C#_.net_Winforms - Fatal编程技术网

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没有。