WPF DataGridTemplateColumn组合框问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF DataGridTemplateColumn组合框问题相关的知识,希望对你有一定的参考价值。

我有一些问题正在弄清楚如何去做这件事。我基本上想在DataGrid中使用一个ComboBox(当前使用带有ComboBoxItems的DataGridTemplateColumn),我可以从静态选项中选择。我还需要从组合框中选择一个选项并完成编辑行以将数据/输入发送到我的SQL数据库表(STATUS)。我有一个DataGridTextColumn,但不是这个ComboBox类型。

在这个STATUS表中有四列,两个TextColumns和两个ComboBoxColumns。我已经让其他表格与ItemsSource和Bindings完美配合。不知道如何使用ComboBox列执行此操作。

当我加载此DataGrid时,过滤器应用(通过SQL查询)仅显示特定时间的特定行。我需要能够让SQL DB显示以前条目的正确数据。

XAML:

<DataGridTemplateColumn Header="STATUS" Width="512.5">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ComboBox Text="{Binding STATUS}" SelectedValue="{Binding STATUS, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                <ComboBoxItem Content="GREEN" Tag="0"/>
                <ComboBoxItem Content="YELLOW" Tag="1"/>
                <ComboBoxItem Content="ORANGE" Tag="2"/>
                <ComboBoxItem Content="RED" Tag="3"/>
            </ComboBox>
        </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我知道Text Binding可能不正确。似乎每次使用此配置加载DataGrid时,行都会复制相同的数据。

C#:

private static string GDC_ConnectionString = ConfigurationManager.ConnectionStrings["GDC_ConnectionString"].ConnectionString;
private static string CmdString;
private static SqlConnection con = new SqlConnection(GDC_ConnectionString);
private static SqlCommand cmd = new SqlCommand(CmdString, con);
private static SqlDataAdapter sda = new SqlDataAdapter(cmd);
private static DataTable dtPTR_STATUS = new DataTable("ptrSTATUS");

private void ptrSTATUS_GRID_Loaded(object sender, RoutedEventArgs e)
{
    //ApplyPTR_StatusFilter();
    CmdString = "SELECT * FROM STATUS WHERE CONVERT(date,DATE_STATUS,101) = CONVERT(date,GETDATE(),101)";
    cmd.CommandText = CmdString;
    sda.Fill(dtPTR_STATUS);
    ptrSTATUS_GRID.ItemsSource = dtPTR_STATUS.DefaultView;
}

private void ptrSTATUS_GRID_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
{
    using (SqlConnection con = new SqlConnection(GDC_ConnectionString))
    {
        con.Open();
        SqlCommandBuilder builder = new SqlCommandBuilder(sda);
        builder.GetInsertCommand();
        builder.GetUpdateCommand();
        sda.Update(dtPTR_STATUS);
        con.Close();
    }
}

Here's an image as an example of what I'm trying to achieve.

基本上,SQL DB /查询通过过滤器显示任何适当的行(并允许通过SqlBuilder GetUpdate命令进行编辑)。然后显示带有静态选项的新行,当行编辑结束时,将该数据发送到SQL数据库(由于SQL查询/过滤器而重新加载时,将显示该数据库)。使用ComboBox实际上是否可行?我已经使用常规的TextBoxColumns完美地工作了。

任何帮助,将不胜感激!对我来说,因为我是新手以及整个WPF / C#的任何错误道歉。

答案

当您调用更新方法时,编辑才会结束,因此尚未为更新保存新值。

您应该在更新之前调用EndEdit()方法。

    private void ptrSTATUS_GRID_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        if (e.EditAction == DataGridEditAction.Commit)
        {
            DataRowView rowView = e.Row.DataContext as DataRowView;
            rowView?.Row.EndEdit();
        }

        using (SqlConnection con = new SqlConnection(GDC_ConnectionString))
        {
            con.Open();
            SqlCommandBuilder builder = new SqlCommandBuilder(sda);

            sda.Update(dtPTR_STATUS);
            con.Close();
        }
    }

我还更新了XAML代码:

            <DataGridTemplateColumn Header="Status" MinWidth="512.5">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding STATUS}"></TextBlock>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox SelectedValue="{Binding STATUS, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
                                  SelectedValuePath="Tag">
                            <ComboBoxItem Content="GREEN" Tag="GREEN"/>
                            <ComboBoxItem Content="YELLOW" Tag="YELLOW"/>
                            <ComboBoxItem Content="ORANGE" Tag="ORANGE"/>
                            <ComboBoxItem Content="RED" Tag="RED"/>
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

以上是关于WPF DataGridTemplateColumn组合框问题的主要内容,如果未能解决你的问题,请参考以下文章

wpf窗体阴影

WPF 精修篇 Winform 嵌入WPF控件

wpf 用啥字体

wpf 添加动态图片

wpf编程 求大神指导如何用WPF制作一个论坛。。。!!急!!!

wpf和winform的区别