【发布时间】: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