2013-07-02 36 views
0

我有一个DataGrid其中显示Employees几个名单信息。我添加了一个带有CheckBox的模板列。我想从选中的所有行(CheckBox所选行)中获得KeyIDs(它是从DB绑定的)。这些KeyIDs我必须传递给SQL来删除选定的行(BtnDeleteSelected_Click)。请帮忙。获取WPF Datagrid行DataGridTemplate列中的所有选中的复选框

这是我DataGrid

<DataGrid AutoGenerateColumns="False" Grid.Row="1" Height="555" HorizontalAlignment="Left" Margin="0,5,0,0" Name="dgRosterList" VerticalAlignment="Top" Width="980" ItemsSource="{Binding}" SelectionMode="Single" SelectionUnit="FullRow" CanUserResizeColumns="True" CanUserSortColumns="True" AlternatingRowBackground="Gainsboro" AlternationCount="2" IsEnabled="True" Grid.ColumnSpan="2">     
    <DataGrid.Columns> 
     <DataGridTemplateColumn Width="30"> 
      <DataGridTemplateColumn.HeaderTemplate> 
       <DataTemplate> 
        <CheckBox x:Name="all" Content="" Click="CheckBox_Click"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.HeaderTemplate> 

      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox Checked="chkSelect_Checked" Name="chkSelect"></CheckBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Header="Sl No" Binding="{Binding SlNo}"/> 
     <DataGridTextColumn Header="Key ID" Binding="{Binding KeyID}" Width="80" Visibility="Hidden"/> 
     <DataGridTextColumn Header="Emp ID" Binding="{Binding Emp_ID}" Width="80"/> 
     <DataGridTextColumn Header="Emp Name" Binding="{Binding Emp_Name}" Width="200"/> 
     <DataGridTextColumn Header="Date" Binding="{Binding PDate, StringFormat={}{0:dd/MM/yyyy}}" Width="100"/> 
     <DataGridTextColumn Header="Shift" Binding="{Binding Shift_Code}" Width="80"/> 
     <DataGridTextColumn Header="In Time" Binding="{Binding InTime, StringFormat={}{0:hh:mm}}" Width="80"/> 
     <DataGridTextColumn Header="Out Time" Binding="{Binding OutTime, StringFormat={}{0:hh:mm}}" Width="80"/> 
     <DataGridTemplateColumn Header="Half Day" Width="80"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Image Name="IsHalfDay" Width="15" Height="15" Source="" /> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding HalfDay}" Value="Yes"> 
           <Setter TargetName="IsHalfDay" Property="Source" Value="../Images/ico_tick.gif"/> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTemplateColumn Header="Off Day" Width="80"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Image Name="IsOffDay" Width="15" Height="15" Source="" /> 
        <DataTemplate.Triggers> 
         <DataTrigger Binding="{Binding OffDay}" Value="Yes"> 
          <Setter TargetName="IsOffDay" Property="Source" Value="../Images/ico_tick.gif"/> 
         </DataTrigger> 
        </DataTemplate.Triggers> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTemplateColumn Header="Delete" Width="75"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button Name="btnDelete" Click="btnDelete_Click" Width="50" Height="20" ToolTip="Delete Roster" CommandParameter="{Binding Path=KeyID}" > 
         <Image Source="../Images/delete.png" Width="15" Height="19"/> 
        </Button> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTextColumn Header="Processed" Binding="{Binding Processed}" Visibility="Hidden"/> 
    </DataGrid.Columns> 
    <DataGrid.RowDetailsTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <!--<Image Source="{Binding XPath=media:thumbnail/@url}" 
        Width="60" Height="60"/>--> 
       <TextBlock Text="{Binding Path=WeeklyOffs}"/> 
      </StackPanel> 
     </DataTemplate> 
    </DataGrid.RowDetailsTemplate> 
</DataGrid> 

回答

0

可以使用FindChild()用于接入到CheckBox

