WPF DataGrid ComboBoxColumn не обновляет связанные данные - PullRequest
0 голосов
/ 16 мая 2018

У меня есть выпадающий столбец в моей таблице данных, параметры для комбинированного списка хранятся в таблице tmfCNCComponentStatus_threed . В моей главной таблице есть столбец с именем [Status], который соответствует ключевому столбцу в этой таблице.

Правильный статус [Описание] отображается в поле со списком для каждой строки в моей таблице данных, но когда пользователь меняет выбор, база данных не обновляется, даже если все выглядит так, как будто она работает правильно. У меня "UpdateSourceTrigger" установлен в PropertyChanged, как видно на многих похожих постах, но до сих пор нет кубиков. Любая идея будет принята с благодарностью!

<CollectionViewSource x:Key="StatusItems"/>

                               <DataGridTemplateColumn x:Name="StatusColumn" Header="Status" Width="*" IsReadOnly="False">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock x:Name="cboStatus" Text="{Binding Path=Description}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox x:Name="StatusCombo" SelectedValuePath="CNCComponentStatusKey" DisplayMemberPath="Description" SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Source={StaticResource StatusItems}}" IsEditable="True" IsSynchronizedWithCurrentItem="True"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

Код позади:

Dim com As String = "SELECT tmfCNCComponent_threed.[CNCComponentKey]
    ,tmfCNCComponent_threed.[CompanyID]
    ,tmfCNCComponent_threed.[JobNumber]
    ,tmfCNCComponent_threed.[LogNumber]
    ,tmfCNCComponent_threed.[Customer]
    ,tmfCNCComponent_threed.[DueDate]
    ,tmfCNCComponent_threed.[JobLeader]
    ,tmfCNCComponent_threed.[CADProgrammer]
    ,tmfCNCComponent_threed.[Salesperson]
    ,tmfCNCComponent_threed.[CNCProgrammer]
    ,tmfCNCComponent_threed.[ComponentDescription]
    ,tmfCNCComponent_threed.[ComponentFilePath]
    ,tmfCNCComponent_threed.[Material]
    ,tmfCNCComponent_threed.[ComponentSizeX]
    ,tmfCNCComponent_threed.[ComponentSizeY]
    ,tmfCNCComponent_threed.[ComponentSizeZ]
    ,tmfCNCComponent_threed.[QuantityShown]
    ,tmfCNCComponent_threed.[QuantityMirror]
    ,tmfCNCComponent_threed.[UpdateTime]
    ,tmfCNCComponent_threed.[Status]
    ,tmfCNCComponent_threed.[ProgStarted]
    ,tmfCNCComponentStatus_threed.[Description]
    FROM [test_3DimensionalDB].[dbo].[tmfCNCComponent_threed]
    INNER JOIN tmfCNCComponentStatus_threed
    ON tmfCNCComponent_threed.Status = tmfCNCComponentStatus_threed.CNCComponentStatusKey 
    WHERE [ComponentDescription] " & component & " 'trode%' AND [CompanyID]='" & company & "' AND [Status]" & status & "ORDER BY [UpdateTime] DESC"

    Dim Adpt As New SqlDataAdapter(com, con)
    con.Open()
    Dim ds As New DataSet()
    Adpt.Fill(ds, "dbo.tmfCNCComponent_threed")
    dataGrid1.ItemsSource = ds.Tables("dbo.tmfCNCComponent_threed").DefaultView

    con.Close()

    con.Open()
    Dim statusCVS As CollectionViewSource = FindResource("StatusItems")

    Dim com2 As String = "SELECT * FROM tmfCNCComponentStatus_threed"
    Dim AdptStatus As New SqlDataAdapter(com2, con)
    AdptStatus.Fill(ds, "dbo.tmfCNCComponentStatus_threed")

    Dim statusRows = ds.Tables("dbo.tmfCNCComponentStatus_threed").Rows
    Dim statuses As New List(Of Object)

    For Each row As DataRow In statusRows
        statuses.Add(New With {
        .Status = CInt(row("CNCComponentStatusKey")),
        .Description = CStr(row("Description"))
    })
    Next

    statusCVS.Source = statuses
    con.Close()


    RowCount()
    searchBox.Clear()

