`
尚将军
  • 浏览: 34478 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

DevExpress的GridControl控件绑定动态数据时列排序问题解决

阅读更多
GridControl是一个表格组件,可以格式化显示结构数据。其基本使用方法如下:
<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>

分享到:
评论

相关推荐

    DevExpress GridControl控件加入图片列动态加载图片

    DevExpress GridControl是一款强大的数据网格控件,广泛应用于Windows Forms、ASP.NET、WPF等平台,为开发者提供了丰富的功能,用于创建复杂的数据展示和编辑界面。本文将深入探讨如何在GridControl中实现图片列的...

    DevExpress GridControl控件任意列添加小图片

    综上所述,添加小图片到DevExpress GridControl的非图片列是一项涉及自定义列模板、数据绑定、事件处理、样式调整等多个环节的任务。通过精心设计和实施,可以使GridControl更富表现力,提升用户体验。

    devexpress表格控件gridcontrol图片列,按钮列,时间列等特殊列的实现

    在开发过程中,我们经常需要在数据展示时使用到表格控件,其中DevExpress的GridControl是一款功能强大的组件,它提供了丰富的自定义能力,包括创建非文本类型的特殊列,如图片列、按钮列、时间列等。在本文中,我们...

    DevExpress中GridControl的属性设置及动态绑定数据和全选取消全选

    DevExpress的GridControl是一款强大的数据网格控件,广泛应用于Windows Forms、ASP.NET以及WPF等平台。在本文中,我们将深入探讨如何配置GridControl的属性,实现动态数据绑定,以及添加全选和取消全选的功能。 ...

    Devexpress GridControl冻结头部几行

    标题"Devexpress GridControl冻结头部几行"涉及的是一个常见的需求,即在用户滚动数据时保持列标题(通常包含列名)始终可见。这种功能对于查看大量数据时保持数据上下文非常有用。 实现这个功能,我们可以利用...

    DevExpress GridControl GridView新增行数据解决方案

    在开发过程中,我们可能会遇到在GridView中添加新行数据时遇到数据为空或者无法自动刷新的问题。本篇文章将深入探讨这个问题及其解决方案。 首先,当试图在GridView中添加新的数据行时,如果数据为空,可能的原因有...

    DevExpress简单的数据绑定

    在DevExpress GridControl中,数据绑定使你可以将数据集、实体框架模型或其他数据结构映射到控件的行和列,实现数据的实时更新。 2. **数据源选择** GridControl支持多种数据源,如DataTable、List、Entity ...

    DevExpress控件--GridControl合并表头

    GridControl支持丰富的特性,包括但不限于自定义列、数据绑定、筛选、排序、分组、打印、导出等。在本篇内容中,我们将重点介绍如何使用DevExpress GridControl进行不规则列头(即合并表头)的处理。 #### 二、实现...

    DevExpress.12.1 gridControl 动态添加行

    在本案例中,我们关注的是DevExpress的12.1版本中的gridControl,一个功能强大的数据网格控件。gridControl允许开发者在应用程序中展示、编辑和管理大量数据,而动态添加行是它的一个关键特性。 动态添加行是指在...

    devexpress的GridControl控件

    DevExpress的GridControl是一款强大的数据网格控件,广泛应用于Visual Studio开发环境中,特别是与VB.NET搭配使用时。在VS2010这个平台上,GridControl提供了丰富的功能,使得开发者能够构建出具有高度交互性和定制...

    DevExpress.XtraGrid.GridControl绑定List笔记

    遇到列名显示异常的问题时,检查数据模型、数据源设置以及列配置是解决问题的关键步骤。通过以上的方法,我们可以确保GridControl按照预期显示数据,同时提高代码的可读性和用户体验。希望这个解决方案能帮助到那些...

    DevExpress GridControl

    DevExpress GridControl 是一款高级的表格控件,被广泛应用于Windows Forms应用程序中,用于展示和管理复杂的数据集。本篇将基于提供的文件内容对DevExpress GridControl的使用方法进行深入探讨。 #### 初始化及...

    devexpress表格控件gridcontrol禁用特定行

    在开发Windows Forms或ASP.NET应用程序时,DevExpress的GridControl是一个常用的高性能数据呈现控件。它提供了丰富的功能,包括但不限于数据编辑、排序、过滤、分页等。然而,在某些情况下,我们可能需要根据业务...

    DevExpress的GridView动态绑定数据集,多线程动态修改UI自动刷新

    这样可以提高性能,特别是在处理大量数据时。 接下来,多线程操作UI(特别是修改)需要特别注意,因为WinForms不支持在非UI线程中直接修改控件。为了解决这个问题,我们可以使用`Control.Invoke`或`Control....

    DevExpress-GridControl新增数据

    DevExpress GridControl 是一款功能强大的数据网格控件,广泛应用于Windows Forms、ASP.NET、WPF以及MVVM等开发环境中。这款控件提供了丰富的功能,包括数据编辑、排序、分组、过滤、汇总等,使得开发者能够轻松创建...

    获得GridControl表格指定列的模板列控件的值.docx

    在WPF应用程序中使用DevExpress控件库时,我们经常会遇到需要获取`GridControl`表格中指定列的模板列控件的值的需求。例如,在进行数据绑定、交互逻辑处理或数据验证时,可能需要读取用户在特定单元格中的输入。本文...

    DevExpress_GridControl使用(图文)

    DevExpress GridControl 控件的强大之处在于其高度自定义能力和灵活的数据绑定机制。以下是一个简单的示例,展示了如何构建并显示一个包含多个字段的表格。 1. **创建数据表**: ```csharp private DataTable ...

    DevExpress GridControl的例子

    在处理大量数据时,GridControl的表现尤为出色,不仅能够高效地呈现数据,还支持多种视图模式,包括网格视图、卡片视图和带状网格视图等。 #### 二、复选框多选列实现步骤 实现复选框多选列主要涉及以下几个步骤:...

    GridControl控件.doc

    通过上述步骤,我们可以看到DevExpress GridControl控件的强大之处在于它提供了灵活的数据展示方式、列编辑能力以及数据绑定支持。对于需要在Windows Forms应用中高效展示复杂数据的应用场景来说,GridControl控件是...

    DevExpress-gridcontrol控件的简单使用

    在本示例中,我们使用的版本是DevExpress 14.1.4,它提供了丰富的功能,包括数据绑定、排序、分组、过滤、汇总以及自定义格式化等。以下将详细介绍如何在VB.NET 2010中使用GridControl控件进行基本操作。 1. **数据...

Global site tag (gtag.js) - Google Analytics