public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject 
    { 
     if (parent == null) 
     { 
      return null; 
     } 

     T foundChild = null; 

     int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 

     for (int i = 0; i < childrenCount; i++) 
     { 
      var child = VisualTreeHelper.GetChild(parent, i); 
      T childType = child as T; 

      if (childType == null) 
      { 
       foundChild = FindChild<T>(child, childName); 

       if (foundChild != null) break; 
      } 
      else 
       if (!string.IsNullOrEmpty(childName)) 
       { 
        var frameworkElement = child as FrameworkElement; 

        if (frameworkElement != null && frameworkElement.Name == childName) 
        { 
         foundChild = (T)child; 

         break; 
        } 
        else 
        { 
         foundChild = FindChild<T>(child, childName); 

         if (foundChild != null) 
         { 
          break; 
         } 
        } 
       } 
       else 
       { 
        foundChild = (T)child; 
        break; 
       } 
     } 

     return foundChild; 
    } 

如果你只需要调用这个函数,它会返回只有第一控制,但我们需要CheckBox作为Selected Row。要访问选定行的控制事件SelectionChanged添加到DataGrid在其中发挥作用,这将给一个Selected Row

<DataGrid Name="MyDataGrid" SelectionChanged="MyDataGrid_SelectionChanged"> 

private void MyDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    try 
    { 
     // Get the list of rows 
     var row_list = GetDataGridRows(MyDataGrid); 

     // Check the all rows 
     foreach (DataGridRow single_row in row_list) 
     {    
      if (single_row.IsSelected == true) 
      { 
       CheckBox MyCheckBox = FindChild<CheckBox>(single_row, "MyCheckBox"); // here your CheckBox name 

       MessageBox.Show(MyCheckBox.IsChecked.ToString()); 
      } 
     } 
    } 

    catch 
    { 
     throw new Exception("Can't get access to DataGridRow"); 
    } 
} 

上市GetDataGridRows的():

public IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid) 
{ 
    var itemsSource = grid.ItemsSource as IEnumerable; 

    if (null == itemsSource) 
    { 
     yield return null; 
    } 

    foreach (var item in itemsSource) 
    { 
     var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow; 

     if (null != row) 
     { 
      yield return row; 
     } 
    } 
} 

正如你所看到的,这练习不是很有用,所以不是很正确。您可以将MyCheckedOnPropertyChanged()添加到他的DataContext。例如:

public class YourClass : INotifyPropertyChanged 
    { 
     private bool? myChecked = null; 

     #region INotifyPropertyChanged values 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     #endregion 

     public bool? MyChecked 
     { 
      get 
      { 
       return myChecked; 
      } 

      set 
      { 
       myChecked = value; 
       OnPropertyChanged("myChecked"); 
      } 
     } 
    } 

而且像这样使用:

<CheckBox x:Name="MyCheckBox" IsChecked="{Binding MyChecked}" />   

在酒店的每一个变化,OnPropertyChanged()将被触发,你可以做一些操作。也就是说,尽量让自己的行为不在XAML的旁边,并且在数据方面,因为在第一种情况下,使用DataGrid很难。

0

定义在一定到每一行,将其绑定到CheckBoxIschecked属性的类一个布尔属性(像IsRowSelected),然后你可以删除所有行的ViewModelIsRowSelected=True

2

Event

private void chkSelect_Checked(object sender, RoutedEventArgs e) 
{ 
    dgRosterList.IsSynchronizedWithCurrentItem = true; 
} 

这将导致highlighting当前row好像它被选中。

XAML使用DataGridSelectedItem属性:

SelectedItem="{Binding SelectedEmployeeData}" 

ViewModel,定义属性SelectedEmployeeData

private DeleteViewModel m_SelectedEmployeeData; 

public DeleteViewModel SelectedEmployeeData 
{ 
    get 
    { 
     return m_SelectedEmployeeData; 
    } 

    set 
    { 
     m_SelectedEmployeeData = value; 

     if (null != m_SelectedEmployeeData) 
     { 
      listToSend.Add(m_SelectedEmployeeData.KeyID); 
     } 
     else 
     { 
      listToSend.Remove(m_SelectedEmployeeData.KeyID); 
     } 

     OnPropertyChanged("SelectedEmployeeData"); 
    } 
} 

和:

List<int> listToSend = new List<int>(); 

哪里lstSend将包含要发送到DBKeyIDs

这里DeleteViewModel是虚拟机,我假设所有属性的列,即KeyID,Emp_ID等将被定义。

相关问题