【问题标题】:WPF DataGridTemplateColumn Combobox IssuesWPF DataGridTemplateColumn 组合框问题
【发布时间】:2018-07-15 03:24:14
【问题描述】:

我在弄清楚如何去做这件事时遇到了一些问题。我基本上希望在 DataGrid 中有一个 ComboBox(当前使用 DataGridTemplateColumn 和 ComboBoxItems),我可以从静态选项中进行选择。我还需要从组合框中选择一个选项并完成编辑要发送到我的 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>

我知道文本绑定可能不正确。似乎每次我使用此配置加载 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# 的新手。

【问题讨论】:

  • 状态如何存储在表中,通过状态代码(0 => 绿色,...)或仅作为字符串值?
  • 这是一个字符串值。 XAML 代码中的“标记”值是我试图找出各种解决方案的尝试。在 SQL 数据库/表中,它只是一个 varchar(50) 列。

标签: c# sql wpf visual-studio xaml


【解决方案1】:

当您调用更新方法时,编辑刚刚结束,因此尚未保存新值以进行更新。

您应该在更新前调用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>

【讨论】:

  • 但是如果我想添加一行到数据库中呢?添加 CommitEdit() 会如何改变?没有这个,TextBoxColumns 工作正常,所以我不确定如何实际获取我的 ComboBox 列,以便 save 我输入的数据。编辑:我尝试了您的解决方案,但它并没有改变我遇到的任何问题,所以我不确定还有什么可以尝试的。
  • CommitEdit 将验证输入数据作为该行的新值。并且当应用更新时,将采用新值。我已经编辑了代码。删除的两条线应该可以消除重复行的问题
  • 所以代码有些工作,但我仍然遇到一些奇怪的问题。在这张图片中,我显示了适当的先前记录。 i.imgur.com/KYYlMJ2.png 问题是当我添加新行(使用“CanUserAddRows”功能)时,它会添加 Tag 编号而不是内容。此外,前面的行在视图中不断重复,我不知道为什么。有什么进一步的建议吗?感谢您的帮助!这绝对比我得到的更远..
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多