【问题标题】:Delete Multiple Rows From WPF Datagrid using Checkbox and Delete button使用复选框和删除按钮从 WPF Datagrid 中删除多行
【发布时间】:2017-12-16 06:06:03
【问题描述】:

我有一个包含复选框的 DataGrid。我想通过单击删除按钮从选中复选框的 DataGrid 中删除所有行。我的数据网格的 XAML 如下所示。

    <DataGrid x:Name="orders" Grid.Row="4" Background="AliceBlue" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AutoGenerateColumns="False"  >
        <DataGrid.Columns>
            <DataGridCheckBoxColumn  Header="Select" Binding="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}" ></DataGridCheckBoxColumn>
            <DataGridTextColumn Header="Item Name" Binding="{Binding Path=Name}" ></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

我想为单击按钮编写代码以删除所有选中复选框的行。

    private void btnDelete_Click(object sender, RoutedEventArgs e)
    {
        //Delete logic here

    }

我如何实现这一目标? 注意:我使用的是 EntityFramework 而不是 ADO。数据网格绑定到 Order 类型的可观察集合,例如 ObservableCollection&lt;Order&gt;

【问题讨论】:

  • 当前行为是什么,基于您尝试过的行为与预期行为不同。如果复选框绑定正确,那么只需获取SelectedItems 并将它们从集合中删除即可。
  • 也许代码 sn-p 可以提供帮助。如何获取已检查的行。

标签: c# wpf checkbox datagrid


【解决方案1】:

首先确保DataGrid 允许通过SelectionMode 进行多选

SelectionMode="Extended"

然后单击按钮,根据视图中的IsSelected 绑定从网格中获取所选项目

private void btnDelete_Click(object sender, RoutedEventArgs e) {
    //get selected items
    if (orders.SelectedItems != null && orders.SelectedItems.Count > 0) {
        var toRemove = orders.SelectedItems.Cast<Order>().ToList();
        //Delete logic here
        //...remove items from EF and save

        //Once confirmed remove from items source
        var items = orders.ItemsSource as ObservableCollection<Order>;
        if (items != null) {
            foreach (var order in toRemove) {
                items.Remove(order);       
            } 
        }
    }
}

【讨论】:

    【解决方案2】:
    Write code behind like this....
            public MainWindow()
            {
                InitializeComponent();
                List<Great> p = new List<Great>();
                p.Add(new Great() { Name = "Good" });
                p.Add(new Great() { Name = "Bad" });
                p.Add(new Great() { Name = "Ugly" });
                orders.ItemsSource = p;
    
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                List<Great> SelectedOrders = new List<Great>();
                for (int i = 0; i < orders.SelectedItems.Count; i++)
                {
                    SelectedOrders.Add((Great)orders.SelectedItems[i]);
                }
                var kk = orders.ItemsSource as List<Great>;
                foreach (var item in SelectedOrders)
                {
                    kk.Remove(item);
                }
                orders.Items.Refresh();
            }
    
           public class Great
            {
                public string Name { get; set; }
            }
    

    【讨论】:

      【解决方案3】:

      只需在ObservableCollection&lt;Order&gt; 上调用Clear() 方法即可:

      private void btnDelete_Click(object sender, RoutedEventArgs e)
      {
          var sourceCollection = orders.ItemsSource as ObservableCollection<Order>;
          if (orders != null)
              orders.Clear();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 2014-04-18
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多