【问题标题】:WPF DataGrid - Virtualised - select allWPF DataGrid - 虚拟化 - 全选
【发布时间】:2013-09-21 19:09:43
【问题描述】:

对于 WPF 虚拟化 DataGrid,我需要使用“全选”方法。迭代网格本身不起作用,因为它只会选择在 UI 中可见的记录 - 但当然,如果它们是使用鼠标选择的,它们会被保留。我猜 DataTable 中的某些东西必须改变,但是什么?如果可以,是否可以对其进行操作,以便在 DataGrid 中选择所有记录?

谢谢

=========================添加====================== =====

Eran - 感谢您的回复,但有工作将其连接起来

  1. 创建数据网格

     Dim DGV As New CustomControl.DGVx
        With DGV
            .Name = "Invoice_AdHoc_DGV"
            .AutoGenerateColumns = False
            .SelectionMode = SelectionMode.Multiple
        End With
        RegisterControl(Invoice_AdHoc_Grid, DGV)
        RightGrid.Children.Add(DGV)
    
  2. 绑定到数据表

    DGV.ItemsSource = AdHocDT.DefaultView
    
  3. 根据您的回答创建课程

    Public Class ObjectSelectAll
    Implements System.ComponentModel.INotifyPropertyChanged
    Public Property Name() As String
    Private vIsSelected As Boolean
    Public Property IsSelected() As Boolean
    Get
        Return vIsSelected
    End Get
    Set(value As Boolean)
        vIsSelected = value
        RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("IsSelected"))
    End Set
    End Property
    
    
    Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    

    结束类

【问题讨论】:

  • 我会在我的 .cs 对象上而不是在可视对象上使用全选逻辑,你所说的选中是什么意思,你有一个绑定到某个 IsSelected 属性的 chekcbox 列吗?
  • 单击行选择它(IsSelected = True)-如果用户单击“全选”按钮,我想做同样的事情。有没有办法用 DataTable 做到这一点?
  • 您可以创建一个行样式,该样式指示绑定到行 IsSelected 的对象中的值,并且当单击全选时它们会更新对象中的绑定属性。至于 UI,只有“已实现”的对象才能被“选中”
  • 我可以遍历 DataTable 并获得所需的结果,但如果颜色/字体的变化也可以在 DataGrid 中复制,就好像它是鼠标选择的行一样 - 我的一切已尝试仅适用于 UI 的可见部分。
  • 给出的答案选择了行,并且在 UI 中可见。

标签: wpf datagrid datatable


【解决方案1】:

cs:

    private List<MyObject> _items;
    public List<MyObject> Items
    {
        get
        {
            if(_items == null)
                _items = new List<MyObject> { new MyObject { Name = "obj1" }, new MyObject { Name = "obj2" }, new MyObject { Name = "obj3" }, new MyObject { Name = "obj4" } };
            return _items;
        }
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        foreach (var item in Items)
        {
            item.IsSelected = true;
        }
    }
}

public class MyObject : INotifyPropertyChanged
{
    public string Name { get; set; }

    private bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

xaml:

    <Button Click="Button_Click_1" Content="Select All"/>

    <DataGrid Grid.Row="1" AutoGenerateColumns="False" ItemsSource="{Binding Items}">
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="IsSelected" Value="{Binding IsSelected}"/>                    
            </Style>
        </DataGrid.RowStyle>

        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}"/>    
        </DataGrid.Columns>

    </DataGrid>

【讨论】:

    【解决方案2】:

    终于解决了这个问题

    向数据表添加了另一列

     With AdHocDT.Columns
                     .Add("Selected", GetType(Boolean))
                End With
    

    单击“全选”时,将所有行的此项设置为 True,并且在 Grid 中,该值也更新为 true,然后添加此项以确保当虚拟数据滚动到视图中时 Grid 将其显示为选中状态

    Private Sub Invoice_AdHoc_DGV_ItemsChanged(sender As Object, e As EventArgs)
        Try
            Dim DGV As CustomControl.DGVx = Invoice_AdHoc_Grid.FindName("Invoice_AdHoc_DGV")
            Dim i As Integer = 0
             For Each Row As DataRowView In DGV.Items
                Dim vRow As DevComponents.WPF.Controls.AdvGridRow = CType(DGV.ItemContainerManager.ContainerFromItem(DGV.Items(i), False), DevComponents.WPF.Controls.AdvGridRow)
                If Not vRow Is Nothing Then
                    If Row("Selected") = True Then
                        vRow.IsSelected = True
                    End If
                End If
                i += 1
            Next
    
        Catch ex As Exception
            EmailError(ex)
        End Try
    End Sub
    

    并处理事件

    AddHandler DGV.ItemContainerManager.VisibleContainersChanged, AddressOf Invoice_AdHoc_DGV_ItemsChanged
    

    现在 Grid 将所有行显示为选定的 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2014-08-02
      • 2010-12-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多