【问题标题】:c# code for select all checkbox in wpf datagridc# wpf datagrid中选择所有复选框的代码
【发布时间】:2010-10-19 20:29:36
【问题描述】:

我需要一些 c# 代码来选择/取消选择 WPF 3.5 框架中数据网格中的所有复选框。 我想通过单击网格中的单个标题复选框来执行此操作。

请帮忙。

【问题讨论】:

    标签: c# wpf .net-3.5 datagrid checkbox


    【解决方案1】:

    这可以通过声明方式完成。下面为每一行创建一个复选框列,并且可以切换行选择。可以单击复选框列的标题以选择所有行。

    xaml 中的相关部分

    <Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit">
        <toolkit:DataGrid Name="dataGrid" 
         ItemsSource="{Binding}" AutoGenerateColumns="True" 
         SelectionMode="Extended" CanResizeRows="False">
        <toolkit:DataGrid.RowHeaderTemplate>
           <DataTemplate>
               <Grid>
                   <CheckBox IsChecked="{
                      Binding Path=IsSelected, 
                      Mode=TwoWay, 
                      RelativeSource={RelativeSource FindAncestor, 
                      AncestorType={x:Type toolkit:DataGridRow}}}"
                />
               </Grid>
           </DataTemplate>
        </toolkit:DataGrid.RowHeaderTemplate>
        </toolkit:DataGrid>
    </Window>
    

    【讨论】:

      【解决方案2】:

      这是我们在 .Net 4.0 XAML 文件中使用的示例数据网格:

      <DataGrid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Name="dgMissingNames" ItemsSource="{Binding Path=TheMissingChildren}" Style="{StaticResource NameListGrid}" SelectionChanged="DataGrid_SelectionChanged">
          <DataGrid.Columns>
              <DataGridTemplateColumn CellStyle="{StaticResource NameListCol}">
                  <DataGridTemplateColumn.HeaderTemplate>
                      <DataTemplate>
                          <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
                      </DataTemplate>                            
                  </DataGridTemplateColumn.HeaderTemplate>
                  <DataGridTemplateColumn.CellTemplate>                        
                      <DataTemplate>
                          <CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" Name="theCheckbox"/>
                      </DataTemplate>
                  </DataGridTemplateColumn.CellTemplate>                            
              </DataGridTemplateColumn>
              <DataGridTextColumn Binding="{Binding Path=SKU}" Header="Album" CellStyle="{StaticResource NameListCol}"/>
              <DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" CellStyle="{StaticResource NameListCol}"/>
              <DataGridTextColumn Binding="{Binding Path=Pronunciation}" Header="Pronunciation" CellStyle="{StaticResource NameListCol}"/>
          </DataGrid.Columns>
      </DataGrid>
      

      下面是代码:

      private void HeadCheck(object sender, RoutedEventArgs e, bool IsChecked)
      {
          foreach (CheckedMusicFile mf in TheMissingChildren)
          {
              mf.Checked = IsChecked;
          }
          dgMissingNames.Items.Refresh();
      }
      
      private void CheckBox_Checked(object sender, RoutedEventArgs e)
      {
          HeadCheck(sender, e, true);
      }
      
      private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
      {
          HeadCheck(sender, e, false);
      }
      

      TheMissingChildren 是一个简单的对象结构,具有一些字符串属性和一个 ischecked 布尔值。

      HTH。

      【讨论】:

      • 如果您不打算在 HeadCheck 中使用 sender 对象或 routedeventargs,则不应将它们传入
      • UpdateSourceTrigger=PropertyChanged 确实对我有帮助。谢谢。
      【解决方案3】:

      这是基于我不记得的其他人的来源,但我们使用它来帮助查找某种类型的视觉子项。对于这种情况,它可能不是最有效的用法,但它可能会帮助您走上正轨。

          public static childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
          {
              for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
              {
                  DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                  if (child != null && child is childItem)
                      return (childItem)child;
      
                  childItem childOfChild = FindVisualChild<childItem>(child);
                  if (childOfChild != null)
                      return childOfChild;
              }
              return null;
          }
      

      [编辑 4.16.09] 在此基础上,试试这个方法。应该找到所有 CheckBox 并更改提供的状态,可从您的事件处理程序对 Checked/Unchecked 事件调用。

         public static void CheckAllBoxes(DependencyObject obj, bool isChecked)
          {
              for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
              {
                  // If a checkbox, change IsChecked and continue.
                  if (obj is CheckBox)
                  {
                      ((CheckBox) obj).IsChecked = isChecked;
                      continue;
                  }
      
                  DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                  CheckAllBoxes(child, isChecked);
              }
          }
      

      【讨论】:

        【解决方案4】:

        我会使用 WPF 中的新数据绑定功能。为所有复选框的 IsChecked 属性提供单向绑定,绑定源是主复选框的 IsChecked 属性。

        另一种选择是使用触发器

        【讨论】:

          【解决方案5】:
          DataColumn dt = null;            
                  for (int i = 0; i < dataGrid.Columns.Count; i++)
                  {
          
               dt = new DataColumn("Column Name");
          
                      dt.DataType = typeof(Boolean);
                      dt.DefaultValue = false;
                       dataTable.Add(dt);
                  }
          
          dataGied.DataContext = dataTable;
          
          
          
          <Custom:DataGrid x:Name="dataGrid" AutoGenerateColumns="True" ItemsSource="{Binding}" />                    
          

          这只是一个粗略的想法,希望这可行

          【讨论】:

            猜你喜欢
            • 2018-08-03
            • 2017-08-27
            • 1970-01-01
            • 2019-09-13
            • 2018-06-24
            • 1970-01-01
            • 2013-06-11
            • 2016-08-12
            • 1970-01-01
            相关资源
            最近更新 更多