wpf datagrid行中的小计单元格
问题描述:
如果激发CellEditEnding
,我试图动态小计几行。现在,我正在循环整个集合以获得总数并将其放入总单元格中。请参见下面的代码:wpf datagrid行中的小计单元格
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
中获取该事件。有没有一种方法来捕捉我使用标签来自哪一行?
答
很抱歉,如果我误解了。在任何其他有价值的单元格中编辑值之后,您需要更新Total
,对吗? DataGridCellEditEndingEventArgs
存储您编辑的行数。使用这个,你只能计算和更新当前行的Total值。 我在下面创建了一个简单的例子。它将属性val1-val3中的值相加并将总和放在名为“total”的属性中。
这是一个简单的类,用于根据数据源结构保留属性。请注意,您必须实施INotifyPropertyChanged
界面才能更新UI。
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
事件被处理的主窗口。
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
:
<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>