【问题标题】:How can i avoid from the ScrollBar in dataGridView from being moving up each update?如何避免 dataGridView 中的 ScrollBar 向上移动每次更新?
【发布时间】: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 有它。

标签: c# .net winforms


【解决方案1】:

根据我的理解,您想在每次刷新时向下滚动,对吗?试试这个代码

dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.RowCount - 1;

【讨论】:

    【解决方案2】:

    代码选择了第一项,所以它被滚动到顶部。如果您保存先前的选择,您可以滚动回到它。在更新之前,保存对行的引用:

    DataGridViewRow selectedRow = null;
    if (dataGridView1.SelectedRows.Count > 0)
       selectedRow = dataGridView1.SelectedRows[0];
    

    然后在更新后滚动到该行:

     if (selectedRow != null)
        dataGridView1.FirstDisplayedScrollingRowIndex = selectedRow.Index;
    

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 2014-12-04
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 2017-07-07
      • 2017-06-30
      相关资源
      最近更新 更多