【问题标题】:How do I figure out which items' selected state was changed in a DataGridView?如何确定 DataGridView 中哪些项目的选定状态已更改?
【发布时间】:2009-12-04 19:51:53
【问题描述】:

我有一个打开了 MultiSelect 的 DataGridView。当 SelectionChanged 事件被触发时,我想知道哪些项目是新选择的,哪些项目是新取消选择的。例如,如果您选择了多个项目(通过 Ctrl 单击),然后您释放 Ctrl 键并选择单个项目,我想知道哪些项目被取消选择。我可以跟踪以前选择的项目集合,但我只是想确保我没有想太多。

【问题讨论】:

    标签: c# datagridview selection multi-select


    【解决方案1】:

    该事件并没有准确地告诉您哪些事情发生了变化。如果您出于某种原因需要知道,则必须跟踪之前的选择。

    你想做什么来回应这个事件?可能有更简单的方法可以实现您的真正目标。

    【讨论】:

    • 我希望有更简单的方法。我的业务对象需要维护项目的选择。绑定会让事情变得更容易,但不幸的是我还没有弄清楚如何绑定我拥有的东西。我的 DataGridView 实际上是一个自定义的 TreeGridView,它是一个幕后的 DataGridView。我的 TreeGridView 包含 3 层集合,每一层都是不同的类型。所以我恢复到以更手动的方式刷新网格中的数据。
    • 哎呀,我似乎错了。该控件有另一个事件可以提供您想要的信息。请参阅 md5sum 对 RowStateChanged 事件的回答。
    【解决方案2】:

    该信息应该在事件参数中。

    使用RowStateChanged 事件。 DataGridViewRowStateChangedEventArgs 将包含被点击的行。如果用户选择/取消选择多行,该事件将针对每行选择/取消选择调用一次。

    e.Row.Selected 将显示该行现在是被选中还是被取消选中。

    【讨论】:

      【解决方案3】:

      DataGridView 本身无法获得此信息。但是,您可以在提供此信息的 DataGridView 周围编写一个包装器。

      public static void OnSelectionChanged(
        this DataGridView view,
        Action<List<DataGridViewRow>,List<DataGridViewRow>> handler) {
        var oldSelection = view.SelecetedRows.Cast<DataGridViewRow>.ToList();
        view.SelectedChanged += (sender,e)  {
          var newSelection = view.SelectedRows.Cast<DataGridViewRow>.ToList();
          handler(oldSelection,newSelection);
          oldSelection = newSelection;
        };
      }
      

      用例

      void HandleSelectionChanged(List<DataGridViewRow> oldRows, List<DataGridViewRow> newRows) {
        ..
      }
      
      void FormLoaded() {
        myDataGridView.OnSelectionChanged(HandleSelectionChanged);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-28
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        • 2015-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多