【问题标题】:How to prevent scroll on Refresh in a PropertyGrid?如何防止在 PropertyGrid 中刷新时滚动?
【发布时间】:2016-06-26 20:23:45
【问题描述】:

我在工具应用程序中使用 PropertyGrid 来显示一个窗口来监视远程应用程序中的对象。每隔一秒左右,我就会从应用程序中获取任何已更改成员状态的更新,然后我会更新网格。我调用 Refresh() 进行更改。除了一件事,这一切都很好。

假设对象太高而无法放入网格中,所以有一个滚动条。用户选择了一个网格项,但也向上滚动到它上方,使选定的项低于控件的底部。

问题在于,在 Refresh() 时,控件会自动将网格项滚动到视图中(奇怪的是,当该项位于控件顶部上方时,它不会这样做)。

我正在寻找一种方法来防止这种情况,或者保存状态,执行 Refresh(),然后将其设置回来。我尝试在 PropertyGrid 内的 PropertyGridView 中获取底层 VScrollBar,并弄乱“值”,但它不会永久设置。始终弹回以使项目可见。

在滚动过程中取消选择该项目是我的后备(自动滚动到视图不会发生在没有选定网格项目的情况下),但它会损害可用性,所以我正在寻找另一种方式。

有人遇到过类似情况吗?

【问题讨论】:

    标签: c# propertygrid


    【解决方案1】:

    这在 MS PropertyGrid 中是不可能的。该组件有太多无法访问的内部结构,无法为您提供所需的灵活性,并且当您意识到它并不一致时(您在网格下方遇到属性问题,但在网格上方时不会出现问题)。这就是我创建Smart PropertyGrid.Net 的原因。如果您可以选择商业产品,则此网格可以选择存储属性状态并在您对网格执行操作(如 Refresh())后恢复它们而不会出现任何闪烁。

    【讨论】:

    • 我肯定以多种方式超越了 PropertyGrid 的限制。 PropertyGridEx 让我走得很远,但更多的是,我将不得不考虑商业解决方案。暂时一瘸一拐……不过,我得到的和我从中得到的一样多,这证明了 .NET 团队!可以重复使用!
    【解决方案2】:

    我发现了一个有趣的 hack:

    您可以手动选择您更改的网格项目,它们会刷新:)

    var panProp = categ.GridItems[3];
    var tiltProp = categ.GridItems[4];
    panProp.Select();
    tiltProp.Select();
    

    所以我选择了我需要的项目,然后将选择移回

    【讨论】:

      【解决方案3】:

      对我来说,以下几点有所不同:

      不要分配新对象。

      只需用新数据更新旧对象的字段。

      现在,在刷新时,我的 PropertyGrid 不再滚动,并且还显示更新的内容。

      【讨论】:

      • 它不会在以编程方式更改属性值时自动刷新
      【解决方案4】:
      public void SoftRefreshPropertyGrid()
      {
           var peMain = propertyGrid.GetType().GetField("peMain", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid)as  System.Windows.Forms.GridItem;
           if (peMain != null)
           {
                 var refreshMethod = peMain.GetType().GetMethod("Refresh");
                 if (refreshMethod != null)
                 {
                        refreshMethod.Invoke(peMain, null);
                        propertyGrid.Invalidate(true);
                 }
           }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 1970-01-01
        • 2023-03-21
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        相关资源
        最近更新 更多