Вычисление одного столбца из 2 в DataGrid через конвертер - PullRequest
0 голосов
/ 19 ноября 2018

Я пишу приложение (мое первое использование WPF), которое показывает данные для продуктов в сетке данных. У меня получилось соединить сетку данных с базой данных MS SQL. Я застрял на создании рассчитанного столбца. Я заинтересован в умножении значений из двух столбцов. Я хочу использовать Pcs_DC_col и Qty_multi_col для вычисления значений в Qty_DC_col . Из того, что я понимаю, я должен использовать конвертер, и поскольку я использую более 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 .

Код загрузки данных из базы данных в Grid:

  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;
    } 

EDIT:

Я изменил ставку, как Энди предложил

<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. Что еще я могу сделать?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

В качестве альтернативы вы можете изменить свой sql-запрос на:

"select *, (Pcs_DC_col * Qty_multi_col) as Qty_DC_col from [products]"

, а затем обычно связывается с этим столбцом. (или как называется столбец)

0 голосов
/ 19 ноября 2018

Ваши привязки в мультисвязке должны быть к данным и только к именам столбцов. Если это Pcs_DC_col и Qty_multi_col, то

<MultiBinding Converter="{StaticResource ColumnConversion}">
      <Binding  Path="Pcs_DC_col"/>
      <Binding  Path="Qty_multi_col"/>
</MultiBinding>

В массиве значений объекта [] будут два значения. Они предположительно двойные, но, насколько известно коду, это просто объекты, которые приводятся и складываются вместе. Верните это как число. Что-то вроде:

return (double)values[0] * (double)values[1];

Возможно, вам придется обнулить ловушку и т. Д. И этот столбец лучше не редактировать.

Для большинства сетей данных у меня была бы модель представления, представляющая каждую строку в базе данных, и я мог бы размещать в ней вычисления и т. Д. Так что будет свойство, которое суммирует два столбца. И, конечно, мне нужно было бы добавить другую логику, такую ​​как проверка. Привязка непосредственно к датируемому файлу довольно ограничена.

...