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组合框问题的主要内容,如果未能解决你的问题,请参考以下文章