首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过转换器从DataGrid中的2中计算一列

通过转换器从DataGrid中的2中计算一列
EN

Stack Overflow用户
提问于 2018-11-19 19:42:20
回答 2查看 122关注 0票数 0

我正在编写应用程序(这是我第一次使用WPF),该应用程序显示了数据仓库中的产品数据。我成功地将数据集与MS数据库连接起来。我坚持创建计算过的列。我感兴趣的是将两列的值相乘。我想使用Pcs_DC_colQty_multi_col来计算Qty_DC_col中的值。据我所知,我必须使用转换器,而且由于我使用的列超过1列,所以我应该使用IMultiValueConverter。但我不知道如何编写代码,让我看到一些与空白单元格或dependencyproperty.unsetvalue.不同的东西我应该添加或更改哪些内容以使其正常工作?

XAML代码:

代码语言:javascript
复制
<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>

转换器代码:

代码语言:javascript
复制
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()

此版本显示空白列,如果我更改以下代码:

代码语言:javascript
复制
 return String.Format("{0}", values[0]);

dependencyproperty.unsetvalue.填充我的专栏

代码如何将数据从数据库加载到网格:

代码语言:javascript
复制
  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;
    } 

编辑:

我按照安迪的建议改变了招投标

代码语言:javascript
复制
<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>

和转换器代码:

代码语言:javascript
复制
 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values == null) return 0;

            return (int)values[0]*(int)values[1];
    } 

但是我仍然得到了空列,我尝试在转换器中更改代码以检查是否可以看到以下任何值:

代码语言:javascript
复制
String.Format("{0}", values[0]);

然后在那一栏中输入"dependencyproperty.unsetvalue"。因此,我猜想数据仍然没有连接,甚至不是空的,但是没有tset。我还能做什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-19 20:09:47

您在多绑定中的绑定应该是与数据和列名绑定。如果他们是Pcs_DC_col和Qty_multi_col

代码语言:javascript
复制
<MultiBinding Converter="{StaticResource ColumnConversion}">
      <Binding  Path="Pcs_DC_col"/>
      <Binding  Path="Qty_multi_col"/>
</MultiBinding>

object[]值数组中将包含两个值。它们大概是双倍的,但据代码所知,这些只是对象,所以可以强制转换并将它们添加到一起。把它作为一个数字返回。类似于:

代码语言:javascript
复制
return (double)values[0] * (double)values[1];

您可能需要空、陷阱等,而该列最好是不可编辑的。

对于大多数数据集,我将有一个视图模型来表示出数据库中的每一行,并且我可以将计算等放在其中。所以会有一个属性,它把这两列相加。当然,我还有其他的逻辑,比如验证。直接绑定到datatable是非常有限的。

票数 0
EN

Stack Overflow用户

发布于 2018-11-19 20:36:53

作为另一种选择,您可以将sql-查询修改为:

代码语言:javascript
复制
"select *, (Pcs_DC_col * Qty_multi_col) as Qty_DC_col from [products]"

然后正常地绑定到那个列。(或列的名称)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53381567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档