2016-09-15 11 views
2

CellEditEndingが発生した場合、動的に複数の行を小計しようとしています。今は、コレクション全体をループして合計を取得し、それを合計セルに配置しています。以下のコードを参照してください:wpfデータグリッド行の小計セル

private void CalculateTotals() 
    { 
     foreach (var i in reviewItems) // total pay is calculated on data load 
     { 
      if (i.Total_Pay == null || i.IsApproved != true) //total pay is recalculated on save 
      { 
       i.Total_Pay = GetValue(i.Total_Bonus_Items) + GetValue(i.Total_Hourly_Pay) + 
        GetValue(i.Total_Line_Items) + GetValue(i.Total_Sick) + 
        GetValue(i.Total_Adjustments) + GetValue(i.Total_Vacation); 
       SavedSummary = false; 
      } 
     } 
    } 

XAMLは

<DataGrid x:Name="SummaryGrid" Margin="10,66,10,0" CellEditEnding="SummaryGrid_CellEditEnding"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Employee" Binding="{Binding Emp_Name}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Period End" Binding="{Binding Week_End_Date, StringFormat=MM/dd/yyyy}" IsReadOnly="True" /> 
      <DataGridTextColumn Header="Load Pay" Binding="{Binding Total_Line_Items}" Visibility="{Binding Source={x:Reference LoadVisibility}}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Extra Items" Binding="{Binding Total_Bonus_Items}" Visibility="{Binding Source={x:Reference LoadVisibility}}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Hours" Binding="{Binding Total_Hourly_Pay}" Visibility="{Binding Source={x:Reference HourlyVisibility}, Path=Visibility}" IsReadOnly="True"/> 
      <DataGridTextColumn Header="Vacation" Binding="{Binding Total_Vacation}" Visibility="{Binding Source={x:Reference HourlyVisibility}, Path=Visibility}"/> 
      <DataGridTextColumn Header="Sick" Binding="{Binding Total_Sick}" Visibility="{Binding Source={x:Reference HourlyVisibility}, Path=Visibility}"/> 
      <DataGridTextColumn Header="Adjustments" Binding="{Binding Total_Adjustments}" Visibility="{Binding Source={x:Reference HourlyVisibility}, Path=Visibility}"/> 
      <DataGridTextColumn Header="Total Pay" Binding="{Binding Total_Pay}"/> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.Header> 
        Approved 
       </DataGridTemplateColumn.Header> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding IsApproved, UpdateSourceTrigger=PropertyChanged}"/> 
        </DataTemplate> 

       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

私は私がデータをつかむが主キーなどTag="{Binding tkey}"にタグ付けすることをメインウィンドウにあるチェックボックスを持っているが、私はどのように把握することはできませんが、次のイベントからDataGridCellEditEndingEventArgsまたはsenderを取得します。タグを使用してどの行を取得する方法がありますか?

答えて

0

ご迷惑をおかけして申し訳ありません。他の貴重なセルの値を編集した直後に、Totalを更新する必要があります。 DataGridCellEditEndingEventArgsには、編集した行の番号が格納されます。これを使用すると、現在の行の合計値のみを計算して更新できます。 私は以下の簡単な例を作成しました。プロパティval1〜val3の値を合計し、合計を「total」というプロパティに配置します。

これは、データソース構造に従ってプロパティを保持するための単純なクラスです。 UIを更新したままにするには、INotifyPropertyChangedインターフェイスを実装する必要があります。

public class DataItem:INotifyPropertyChanged 
{ 
    public DataItem(int v1,int v2,int v3) 
    { 
     val1 = v1; 
     val2 = v2; 
     val3 = v3; 
     total = v1 + v2 + v3; 
    } 

    private int _val1; 
    public int val1 
    { 
     get { return _val1; } 
     set { _val1 = value; InvokePropertyChanged(new PropertyChangedEventArgs("val1"));} 
    } 

    private int _val2; 
    public int val2 
    { 
     get { return _val2; } 
     set { _val2 = value; InvokePropertyChanged(new PropertyChangedEventArgs("val2")); } 
    } 

    private int _val3; 
    public int val3 
    { 
     get { return _val3; } 
     set { _val3 = value; InvokePropertyChanged(new PropertyChangedEventArgs("val3")); } 
    } 

    private int _total; 
    public int total 
    { 
     get { return _total; } 
     set { _total = value; InvokePropertyChanged(new PropertyChangedEventArgs("total")); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void InvokePropertyChanged(PropertyChangedEventArgs e) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, e); 
    } 
} 

これは、データグリッドが配置されているメインウィンドウのコードビハインドであり、ここでデータが埋めとロードグリッドに、またdatagrid_CellEditEndingイベントが処理されています。 DataGridため

public MainWindow() 
    { 
     InitializeComponent(); 
     list = new ObservableCollection<DataItem>(); 
     DataItem i1 = new DataItem(3,6,8); 
     DataItem i2 = new DataItem(1, 2, 6); 
     DataItem i3 = new DataItem(9, 7, 22); 
     list.Add(i1); 
     list.Add(i2); 
     list.Add(i3); 
     datagrid.ItemsSource = list; 
    } 

    public ObservableCollection<DataItem> list; 

    private void datagrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
    { 
     int index = e.Row.GetIndex(); 
     list[index].total = list[index].val1 + list[index].val2 + list[index].val3; 
    } 

そして最後に、XAML:

<DataGrid x:Name="datagrid" AutoGenerateColumns="False" CellEditEnding="datagrid_CellEditEnding"> 
     <DataGrid.Columns> 

      <DataGridTextColumn Header="Val1" Binding="{Binding Path=val1, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="Val2" Binding="{Binding Path=val2, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="Val3" Binding="{Binding Path=val3, UpdateSourceTrigger=PropertyChanged}"/> 
      <DataGridTextColumn Header="total" FontWeight="Black" Binding="{Binding Path=total}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
関連する問題