在项目中遇到的一个实际问题。现在有一个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 轴设置标签。
希望这能帮到您!如