Спасибо за ваше время.

База данных:

enter image description here

Содержание таблицы состояния: enter image description here

Датагрид: enter image description here

Вот первая часть этого вопроса, которая была адресована вчера, чтобы донести до меня: Часть 1

1 Ответ

0 голосов
/ 16 мая 2018

Исходя из информации в комментариях к другому вопросу, вам, вероятно, нужно изменить SelectedValuePath="Status" на SelectedValuePath="CNCComponentStatusKey". Имена столбцов или свойства элементов в выпадающем списке имеют решающее значение для ответа на этот вопрос, и вы их не предоставили.

Сетка обновит значение столбца DataRowView, когда ячейка выйдет из режима редактирования.

Mode=TwoWay для этой привязки не требуется. Это режим по умолчанию для привязок на ComboBox.SelectedValue.

Вы можете удалить все эти украшения из привязки на TextBlock.Text: он вообще не может обновлять источник, когда вы думаете об этом, поэтому нет необходимости загромождать ваш XAML подробными инструкциями о том, как и когда это делать. должен сделать что-то, что он не может сделать в любом случае


Полный рабочий пример

Это код, с которым я проверял ответ выше. Обновляет строки в главной таблице. Это не сохраняет таблицу в базу данных. Это отдельная вещь.

Я не знаю, если ваши колонки не называются, как вы думаете, или как.

MainWindow.xaml.cs

    public MainWindow()
    {
        InitializeComponent();

        LoadData();
    }

    #region Lists
    private static List<String> _status = new List<String>
    {
        "Ready",
        "Not Ready",
        "Weary",
        "Disordered",
    };

    private static List<String> _words = new List<String>
    {
        "Ewwrigowasaus",
        "Skubreuph",
        "Creecroicr",
        "Eunthaudrawtr",
        "Ootwoww",
        "Meuleetroithr",
        "Rewshr",
        "Scoysl",
        "Scewziexul",
        "Kawxayzeec",
    };
    #endregion Lists

    protected void LoadData()
    {
        DataTable dtMain = new DataTable();

        dtMain.Columns.Add("Status", typeof(int));
        dtMain.Columns.Add("Programmer", typeof(String));

        _words.ForEach(w =>
        {
            var row = dtMain.NewRow();
            row[0] = ((int)w[0] % 2) + 1;
            row[1] = w;
            dtMain.Rows.Add(row);
        });

        DataTable dtStatus = new DataTable();

        dtStatus.Columns.Add("CNCComponentStatusKey", typeof(int));
        dtStatus.Columns.Add("Description", typeof(String));

        _status.ForEach(s =>
        {
            var row = dtStatus.NewRow();
            row[0] = dtStatus.Rows.Count + 1;
            row[1] = s;
            dtStatus.Rows.Add(row);
        });

        DataGrid.ItemsSource = dtMain.DefaultView;

        var cvs = (FindResource("StatusItems") as CollectionViewSource);

        cvs.Source = dtStatus.DefaultView;
    }

MainWindow.xaml

<Window.Resources>
    <CollectionViewSource x:Key="StatusItems" />
</Window.Resources>
<Grid>
    <DataGrid x:Name="DataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Programmer}" Header="Programmer" />
            <DataGridTemplateColumn Header="Status">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Status}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ComboBox
                                ItemsSource="{Binding Source={StaticResource StatusItems}}"
                                SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}"
                                DisplayMemberPath="Description"
                                SelectedValuePath="CNCComponentStatusKey"
                                x:Name="Combo"
                                />
                            <!-- Selected value in combo -->
                            <Label Content="{Binding SelectedValue, ElementName=Combo}" />
                            <!-- Value of Status column in row -->
                            <Label Content="{Binding Status}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
...