[DataGrid列绑定到具有从数据库填充的十进制数据类型的DataTable列。
<DataGridTextColumn Binding="{Binding Pay, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay, Header="Sum"/>
更改每个单元格后,我需要计算列中的总和。
private void dgPays_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) {
if (dtPay == null || dtPay.Rows.Count == 0) {
return;
}
decimal Pay;
DataRow[] rr = dtPay.Select("IsTotal=1");
foreach (DataRow r in rr) {
dtPay.Rows.Remove(r);
}
Decimal.TryParse(dtPay.Compute("SUM(Pay)", "").ToString(), out Pay);
dtPay.Rows.Add(null, null, null, null, null, null, Pay, null, true);
}
但是,由于此绑定,用户输入带有前导零的负小数“ -0.xxxx”时,在输入时会丢失负号,并且“ -0”将转换为“ 0”。这样的数字只能作为“ -.xxxx”输入,它们会自动转换为“ -0.xxxx”,但对用户来说不方便。
DataTable从数据库填充,然后将值从其中保存到数据库,并且我无法更改“ Mode = TwoWay”绑定。如果我更改了“ UpdateSourceTrigger = PropertyChanged”,则在单元格编辑结束后不起作用“ dtPay.Compute(“ SUM(Pay)”,“”)“。
如何输入“ -0”?
问题已解决最初更改了单元格的格式
DataGridTextColumn Binding="{Binding Pay,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay,StringFormat={}{0:+#;-#;''}, Converter={StaticResource decimalConverter}}" Header="Sum" IsReadOnly="False"/>
并添加了转换器
public class DecimalConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
if (value != null) {
return value.ToString().Replace(",", lib.csGlobals.numSep).Replace(".", lib.csGlobals.numSep);
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
string data = (value as string).Replace(",", lib.csGlobals.numSep).Replace(".", lib.csGlobals.numSep);
if (data == null) {
return value;
}
if (data.Equals(string.Empty)) {
return 0;
}
if (!string.IsNullOrEmpty(data)) {
decimal result;
if (data.EndsWith(".") || data.Equals("-0") || data.Equals("-") || data.EndsWith(",")
|| data.Equals("-0.0") || data.Equals("-0,0")
) {
return Binding.DoNothing;
}
if (decimal.TryParse(data, out result)) {
return result;
}
}
return Binding.DoNothing;
}
}