在项目中遇到的一个实际问题。现在有一个DataTable,希望能够自动显示在DataGrid中,但是因为有一个外键的关系,所以希望用ComboBox在定制某一列。xaml的方式比较死板,所以想用代码进行解析。直接上代码,稍后逐步解释。

1. DataGrid 初始化时分配数据(相应Initialized事件)

// first of all, manually create a DataTable dt.Columns.Add( new DataColumn( " id " , typeof ( int ))); dt.Columns.Add( new DataColumn( " name " , typeof ( string ))); dt.Columns.Add( new DataColumn( " 测试 " , typeof ( string ))); // insert lines DataRow dr = dt.NewRow(); dr[ " id " ] = 1 ; dr[ " name " ] = " BB1 " ; dr[ " 测试 " ] = " 测试1 " ; dt.Rows.Add(dr); dr = dt.NewRow(); dr[ " id " ] = 2 ; dr[ " name " ] = " BB2 " ; dr[ " 测试 " ] = " 测试2 " ; dt.Rows.Add(dr); dr = dt.NewRow(); dr[ " id " ] = 3 ; dr[ " name " ] = " BB3 " ; dr[ " 测试 " ] = " 测试3 " ; dt.Rows.Add(dr); dataGrid.DataContext = dt;
private void OnDataGridAutoGeneratingColumn(
            object sender, DataGridAutoGeneratingColumnEventArgs e)
            // 只想干涉“id”列
            if (e.PropertyName == "id")
                // 模拟出外键所在的表
                DataTable dt = new DataTable("test");
                // first of all, manually create a DataTable
                dt.Columns.Add(new DataColumn("id", typeof(int)));
                dt.Columns.Add(new DataColumn("name", typeof(string)));
                // insert lines
                DataRow dr = dt.NewRow();
                dr["id"] = 5;
                dr["name"] = "CC1";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr["id"] = 6;
                dr["name"] = "CC2";
                dt.Rows.Add(dr);
                dr = dt.NewRow();
                dr["id"] = 7;
                dr["name"] = "CC3";
                dt.Rows.Add(dr);
                // 方法一:使用DataGridTemplateColumn定制ComboBox,有点是不编辑时,也是显示为ConboBox的样子  
                DataGridTemplateColumn column = new DataGridTemplateColumn();
                column.Header = "id";
                DataTemplate datatemplate = new DataTemplate();
                FrameworkElementFactory fef = new FrameworkElementFactory(typeof(ComboBox));
                Binding binding = new Binding();
                binding.Source = dt.DefaultView;
                fef.SetBinding(ComboBox.ItemsSourceProperty, binding);
                Binding selectVal = new Binding("id");
                selectVal.Mode = BindingMode.TwoWay;
                fef.SetBinding(ComboBox.SelectedValueProperty, selectVal);
                fef.SetValue(ComboBox.DisplayMemberPathProperty, "name");
                fef.SetValue(ComboBox.SelectedValuePathProperty, "id");
                datatemplate.VisualTree = fef;
                column.CellTemplate = datatemplate;
                e.Column = column;
                //方法二:使用DataGridConboBoxColumn,功能与上面的等价
                //DataGridComboBoxColumn comboBoxColumn = new DataGridComboBoxColumn();
                //comboBoxColumn.Header = "fuck";
                //// ComboBox 选择后的值
                //comboBoxColumn.SelectedValuePath = "id";
                //// ComboBox 前台显示的值
                //comboBoxColumn.DisplayMemberPath = "name";
                //Binding binding = new Binding();
                //// 需要绑定的列
                //binding.Path = new PropertyPath("id");
//指定立即更新
//binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
//comboBoxColumn.SelectedValueBinding = binding; //Binding itemsSourceBinding = new Binding(); //itemsSourceBinding.Source = dt.DefaultView; //BindingOperations.SetBinding(comboBoxColumn, DataGridComboBoxColumn.ItemsSourceProperty, itemsSourceBinding); //e.Column = comboBoxColumn;

关于ComboBox的各个Property的意思,请参看http://blogs.msdn.com/b/vinsibal/archive/2008/10/31/wpf-datagrid-datagridcomboboxcolumn-v1-intro.aspx  , 里面有一个关于外键的例子。

