- 浏览: 32177 次
- 性别:
- 来自: 南京
最新评论
GridControl是一个表格组件,可以格式化显示结构数据。其基本使用方法如下:
在上述例子中,GridControl的列在xaml文件里已经设定,顺序是排好的。当GridControl的控件在cs文件定义,通过binding进行绑定的时候,序列就会按照对象属性定义的先后进行排列了。这就带来一个问题。比如基类A定义了两个属性A1和A2,继承基类A的类B定义了两个属性B1和B2。当我们将B的实例绑定到视图中的GridControl时,显示的顺序是A1,A2,B1,B2。而我们希望的顺序是B1,A1,B2,A2,这个问题怎么处理呢?
问题解决主要包含以下步骤:
1)定义两个类:A和B
2)将类B的实例与GridControl绑定
3)定义GridControl列排序xml文件
4)读取上述xml文件,将该排序定义绑定到GridControl
具体过程:
1)定义两个类:A和B
2)将类B的实例与GridControl绑定
viewmodel(Bviewmodel.cs)如下:
xaml(BModel.xaml)文件定义如下:
3)定义GridControl列排序xml文件
order.xml:
4)读取上述xml文件,将该排序定义绑定到GridControl
定义读取xml通用函数:
定义列信息:
修改viewmodel,添加列排序定义字段并在构造函数中读取xml:
在xaml中绑定列排序定义:
<dxg:GridControl x:Name="grid" CustomUnboundColumnData="grid_CustomUnboundColumnData"> <dxg:GridControl.Columns> <dxg:GridColumn FieldName="Number1" /> <dxg:GridColumn FieldName="Number2" /> <dxg:GridColumn FieldName="Text1" /> <dxg:GridColumn FieldName="Text2" /> </dxg:GridControl.Columns> <dxg:GridControl.View> <dxg:TableView x:Name="view" AutoWidth="True" CellValueChanged="view_CellValueChanged" /> </dxg:GridControl.View> </dxg:GridControl>
在上述例子中,GridControl的列在xaml文件里已经设定,顺序是排好的。当GridControl的控件在cs文件定义,通过binding进行绑定的时候,序列就会按照对象属性定义的先后进行排列了。这就带来一个问题。比如基类A定义了两个属性A1和A2,继承基类A的类B定义了两个属性B1和B2。当我们将B的实例绑定到视图中的GridControl时,显示的顺序是A1,A2,B1,B2。而我们希望的顺序是B1,A1,B2,A2,这个问题怎么处理呢?
问题解决主要包含以下步骤:
1)定义两个类:A和B
2)将类B的实例与GridControl绑定
3)定义GridControl列排序xml文件
4)读取上述xml文件,将该排序定义绑定到GridControl
具体过程:
1)定义两个类:A和B
namespace com.test{ public class A { public string A1{get;set;} public string A2{get;set;} } } namespace com.test{ public class B:A { public string B1{get;set;} public string B2{get;set;} } }
2)将类B的实例与GridControl绑定
viewmodel(Bviewmodel.cs)如下:
namespace com.test{ public class Bviewmodel: INotifyPropertyChanged { //应该在构造函数为该集合赋一些测试数据 private ObservableCollection<B> b_vm= new ObservableCollection<B>(); } public ObservableCollection<B> B_vm { get { return this.b_vm; } set { this.b_vm= value; } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyname) { PropertyChangedEventHandler propertyChanged = this.PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(propertyname)); } } }
xaml(BModel.xaml)文件定义如下:
<UserControl x:Class="com.test.BModel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:com.test" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:dxit="http://schemas.devexpress.com/winfx/2008/xaml/core/internal" xmlns:syscommon="clr-namespace:HTSys.Brokerage.SysCommon.DataConfig;assembly=HTSys.Brokerage.SysCommon" mc:Ignorable="d" d:DesignHeight="384" d:DesignWidth="612"> <UserControl.DataContext> <local:Bviewmodel /> </UserControl.DataContext> <Grid> <dxg:GridControl AutoGenerateColumns="None" ItemsSource="{Binding B_vm}" AllowLiveDataShaping="True"> <dxg:GridControl.View> <dxg:TableView AllowPerPixelScrolling="True" ShowTotalSummary="True" ShowGroupPanel="False" ShowFocusedRectangle="True" AllowEditing="False"/> </dxg:GridControl.View> </dxg:GridControl> </Grid> </UserControl>
3)定义GridControl列排序xml文件
order.xml:
<?xml version="1.0" standalone="yes"?> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="PenderOrder" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="B_order"> <xs:complexType> <xs:sequence> <xs:element name="B1" msdata:ReadOnly="true" msdata:Caption="B属性1" type="xs:string" minOccurs="0" /> <xs:element name="A属性1" msdata:ReadOnly="true" msdata:Caption="证券代码" type="xs:string" minOccurs="0" /> <xs:element name="B2" msdata:ReadOnly="true" msdata:Caption="B属性2" type="xs:string" minOccurs="0" /> <xs:element name="A2" msdata:ReadOnly="true" msdata:Caption="A属性2" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema>
4)读取上述xml文件,将该排序定义绑定到GridControl
定义读取xml通用函数:
namespace com.test { /// <summary> /// 视图的grid列设置 /// </summary> public class GridSettingCommon { private string moduleName; private string viewName; /// <summary> /// grid所在模块名称,用以区分同一grid在不同模块中的显示情况 /// </summary> public string ModuleName { get { return this.moduleName; } set { this.moduleName = value; } } /// <summary> /// grid所在视图名称 /// </summary> public string ViewName { get { return this.viewName; } set { this.viewName = value; } } public GridSettingCommon(string moduleName, string viewName) { this.moduleName = moduleName; this.viewName = viewName; } /// <summary> /// 依据用户ID,获取对应设置 /// </summary> /// <param name="userID"></param> /// <returns></returns> public List<GridColumInfoCommon> GetGridSettingByName(string xmpPath, string userID = "0", bool isTest = true) { DataTable dt = this.GetGridSettingDataTable(xmpPath); List<GridColumInfoCommon> columnInfoList = new List<GridColumInfoCommon>(); if (isTest) { if (dt != null && dt.Columns.Count > 0) { int i = 0; foreach (DataColumn col in dt.Columns) { GridColumInfoCommon gridColumn = new GridColumInfoCommon(); gridColumn.FieldName = col.ColumnName; gridColumn.Header = col.Caption; gridColumn.VisibleIndex = i++; columnInfoList.Add(gridColumn); } } } return columnInfoList; } private DataTable GetGridSettingDataTable(string xmpPath, bool isTest = true) { DataTable dt = new DataTable(); try { if (isTest) { string path = this.GetSchemaName(xmpPath); dt.ReadXmlSchema(path); } } catch (Exception ex) { //System.Windows.MessageBox.Show("获取配置信息失败!错误原因:" + ex.Message); } return dt; } private string GetSchemaName(string xmpPath,bool isTest = true) { string schemaName = string.Empty; if (isTest) { //if (viewName == "StockQuotationByPosition") schemaName = AppDomain.CurrentDomain.BaseDirectory + xmpPath; } return schemaName; } } }
定义列信息:
namespace com.test { public class GridColumInfoCommon { public string Header { get; set; } public string FieldName { get; set; } public string BindingPath { get; set; } public int VisibleIndex { get; set; } } public class ColumnInfoBehaviorCommon : Behavior<GridColumn> { public static readonly DependencyProperty ColumnInfoProperty = DependencyProperty.RegisterAttached("ColumnInfoCommon", typeof(GridColumInfoCommon), typeof(ColumnInfoBehaviorCommon), new PropertyMetadata(null, OnColumnInfoChanged)); public static GridColumInfoCommon GetColumnInfoCommon(DependencyObject obj) { return (GridColumInfoCommon)obj.GetValue(ColumnInfoProperty); } public static void SetColumnInfoCommon(DependencyObject obj, GridColumInfoCommon value) { obj.SetValue(ColumnInfoProperty, value); } static void OnColumnInfoChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) { GridColumn c = o as GridColumn; if (e.NewValue != null) Interaction.GetBehaviors(c).Add(new ColumnInfoBehaviorCommon() { Info = (GridColumInfoCommon)e.NewValue }); } public static readonly DependencyProperty InfoProperty = DependencyProperty.Register("Info", typeof(GridColumInfoCommon), typeof(ColumnInfoBehaviorCommon), new PropertyMetadata(null, (d, e) => ((ColumnInfoBehaviorCommon)d).OnInfoChanged())); public GridColumInfoCommon Info { get { return (GridColumInfoCommon)GetValue(InfoProperty); } set { SetValue(InfoProperty, value); } } void OnInfoChanged() { if (Info == null) return; if (AssociatedObject == null) return; if (Info.FieldName != null) AssociatedObject.FieldName = Info.FieldName; if (Info.BindingPath != null) AssociatedObject.Binding = new Binding() { Path = new PropertyPath(Info.BindingPath) }; } protected override void OnAttached() { base.OnAttached(); OnInfoChanged(); } } public class ColumnTemplateSelectorCommon : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { GridColumnInfo column = (GridColumnInfo)item; return (DataTemplate)((Control)container).FindResource("DefaultColumnTemplate"); } } }
修改viewmodel,添加列排序定义字段并在构造函数中读取xml:
namespace com.test{ public class Bviewmodel: INotifyPropertyChanged { //应该在构造函数为该集合赋一些测试数据 private ObservableCollection<B> b_vm= new ObservableCollection<B>(); private ObservableCollection<GridColumInfoCommon> bColumns = new ObservableCollection<GridColumInfoCommon>(); public Bviewmodel() { GridSettingCommon gridSettingCommon = new GridSettingCommon("test", "test"); List<GridColumInfoCommon> columnListB = gridSettingCommon.GetGridSettingByName("order.xml"); if (columnListB != null) { foreach (GridColumInfoCommon columnInfoCommon in columnListB ) this.bColumns.Add(columnInfoCommon); columnListB.Clear(); } } public ObservableCollection<B> B_vm { get { return this.b_vm; } set { this.b_vm= value; } } public ObservableCollection<GridColumInfoCommon> BColumns { get { return this.bColumns ; } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyname) { PropertyChangedEventHandler propertyChanged = this.PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(propertyname)); } } }
在xaml中绑定列排序定义:
<UserControl x:Class="com.test.BModel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:com.test" xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid" xmlns:dxit="http://schemas.devexpress.com/winfx/2008/xaml/core/internal" xmlns:syscommon="clr-namespace:HTSys.Brokerage.SysCommon.DataConfig;assembly=HTSys.Brokerage.SysCommon" mc:Ignorable="d" d:DesignHeight="384" d:DesignWidth="612"> <UserControl.DataContext> <local:Bviewmodel /> </UserControl.DataContext> <Grid> <dxg:GridControl AutoGenerateColumns="None" ItemsSource="{Binding B_vm}" ColumnsSource="{Binding BColumns}" AllowLiveDataShaping="True"> <dxg:GridControl.ColumnGeneratorStyle> <Style TargetType="dxg:GridColumn"> <Setter Property="Header" Value="{Binding Header}" /> <Setter Property="com.test:ColumnInfoBehaviorCommon.ColumnInfoCommon" Value="{Binding DataContext, RelativeSource={RelativeSource Mode=Self}}" /> <Setter Property="VisibleIndex" Value="{Binding Path=(dxit:DependencyObjectExtensions.DataContext).VisibleIndex, RelativeSource={RelativeSource Self}}" /> </Style> </dxg:GridControl.ColumnGeneratorStyle> <dxg:GridControl.View> <dxg:TableView AllowPerPixelScrolling="True" ShowTotalSummary="True" ShowGroupPanel="False" ShowFocusedRectangle="True" AllowEditing="False"/> </dxg:GridControl.View> </dxg:GridControl> </Grid> </UserControl>
相关推荐
在CridControl中根据列表中的记录,根据不同的状态或者判断动态加载不同的图片,以达到不同的状态或者类别记录加载不同的图片,让效果更佳。
有时候需要在Gridcontrol中某一列添加一个小图片,以方便用户点击操作。这个例子是gridcontrol非图片列中添加小图片,进行相关的操作。
解决DevExpress GridControl GridView 在新增数据行时数据为空的问题,新窗口数据返回时自动新增行并刷新。
项目中经常会在表格中插入按钮列,图片列,表格列一些非文本的特殊列。如何在devexpress表格控件gridcontrol中实现呢?以下列举一个实现添加图片列,按钮列,时间列,按钮列,开关列的示例。
devexpress表格控件gridcontrol实现对列统计,可实现总计,平均,求和等。
DevExpress GridControl控件使用DevExpress GridControl控件使用DevExpress GridControl控件使用DevExpress GridControl控件使用DevExpress GridControl控件使用
devexpress表格控件gridcontrol实现纵向标头,在官网中找到一些案例整理给大家分享
在winform项目中,使用Devexpress GridControl控件,可能会遇到需要冻结头部几行的需求,本项目实例可以帮到你。
DevExpress中GridControl的属性设置 (只读,得到当前选定记录某字段的值) 及动态绑定数据和全选/取消全选功能。
C# winform DevExpress 使用GridControl组件实现拖动排序功能,此文档中是完整Demo示例,原文参考 https://blog.csdn.net/xiaoid/article/details/95954708#commentBox 文献,加以修改并进行关键代码注释
针对DevExpress GridControl GridView 新增行AddNewRow() 很多人加了代码也无法实现添加行或者添加行后InitNewRow这个事件没有触发, 其中主要原因见附件实例代码!
只能导出导出devexpress插件的GridControl控件中GridView表格中的数据,表格中有什么数据导出什么数据,列顺序也不变。 文件说明: 1.ExportTableExcel.cs:实现导出逻辑的类 2.ExportExcelStyle.cs:导出的...
简单纯C#代码控制表头合并和动态添加列。文件包里包含所需Devexpress的DLL文件,项目中引用就可以直接运行
控制DevExpress中GridControl合并单元格方式
DevExpress简单的GridControl 数据绑定
dev空间中GridControl自定义添加列以及不规则列头处理,涉及到列头分组问题
今天用到了devexpress的gridcontrol,只想自己添加数据,而不是简单的用datatable绑定,网上搜索了一下,并没有任何可用的解决方案,而且几个关键的地方都无法解决,象initNewRow之类的同样无法触发。花了一点时间...
针对DevExpress中的GridControl控件整理的详细的说明文件,包含该控件所有属性的翻译说明,常用属性设置以及常用编程处理案例说明
一些特殊的项目中会出现禁用行的需求,这里分享一个devexpress表格控件gridcontrol实现禁用特定行的案例
DevExpress 编辑GridControl中合并单元格,要求版本号在15以上