通过转换器从DataGrid中的2计算一列
Calculating one column from 2 in DataGrid through Converter
我正在编写显示数据网格中产品数据的应用程序(我第一次使用 WPF)。我成功地将数据网格与 MS SQL 数据库连接起来。我坚持创建计算列。
我有兴趣将两列的值相乘。我想使用 Pcs_DC_col 和 Qty_multi_col 来计算 Qty_DC_col[ 中的值=50=]。
据我了解,我必须使用转换器,并且因为我使用超过 1 列,所以我应该使用 IMultiValueConverter。但是不知道如何编写代码来显示与空白单元格或 dependencyproperty.unsetvalue 不同的内容。我应该添加或更改什么才能使其正常工作?
XAML代码:
<Window.Resources>
<local:ColumnConverter x:Key="ColumnConversion"/>
</Window.Resources>
<Grid>
<DataGrid x:Name="matrix" SelectionUnit="FullRow" SelectionChanged="PLU_row_selected"
AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="PLU" Binding="{Binding PLU}"/>
<DataGridTextColumn Header="config" Binding="{Binding config}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Colour" Binding="{Binding Colour}"/>
<DataGridTextColumn Header="Promo" Binding="{Binding Promo}"/>
<DataGridTextColumn Header="Department" Binding="{Binding Department}"/>
<DataGridTextColumn Header="Category" Binding="{Binding Category}"/>
<DataGridTextColumn Header="Price" Binding="{Binding Price}"/>
<DataGridTextColumn x:Name="Pcs_DC_col" Header="Pc.s DC" Binding="{Binding Pcs Dc}"/>
<DataGridTextColumn Header="Allocated Pcs" Binding="{Binding Allocated Pcs}"/>
<DataGridTextColumn x:Name="Qty_DC_col" Header="Qty DC">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ColumnConversion}">
<Binding ElementName="Pcs_DC_col" Path="Text"/>
<Binding ElementName="Qty_multi_col" Path="Text"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
<DataGridTextColumn Header="Qty All" Binding="{Binding obliczenia}"/>
<DataGridTextColumn Header="Qty Tra" Binding="{Binding Qty Tra}"/>
<DataGridTextColumn Header="Qty Str" Binding="{Binding Qty Str}"/>
<DataGridTextColumn x:Name="Qty_multi_col" Header="Qty multiple" Binding="{Binding Qty Multiple}"/>
<DataGridTextColumn Header="% all" Binding="{Binding Percent_Allo}"/>
<DataGridTextColumn Header="Value all" Binding="{Binding Value_allocated}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
转换器代码:
public class ColumnConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null) return 0;
try
{
return String.Format("{0}", values[0]);
}
catch
{
return 0;
}
} // Convert()
此版本显示空白列,如果我更改代码:
return String.Format("{0}", values[0]);
用dependencyproperty.unsetvalue填满我的专栏。
编码如何将数据从数据库加载到网格:
private void load_products_to_grid()
{
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = @"Server = batorego426\coreSQL; Database = CorpCore; Integrated Security=true;";
myConnection.Open();
SqlCommand query = new SqlCommand();
query.CommandText = "select * from [products]";
query.Connection = myConnection;
SqlDataAdapter adapter = new SqlDataAdapter(query);
DataTable product_table = new DataTable("products");
adapter.Fill(product_table);
matrix.ItemsSource = product_table.DefaultView;
}
编辑:
我按照安迪的建议更改了出价
<DataGridTextColumn x:Name="Qty_DC_col" Header="Qty DC">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ColumnConversion}">
<Binding Path="Pcs_DC_col"/>
<Binding Path="Qty_multi_col"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
和转换器代码:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null) return 0;
return (int)values[0]*(int)values[1];
}
但我仍然得到空列,我尝试更改转换器中的代码以检查是否可以看到任何值:
String.Format("{0}", values[0]);
然后在该列中得到 "dependencyproperty.unsetvalue"。所以我猜数据仍然没有连接,甚至不为空但没有 tset。我还能做什么?
您在多重绑定中的绑定应该是数据和列名。如果它们是 Pcs_DC_col 和 Qty_multi_col 那么
<MultiBinding Converter="{StaticResource ColumnConversion}">
<Binding Path="Pcs_DC_col"/>
<Binding Path="Qty_multi_col"/>
</MultiBinding>
object[] values 数组将包含两个值。这些可能是双重的,但据代码所知,这些只是对象,因此将它们转换并加在一起。 Return 作为一个数字。类似于:
return (double)values[0] * (double)values[1];
您可能需要空陷阱等。
而且该列最好不可编辑。
对于大多数数据网格,我将有一个视图模型来表示数据库中的每一行,并且我可以将计算等放在那里。所以会有一个 属性 对两列求和。
当然,我还有地方可以放置其他逻辑,例如验证。
直接绑定到数据表非常有限。
作为替代方案,您可以将 sql-查询修改为:
"select *, (Pcs_DC_col * Qty_multi_col) as Qty_DC_col from [products]"
然后正常绑定到该列。 (或任何列名)
我正在编写显示数据网格中产品数据的应用程序(我第一次使用 WPF)。我成功地将数据网格与 MS SQL 数据库连接起来。我坚持创建计算列。 我有兴趣将两列的值相乘。我想使用 Pcs_DC_col 和 Qty_multi_col 来计算 Qty_DC_col[ 中的值=50=]。 据我了解,我必须使用转换器,并且因为我使用超过 1 列,所以我应该使用 IMultiValueConverter。但是不知道如何编写代码来显示与空白单元格或 dependencyproperty.unsetvalue 不同的内容。我应该添加或更改什么才能使其正常工作?
XAML代码:
<Window.Resources>
<local:ColumnConverter x:Key="ColumnConversion"/>
</Window.Resources>
<Grid>
<DataGrid x:Name="matrix" SelectionUnit="FullRow" SelectionChanged="PLU_row_selected"
AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="PLU" Binding="{Binding PLU}"/>
<DataGridTextColumn Header="config" Binding="{Binding config}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Colour" Binding="{Binding Colour}"/>
<DataGridTextColumn Header="Promo" Binding="{Binding Promo}"/>
<DataGridTextColumn Header="Department" Binding="{Binding Department}"/>
<DataGridTextColumn Header="Category" Binding="{Binding Category}"/>
<DataGridTextColumn Header="Price" Binding="{Binding Price}"/>
<DataGridTextColumn x:Name="Pcs_DC_col" Header="Pc.s DC" Binding="{Binding Pcs Dc}"/>
<DataGridTextColumn Header="Allocated Pcs" Binding="{Binding Allocated Pcs}"/>
<DataGridTextColumn x:Name="Qty_DC_col" Header="Qty DC">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ColumnConversion}">
<Binding ElementName="Pcs_DC_col" Path="Text"/>
<Binding ElementName="Qty_multi_col" Path="Text"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
<DataGridTextColumn Header="Qty All" Binding="{Binding obliczenia}"/>
<DataGridTextColumn Header="Qty Tra" Binding="{Binding Qty Tra}"/>
<DataGridTextColumn Header="Qty Str" Binding="{Binding Qty Str}"/>
<DataGridTextColumn x:Name="Qty_multi_col" Header="Qty multiple" Binding="{Binding Qty Multiple}"/>
<DataGridTextColumn Header="% all" Binding="{Binding Percent_Allo}"/>
<DataGridTextColumn Header="Value all" Binding="{Binding Value_allocated}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
转换器代码:
public class ColumnConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null) return 0;
try
{
return String.Format("{0}", values[0]);
}
catch
{
return 0;
}
} // Convert()
此版本显示空白列,如果我更改代码:
return String.Format("{0}", values[0]);
用dependencyproperty.unsetvalue填满我的专栏。
编码如何将数据从数据库加载到网格:
private void load_products_to_grid()
{
SqlConnection myConnection = new SqlConnection();
myConnection.ConnectionString = @"Server = batorego426\coreSQL; Database = CorpCore; Integrated Security=true;";
myConnection.Open();
SqlCommand query = new SqlCommand();
query.CommandText = "select * from [products]";
query.Connection = myConnection;
SqlDataAdapter adapter = new SqlDataAdapter(query);
DataTable product_table = new DataTable("products");
adapter.Fill(product_table);
matrix.ItemsSource = product_table.DefaultView;
}
编辑:
我按照安迪的建议更改了出价
<DataGridTextColumn x:Name="Qty_DC_col" Header="Qty DC">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ColumnConversion}">
<Binding Path="Pcs_DC_col"/>
<Binding Path="Qty_multi_col"/>
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
和转换器代码:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null) return 0;
return (int)values[0]*(int)values[1];
}
但我仍然得到空列,我尝试更改转换器中的代码以检查是否可以看到任何值:
String.Format("{0}", values[0]);
然后在该列中得到 "dependencyproperty.unsetvalue"。所以我猜数据仍然没有连接,甚至不为空但没有 tset。我还能做什么?
您在多重绑定中的绑定应该是数据和列名。如果它们是 Pcs_DC_col 和 Qty_multi_col 那么
<MultiBinding Converter="{StaticResource ColumnConversion}">
<Binding Path="Pcs_DC_col"/>
<Binding Path="Qty_multi_col"/>
</MultiBinding>
object[] values 数组将包含两个值。这些可能是双重的,但据代码所知,这些只是对象,因此将它们转换并加在一起。 Return 作为一个数字。类似于:
return (double)values[0] * (double)values[1];
您可能需要空陷阱等。 而且该列最好不可编辑。
对于大多数数据网格,我将有一个视图模型来表示数据库中的每一行,并且我可以将计算等放在那里。所以会有一个 属性 对两列求和。 当然,我还有地方可以放置其他逻辑,例如验证。 直接绑定到数据表非常有限。
作为替代方案,您可以将 sql-查询修改为:
"select *, (Pcs_DC_col * Qty_multi_col) as Qty_DC_col from [products]"
然后正常绑定到该列。 (或任何列名)