【问题标题】:DataGridVeiw (WinForm) - Determine when rows have been reorderedDataGridView (WinForm) - 确定行何时重新排序
【发布时间】:2011-04-01 21:41:01
【问题描述】:

在我们的一个 WinForm 应用程序中,我们使用启用了列排序和 SortDescriptions 的 DataGridView。

如果用户修改了正在排序的单元格之一,则会应用排序,并且网格会以新顺序绘制行。

我需要在绘制之前访问 DataGridRows,但要在对它们进行排序之后。我知道我可以使用 DataGridView.RowPrePaint(),但这似乎有点矫枉过正。当鼠标悬停在某些单元格上时它会触发,等等。当排序发生变化时,我只需要到达行。我想也许我可以处理 DGV 上的“已排序”事件,但这仅在用户单击其中一个列标题后触发,但当 DGV 应用任何现有的列排序或排序描述时,我需要访问行。基本上,可以在编辑其中一个单元格后对行进行重新排序(自动排序),对 DGV 进行排序,或者在通过 RowEdit“模板”修改行之后。

我今天在谷歌上搜索了很多,但没有提出任何建议。

有什么建议吗? (除了处理 DataGridView.RowPrePaint 事件......)

【问题讨论】:

    标签: winforms datagridview


    【解决方案1】:

    我不确定它是否有效,但如果我是你,我会保留 RowPrePaint() 事件。

    设置标志

    bool RowSorted;
    

    在排序函数中将 RowSorted 变量设置为 true,并在对行进行排序后再次在排序函数中触发 RowPrePaint 事件。

    在 RowPrePaint 函数中,我会检查标志。如果为真,则绘制行; if false e.Handled = true;

    【讨论】:

    • 这就是问题所在。当“自动排序”发生时,“排序”事件不会触发(我在帖子中说“已排序”,但我的意思是“排序”。它仅在用户第一次单击列标题时触发。我需要一个事件在行被重新使用后触发(由于列更改或插入新行),但在绘制网格之前。
    【解决方案2】:

    我找到了答案。这是我面临的确切问题(来自 msdn):

    当 DataGridView 控件同时包含绑定列和未绑定列时 已排序,未绑定列中的值无法维护 自动地。要维护这些值,您必须实现 virtual 通过将 VirtualMode 属性设置为 true 并处理 CellValueNeeded 和 CellValuePushed 事件。

    有关详细信息,请参阅如何:在 Windows 中实现虚拟模式 窗体 DataGridView 控件。此外,按未绑定的列排序 不支持绑定模式。

    希望这会有所帮助。

    此致,刘琳达

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-18
      • 2016-03-22
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多