zoukankan      html  css  js  c++  java
  • DevExpress

    1. DevExpress.XtraTreeList控件
            将其简称为tree,tree其实就是一个树表控件,他像树一样包含具有父子关系的若干节点,同时每个节点又是一个带有多个字段的记录。其用法非常简单方便,只需要为其配置带有父子关系的数据源,其就可以按照树的形式进行显示。
    1.1 DevExpress.XtraTreeList配置数据源
       数据源一般是一个二维表,可以是数据库中的表,该表中要包含表示父子关系的两个字段,即主键和父亲的主键。下面的代码是手动创建的数据源DataTable。

    C# code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DataTable dtAllPath = new DataTable("dtAllPath");
                dtAllPath.Columns.Add("nodeID"typeof(int));
                dtAllPath.Columns.Add("parNodeID"typeof(int)); 
                dtAllPath.Columns.Add("stateName"typeof(string));
                dtAllPath.Columns.Add("stateCode"typeof(string));
                dtAllPath.Columns.Add("condition"typeof(string));
                dtAllPath.Rows.Add(new object[] { 1, 0, "1""1""" });
    dtAllPath.Rows.Add(new object[] { 2, 0, "2""2""" });
    dtAllPath.Rows.Add(new object[] { 3, 1, "1.1""1.1""" });
    dtAllPath.Rows.Add(new object[] { 4, 2, "2.1""2.1""" });
    treeList1.DataSource = dtAllPath;


    上面的代码中,nodeID是每行记录的主键,parNodeID是每行记录的父亲记录的主键,0表示树的根结点。最后一行代码是将生成的数据源交给 tree显示。当然为了完成树的显示工作,还需要配置tree的KeyFieldName属性为nodeID,ParentFieldName属性为 parNodeID(选中tree,在vs的属性窗口设置),还需要为tree添加列并配置该列与数据源中的字段对应关系,右键tree控件选择 run designer弹出下图,FieldName用来配置对应关系,tree中添加了两列,第一列和stateCode对应,designer可以 配置tree的各种属性,列标题,cell中的字体颜色等等,不再一一赘述。

    1.2 DevExpress.XtraTreeList添加checkbox
       在tree的结点中添加checkbox是一项非常实用常见的功能,设置起来非常简单,选中tree,在VS的属性窗口中,找到OptionsViewShowCheckBoxes,将其设置为true,即可。
    1.3 DevExpress.XtraTreeList列表中添加ComboBox
      在tree控件中直接对信息进行编辑,有时可能需要用到ComboBox控件,具体添加方法,右键/run designer/选择列 /ColumnEdit/New,为该列创建一个内嵌的ComboBox控件,即repositoryItemComboBox,具体如下图所示。
     
    1.4 repositoryItemComboBox下拉表不能显示
      通过repositoryItemComboBox的click事件,向其动态add下拉列表中的items后,点击 repositoryItemComboBox的下拉按钮,下拉列表闪一下就消失了(不是在click事件中添加items的情况,不会出现此问题)。解 决方案,在repositoryItemComboBox的ButtonClick事件中,将事件源sender转换为ComboBoxEdit,再利用 add函数添加item,最后手动显示下拉列表,代码如下:
    ComboBoxEdit combo = sender as ComboBoxEdit;            combo.Properties.Items.Add(…);
    combo.ShowPopup();

    1.5 DevExpress.XtraTreeList设置焦点函数setFocusedNode()无效
       当使用TreeListNode addedNode = treeList1.AppendNode(参数略),向tree中添加一个节点后,一 般想立刻使这个新添加的节点获得焦点,但此时如果直接使用treeList1.SetFocusedNode(addedNode)则无效,可能是因为 addedNode中不包含tree为其分配的nodeID(猜测),解决方案是 treeList1.SetFocusedNode(treeList1.FindNodeByKeyID(stateID));即利用findnode 之类的函数去查询tree,找到新添加的结点,在将该节点作为SetFocusedNode的参数,则可以完成焦点的设置。
    1.6 DevExpress.XtraTreeList查找结点函数FindNodeByKeyID()无效
      tree的find这类函数,在进行查找时,需要注意参数的类型,例如,这个函数FindNodeByKeyID()是根据数据源里的主键进行结点查 找,即你需要给定tree对应数据源中的记录的key,如果数据源中的key是整型,而我们利用一个字符串类型作为参数的 话, FindNodeByKeyID(”100”)将不能找到节点,正确的写法应该是FindNodeByKeyID(100)。
    1.7 DevExpress.XtraTreeList部分结点添加checkbox或者图片
       有些时候,不想在所有节点前都添加checkbox或者想在结点前添加图片,此时需要手动添加事件CustomDrawNodeCheckBox的 处理函数,在函数中为某些结点定制checkbox,或者图片,本处只着重说明定制checkbox,关于结点图片的代码可以参考网址 https://www.devexpress.com/Support/Center/Question/Details/Q142494。上码,上 图,如下:

    C# code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    private void treeList2_CustomDrawNodeCheckBox(object sender, DevExpress.XtraTreeList.CustomDrawNodeCheckBoxEventArgs e)
            {
                String variID = e.Node.GetValue("variID").ToString();//e.Node为tree的结点
                //满足该条件的结点,为其设置checkbox,其他结点没有checkbox
                if (variID == "")
                {
                    DevExpress.XtraTreeList.ViewInfo.IndentInfo ii = treeList2.ViewInfo.RowsInfo[e.Node].IndentInfo;
                    int x2 = e.Bounds.Left + ii.LevelWidth / 2;
                    int y2 = e.Bounds.Top + e.Bounds.Height / 2;
                    int h2 = e.Bounds.Height / 2 + 1;
                    Rectangle r1 = new Rectangle(e.Bounds.Left, y2, e.Bounds.Width, 1);
                    Rectangle r2 = new Rectangle(x2, y2, 1, h2);
                    e.Graphics.FillRectangle(treeList2.ViewInfo.RC.TreeLineBrush, r1);
                    if (e.Node.Expanded)
                    {
                        e.Graphics.FillRectangle(treeList2.ViewInfo.RC.TreeLineBrush, r2);
                    }
                    e.Handled = true;
                }
            }


     
    2. DevExpress.XtraGrid控件使用
    该控件类是一个表格控件,但是其具有很多方便而使用的功能,例如可以对记录进行分组,可以再记录的前面加上checkbox,可以将具有相同值的cell 进行合并等等。Grid分为两部分,DevExpress.XtraGrid.GridControl  和 DevExpress.XtraGrid.Views.Grid.GridView,GridControl  主要负责数据源、控件整体尺寸等等方面的 控制,GridView主要负责控件是否允许编辑、是否显示分组等信息,具体可以见VS属性窗口(本人也是限定在使用上,具体该控件为什么要分为两部分, 每部分从设计的角度来讲起到什么作用等,还没有具体研究)。Grid的数据源的设置同tree类似,不在赘述,这里主要想介绍一下下面几个问题:
    2.1 DevExpress.XtraGrid分组
    设置好数据源后,只需要设置grid的groupIndex就可分组,操作:右键/run designer/colums/选择一个列/设置 GroupIndex(当然设置前,你需要为grid添加一些column才可以)。分组需要以某一个列进行分组,该列必须要对应到数据源中的某个字段, 即分组是按照数据源中的某些字段进行分组。grid可以显示多组,第一组的分组列的groupIndex为0,第二组的分组列的groupIndex为 1,依此类推。下例中classID的groupIndex为0,stuNum的groupIndex为1。为了直观、易于理解,编了个小例子,上段代码 和效果图,具体如下:

    C# code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    DataTable dt = new DataTable("table1");
                dt.Columns.Add("classID"typeof(int));
                dt.Columns.Add("className"typeof(String));
                dt.Columns.Add("stuNum"typeof(int));
                dt.Columns.Add("stuName"typeof(String));
                dt.Columns.Add("courseName"typeof(String));
                dt.Columns.Add("hours"typeof(String));
                dt.Columns.Add("grade"typeof(String));
                 
                dt.Rows.Add(new object[] { 1, "计算机101班", 2014001, "李强""数据库""64""90"});
                dt.Rows.Add(new object[] { 1, "计算机101班", 2014001, "李强""操作系统""64""100" });
                dt.Rows.Add(new object[] { 1, "计算机101班", 2014001, "李强""软件工程""64""80" });
                dt.Rows.Add(new object[] { 1, "计算机101班", 2014002, "王伟""数据库""64""90" });
                dt.Rows.Add(new object[] { 1, "计算机101班", 2014002, "王伟""数据库""64""90" });
                dt.Rows.Add(new object[] { 1, "计算机101班", 2014002, "王伟""数据库""64""90" });
                 
                dt.Rows.Add(new object[] { 2, "计算机102班", 2014003, "孙明""数据库""64""90" });
                dt.Rows.Add(new object[] { 2, "计算机102班", 2014003, "孙明""操作系统""64""100" });
                dt.Rows.Add(new object[] { 2, "计算机102班", 2014003, "孙明""软件工程""64""80" });
                dt.Rows.Add(new object[] { 2, "计算机102班", 2014004, "赵敏""数据库""64""100" });
                dt.Rows.Add(new object[] { 2, "计算机102班", 2014004, "赵敏""数据库""64""90" });
                dt.Rows.Add(new object[] { 2, "计算机102班", 2014004, "赵敏""数据库""64""70" });




    2.2 DevExpress.XtraGrid修改分组标题
       如上图所示,分为两组,每组的标题为“列标题:值”,上例为“班级ID:1”,但有时需要根据记录中的值,动态修改分组标题。为gridView1 添加CustomDrawGroupRow事件响应函数(注意是GridView而不是GridControl),在函数动态修改标题,为了不显示重复信 息,可以将班级和学生姓名列隐藏。上码,上图,如下:

    C# code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    private void gridView1_CustomDrawGroupRow(object sender, DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs e)
            {
                DevExpress.XtraGrid.Views.Grid.ViewInfo.GridGroupRowInfo groRowInf = e.Info as 
                    DevExpress.XtraGrid.Views.Grid.ViewInfo.GridGroupRowInfo;
                int rowHan = groRowInf.RowHandle;
                int rowLev = gridView1.GetRowLevel(rowHan);
                if (rowLev == 0)
                {
                    groRowInf.GroupText = "班级:" + gridView1.GetDataRow(rowHan)["className"].ToString();
                }
                if (rowLev == 1)
                {
                    groRowInf.GroupText = gridView1.GetDataRow(rowHan)["stuName"].ToString();
                }
            }


     

    2.3 DevExpress.XtraGrid添加行号
       为了添加行号,需要添加GridView事件CustomDrawRowIndicator的处理函数,函数中每组所在行的索引从-1开始减小,普 通记录行从0开始增加。注意需要在grid所在的窗体的加载事件(或者其他的form事件)处理函数中,加上一个代码 gridView1.IndicatorWidth = 50;
    ,否则行号不能显示,原因没去研究。注意,当记录较多grid出现滚动条时,下述代码会导致行号错乱,需要注意,这里只是给出显示行号所需要的一些基本知识和原理。上码,上图,如下:

    C# code?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    private void Form1_Load(object sender, EventArgs e)
            {
                gridView1.IndicatorWidth = 50;
            }
    private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
            {
                if (e.Info.IsRowIndicator)
                {
                    if (gridView1.GetRowLevel(e.RowHandle) < 2)
                    {
                        e.Info.DisplayText = (-e.RowHandle).ToString();
                    }
                }
                gridView1.UpdateColumnsCustomization();
            }

     

    3. 关于DevExpress的一些资料
    上面大致的介绍了,tree和grid的使用方法,其实不是很难,只是对于新手而言,可以作为一个简单的参考,下面再介绍一下当时找到的一些技术贴,供大家参考。
    3.1 给TreeList的根和子节点弹出不同的右键菜单
    http://blog.locoy.com/read-8.html
    3.2 DevExpress窗体统一换肤
    http://blog.csdn.net/educast/article/details/4730631
    3.3 DevExpress在线帮助文档
    https://documentation.devexpress.com/#WindowsForms/DevExpressXtraBarsWinRTLiveTilesWinRTLiveTileManagerMembersTopicAll
    4. 总结
    写将近小两天的时间,总结了一些东西,希望对于新手上路有些帮助,文中如有误导还请各位大神及时批评指正。其实项目中还有一些关于DevExpress使 用方法的一些难点和问题,但由于项目结题已有三个月的时间,实在是记不得当时是哪里出现的问题,以及如何解决的,下次争取遇到就记录下来。最后还是要感谢 那些分享自己技术经历的各位大师,感谢能够热心解答新手问题的各位好友,感谢大家的分享,让我们借助网络,我为人人,人人为我,能让我们在一个又一个的项 目赶工中时刻感受到大家的力量、同行的支持,共同前行。

  • 相关阅读:
    Mybatis中Log4j日志的使用
    Mybatis结果集ResultMap映射
    Mybatis中的基本对象的生命周期和作用域
    IAR瑞萨单片机开发加入printf调试函数
    【转】C语言mem.h中的函数介绍
    【转】c语言位域操作—_结构体内冒号:的使用
    串口数据传输当中的共用体和结构体转换
    【转】printf格式串中的%f的输出格式和内容
    【转】缓冲区设计--环形队列(C++)
    【转】环形队列理论(C语言)
  • 原文地址:https://www.cnblogs.com/zeroone/p/5057148.html
Copyright © 2011-2022 走看看