关于DataGridTemplateColumn 的使用,主要参考了http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3ada4685-a032-4bf0-9514-f86c44967678?persist=True ,但是也有一点修改,主要是,一个Panel加进去之后就不工作了。。。

原文https://www.cnblogs.com/aicro/archive/2013/04/26/3044160.html

在项目中遇到的一个实际问题。现在有一个DataTable,希望能够自动显示在DataGrid中,但是因为有一个外键的关系,所以希望用ComboBox在定制某一列。xaml的方式比较死板,所以想用代码进行解析。直接上代码,稍后逐步解释。1. DataGrid 初始化时分配数据(相应Initialized事件) // 在这里第一次加载数据 DataTabl...
C 是一种中级编程语言,由贝尔实验室的丹尼斯·里奇 (Dennis Ritchie) 开发。C 是 B 编程语言的继承者。那为什么叫中级呢?这是因为 C 编程语言代表了高级和低级编程的组合。 C是一种通用的,程序语言,是BU一世LT在Unix系统上的开发工作。Unix 内核是通过 C 编程语言重新实现的。C 可以处理具有最少运行时支持的机器指令。这就是为什么 C 被称为系统语言的原因。它还提供对计算机内存和语言结构的手动访问。 C 可以在各种平台上使用。因...
我在项目中想用datagridview来实现这种功能,看了若干博客,msdn也翻了半天,终于有了一点理解。 这里有几个关键点: 1、datagridview控件的列的类型有多重,包括 (1)DataGridViewTextBoxColumn(文本列,默认的情况下就是这种) (2)DataGridViewComboBoxColu
MainWindow.xaml文件 <Window x:Class="WpfApp20140821.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
问题描述:使用VS2017开发WPF应用程序时需要用DataGrid显示数据,由于列数不确定,故采用DataTable作为数据源,然后出现了列重复的现象(无图),例如数据列是1、2两列,展示的效果是1、2、1、2四列。 分析原因:也许和.net环境有关,之前用VS2010进行同样的操作没有出现过这种问题。 解决方法:将DataGrid的自动创建列属性设置为false。即(DataGrid对象)...
最近项目有个需求需要动态扩展DataGrid,动态扩展列,cell的模板不一样,有的textbox,有的combox,并且需要后台绑定style设置datatrigger 先看combox的 DataGridTemplateColumn col = new DataGridTemplateColumn(); var stackPanelFactory = new FrameworkElementFactory(typeof(S
这段时间一直在进行WPF的开发,研究了ComboBox这个控件2天,发现了很多细节,这里分享给大家,也做一个自己的备忘。 这里主要对ComboBox这个控件对于绑定dictionary所用到的属性的设置问题。 先上Xaml代码:
public static DataTable DistinctSomeColumn(DataTable sourceTable, params string[] fieldName) if (fieldName == null || fieldName.Length == 0) return sourceTable; return sourceTable.AsEnumer...
WPF LiveCharts 是一个用于创建图表的库,您可以使用各种数据源来填充图表中的数据。要使用 LiveCharts,您需要在 WPF 项目中添加 LiveCharts 的 NuGet 包。然后,您可以使用 LiveCharts 的各种图表类型之一来显示数据。例如,您可以使用 `LineSeries` 来显示折线图,使用 `ColumnSeries` 来显示柱形图,或使用 `PieSeries` 来显示饼图。 要将数据源添加到 LiveCharts 图表中,您可以使用 `Series` 属性并将数据源设置为 `ItemsSource`。例如: <lvc:CartesianChart Series="{Binding MyDataSource}"> <lvc:LineSeries ItemsSource="{Binding}" /> </lvc:CartesianChart> 其中 `MyDataSource` 是您的数据源,可以是一个 `List<T>` 或其他类型的集合。 您还可以使用绑定将数据点的值绑定到图表中的各个属性。例如,要将每个数据点的日期绑定到图表的 X 轴,您可以使用 `lvc:LineSeries.Labels` 属性并将其绑定到您的数据源中的日期字段: <lvc:CartesianChart Series="{Binding MyDataSource}"> <lvc:LineSeries ItemsSource="{Binding}" Labels="{Binding Date}" /> </lvc:CartesianChart> 这样,LiveCharts 就会使用您的数据源中的日期字段来为图表的 X 轴设置标签。 希望这能帮到您!如