DevExpress03、XtraGrid(1)基本应用

一、属性预览

image

外观设置:

image


避免单击记录后整行选中的问题

OptionsBehavior->EditorShowMode 设置为:Click

可选值:Default / MouseDown / MouseUp / Click /MouseDownFocused

让行只能选择而不能编辑(或编辑某一单元格)

OptionsBehavior->EditorShowMode 设置为:Click

OptionsBehavior->Editable 设置为:false

设置只读属性

gridView1.Columns[0].OptionsColumn.ReadOnly = true;

禁用 GridControl 中 单击列 弹出右键菜单

OptionsMenu->EnableColumnMenu 设置为:false

隐藏 GridControl 的GroupPanel 表头

OptionsView->ShowGroupPanel 设置为:false

显示水平滚动条,宽度自动调整

a. 只需禁用宽度自动调整,自然就会出现水平滚动条
this.gridView.OptionsView.ColumnAutoWidth = false;
补充一句: olumnAutoWidth 为true时,则表示: 各列的宽度自动调整

b. 列表宽度自适应内容
gridview1.BestFitColumns();

创建一种使用TreeList控件的基窗体时,在外观层中调用BestFitColumns()不起作用,

原因是TreeList控件还未添加到实际的窗体中,它还不知道自己的大小,所以它的列无法按内容自适应宽度,

把它移到基窗体的添加TreeList控件之后,此时还是不成功,

在添加TreeList控件之后和调用BestFitColumns()之前,调用TreeList控件的ForceInitialize(),这样BestFitColumns()就起作用了。

这样它的意思就是TreeList控件首先已经添加到窗体,然后本身也我完成了初始化,然后它才能按内容自适应宽度。

列自动匹配宽度

//自动调整所有字段宽度 this.gridView1.BestFitColumns(); //调整某列字段宽度 this.gridView1.Columns[n].BestFit();

//自动调整所有字段宽度
this.gridView1.BestFitColumns();

//调整某列字段宽度
this.gridView1.Columns[n].BestFit();

如何禁用列头的过滤器

设置 Run Design->OptionsCustomization->AllowFilter 设置为:false

列拖动

只要是在列属性里把AllowMove设置了True(它的默认值本身是True),在程序运行时,用户都可以拖动列标题来改变列的位置。该属性可以通过属 性编辑器设置,在Columns-->Columns Options选项卡下的AllowMove。也可以通过代码设置,如:

gridView1.Columns[0].OptionsColumn.AllowMove = true;

筛选

只要该列的Filter Options选项卡的AllowFilter属性不为False就可以进行筛选。

该属性通过代码设置是

this.bandedGridColumn2.OptionsFilter.AllowFilter = false;

运行程序后,鼠标指针移动到列标题,单击漏斗状图形经行筛选操作。

排序

只要该列的ColumnsOptions的AllowSort属性不为False就可以根据那一列的数据进行排序。(AllowSort属性 在属性编辑器的Columns的Columns Options选项卡。)设置Column properties下的SortOrder值。

或者通过代码,例如:

this.bandedGridColumn2.OptionsColumn.AllowSort=  DevExpress.Utils.DefaultBoolean.Default| DevExpress.Utils.DefaultBoolean.True;
this.bandedGridColumn2.SortOrder= DevExpress.Data.ColumnSortOrder.Ascending

另外在程序运行时,单击某列的列头也可以对该列进行排序。

设置成一次选择一行,且不能被编辑

只需要设置以下三个属性即可

gridView1.OptionsBehavior.Editable = false;
gridView1.OptionsSelection.EnableAppearanceFocusedCell = false;
gridView1.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFocus;

设某一列标题文字 居中显示

gridView1.Columns[0].AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;     gridView1.Columns[0].AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;

设置列过滤条件为多选

列名.OptionsFilter.FilterPopupMode = DevExpress.XtraGrid.Columns.FilterPopupMode.CheckedList

显示出自带的搜索功能

OptionsFind -> 将AlwaysVisible : 设置为 True

设置选中行的颜色

Appearences : selectRow & FocusedRow (两项都要设置)

  • BackColor : MediumSlateBlue 背景色
  • ForeColor : White 前景色 字体颜色

隔行换色的方法

// 设置奇数行颜色,默认也是白色 可以省略 
gridView1.Appearance.OddRow.BackColor = Color.White;  
// 使所有的奇数行 允许 应用 界面上的设置 
gridView1.OptionsView.EnableAppearanceOddRow = true;  

// 设置偶数行颜色  
gridView1.Appearance.EvenRow.BackColor = Color.WhiteSmoke; 
// 使所有的偶数行 允许 应用 界面上的设置 
gridView1.OptionsView.EnableAppearanceEvenRow = true;

旋转木马”特效:

GridView,CardView、BandedView、Advanced BandedView、LayoutView共5种。

1)、view组中把OptionView下的ViewMode 设置成“Carousel”就达到这种“旋转木马”式 的特效了

2)、layoutView1.OptionsCarouselMode.PitchAngle 这个属性决定“旋转木马”的:pitch angle 螺距角; 

3)、Roll Angle 属性决定着 倾斜角度

4)、指定数据源,显示数据:

//显示数据         
private void showData(List<Girl > list){
    DataTable table = new DataTable("Girl");             
    table.Columns.Add("Name", System.Type.GetType("System.String"));             
    table.Columns.Add("Anime", System.Type.GetType("System.String"));             
    tablet.Columns.Add("PhotoName", System.Type.GetType("System.Byte[]"));
    
    for (int i = 0; i < list.Count; i++){
        DataRow row = table.NewRow();                 
        row["Name"] = list[i].Name;                 
        row["Anime"] = list[i].Anime;                 
        string imagePath = @"D:C#photos" + list[i].PhotoPath;                 
        row["PhotoName"] = encapsulation_getImageByteWithFullPath(imagePath);                 
        table.Rows.Add(row);            
     }             
    // 核心代码
    gridControl1.DataSource = table;         
}  

// 返回图片的字节流byte[]         
private byte[] encapsulation_getImageByteWithFullPath(string imagePath){
    FileStream files = new FileStream(imagePath, FileMode.Open);             
    byte[] imgByte = new byte [files.Length];             
    files.Read(imgByte, 0, imgByte.Length);             
    files.Close();             
    return imgByte;         
}

分组显示

OptionsView>OptionsBehavior>AutoExpandAllGroups = True

选择要分组的列,将GroupIndex属性设置为0

分组

GridView view = gridControl1.MainView as GridView;
[] sortInfo = {
    new GridColumnSortInfo(view.Columns["Chinese"], ColumnSortOrder.Ascending)
};
view.SortInfo.(sortInfo, 2);

GridColumnSortInfo 数组存放的是分组的列的信息,调用ClearAndAddRange清除结果并进行分组。

分组名称自定义

GridControl控件分组时,分组的名称仅仅是当前分组的字段名称,如果我们想按下图一样自定义分组,要怎么做呢?

自定义方法

使用分组行绘制事件

private void gridView1_CustomDrawGroupRow(object sender, DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs e)
{
    var info = (GridGroupRowInfo)e.Info;
    var count=info.View.GetChildRowCount(e.RowHandle);
    info.GroupText = string.Format("{0},票数:{1}", info.GroupText, count);
}

使用CustomColumnDisplayText事件

private void gridView_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) {
    if (e.Column.FieldName == "Order Sum" && e.IsForGroupRow) {
        double rowValue = Convert.ToDouble(gridView.GetGroupRowValue(e.GroupRowHandle, e.Column));
        double val = Math.Floor(rowValue / 100);
        string groupRowInterval = string.Format("{0:c} - {1:c} ", val * 100, (val + 1) * 100);
        if (val > 14)
            groupRowInterval = string.Format(">= {0:c} ", val * 100);
        e.DisplayText = "Order Sum: " + groupRowInterval;
    }
}

使用GroupFormat属性

使用分组统计项(推荐)

gridView1.GroupSummary.Add(DevExpress.Data.SummaryItemType.Count, "Name", null, "({0}票)");
gridView1.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, "Volume", null, "({0}CMB)");

自定义属性

获取分组计数:GridView.GetChildRowCount

分页栏

XtraGrid提供分页栏。通过这个设置可以显示出来。

gridControl1.UseEmbeddedNavigator = true;

如果要根据滚动条滚动实现翻页功能的,那得依靠Scroll事件。它又没像DataGridView那样开放滚动条事件,不过里面有一个事件可以替代Scroll事件,那就是TopRowChanged,例子如下:

private void gridView1_TopRowChanged(object sender, EventArgs e)
{
    if (gridView1.IsRowVisible(gridView1.RowCount - 1) == RowVisibleState.Visible) //如果滚到了底端
    {
        people.AddRange(new Person[] { Person1, Person2, Person3, Person4, Person5 });
    }
}

如果硬要获取滚动条对象来设置,则可以用下面这段代码获取gridView的滚动条。

Type type = gridView1.GetType();
FieldInfo fi = type.GetField("fViewInfo", BindingFlags.NonPublic | BindingFlags.Instance);
GridViewInfo info = gridView1.GetViewInfo() as GridViewInfo;
fi = type.GetField("scrollInfo", BindingFlags.NonPublic | BindingFlags.Instance);
ScrollInfo scrollInfo = fi.GetValue(gridView1) as ScrollInfo;

键盘快捷键控制单元格

这个效果发现只使用与gridView这种视图,同样通过上,下,左,右四个方向的导航键控制光标移动,按回车进入编辑状态,按Esc键不保存更改内容,按回车保存更改内容。

this.gridView1.OptionsSelection.MultiSelect = true;
this.gridView1.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CellSelect;
this.gridView1.OptionsSelection.UseIndicatorForSelection = false;

添加右击菜单一个很常用的功能

添加ContextMenuStrip控件,然后自定义按钮,可以找一些16*16的小图标点缀一下,很不错

这样一个右键菜单就已经绑定成功。

添加底部统计行

设置显示Footer:OptionsView > ShowFooter

设置GridView中的Summary字段或者手动设置统计列:

gridView1.Columns["Quantity"].Summary.Add(DevExpress.Data.SummaryItemType.Average, "Quantity", "Avg={0:n2}");
this.bandedGridColumn2.SummaryItem.SummaryType= DevExpress.Data.SummaryItemType.Average;
bandedGridView1.Columns["绑定字段列名"].Summary[0].DisplayFormat = string.Format("小计{0}条", bandedGridView1.RowCount);

父子表

当绑定的数据源中的子项存在集合时,XtraGrid会自动启用子表。例如上面的在Person类里多添加一个成员 List<Person> Friends{get;set;}表示那个人的朋友圈子,在任意一个实例中把Person实例添加进去,再启动程序时,就会发现父子表的效果实现了。

若要对子表的进行设置,可以给MainView添加MasterRowExpanded事件,例如:

private void gridView1_MasterRowExpanded(object sender, CustomMasterRowEventArgs e)
{
    //获取子表
    AdvBandedGridView gv = (AdvBandedGridView)gridView1.GetDetailView(e.RowHandle, e.RelationIndex);
    //第一个参数是行号,第二个参数是父子表关联索引

    if (gv != null)
    {
        //对子表设置
    }
}

合并表头

在选择视图时,选择BandedGridView和AdvBandedGridView都是支持设置条带状的列。在属性编辑器的Bands处可以对条带进行管理,直接拖动列标题可以设置该列属于哪个条带。通过Bands属性可以对各个条带进行管理。

https://blog.csdn.net/kone0611/article/details/73739941

1、第一步将表格类型由默认的gridview变为bandedgridview,如图所示:

2、第二步添加数据列,与gridview添加数据列相同,设置好绑定字段及其他属性,如图:

3、设计多重表头,如图所示,最上面的表头为Band,可以添加,然后再按自己的要求摆放。

4、拖放完后大致的效果图如下:

合并表头

using DevExpress.XtraEditors.Repository;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.BandedGrid;
using DevExpress.XtraGrid.Views.Base;
using System;
using System.Collections.Generic;
namespace WindowsFormsApplication2
{
    public partial class Form1 : DevExpress.XtraEditors.XtraForm
    {
        public Form1()
        {
            InitializeComponent();
            //首先拖到窗体上一个GridControl,在表格上点击“Click here to change view”链接,在弹出菜单中选择“convert to”-->“AdvBandedGridView”。
            InitGrid();
        }
        private void XtraForm1_Load(object sender, EventArgs e)
        {
        }
        ///初始化表格
        private void InitGrid()
        {
            // advBandedGridView1是表格上的默认视图,注意这里声明的是:BandedGridView
            BandedGridView view = advBandedGridView1 as BandedGridView;
            view.BeginUpdate(); //开始视图的编辑,防止触发其他事件
            view.BeginDataUpdate(); //开始数据的编辑
            view.Bands.Clear();
            //修改附加选项
            view.OptionsView.ShowColumnHeaders = false;                         //因为有Band列了,所以把ColumnHeader隐藏
            view.OptionsView.ShowGroupPanel = false;                            //如果没必要分组,就把它去掉
            view.OptionsView.EnableAppearanceEvenRow = false;                   //是否启用偶数行外观
            view.OptionsView.EnableAppearanceOddRow = true;                     //是否启用奇数行外观
            view.OptionsView.ShowFilterPanelMode = ShowFilterPanelMode.Never;   //是否显示过滤面板
            view.OptionsCustomization.AllowColumnMoving = false;                //是否允许移动列
            view.OptionsCustomization.AllowColumnResizing = false;              //是否允许调整列宽
            view.OptionsCustomization.AllowGroup = false;                       //是否允许分组
            view.OptionsCustomization.AllowFilter = false;                      //是否允许过滤
            view.OptionsCustomization.AllowSort = true;                         //是否允许排序
            view.OptionsSelection.EnableAppearanceFocusedCell = true;           //是否焦点显示选中的单元格
            view.OptionsBehavior.Editable = false;                             //是否允许用户编辑单元格
            //添加列标题
            GridBand bandID = view.Bands.AddBand("ID");
            bandID.Visible = false; //隐藏ID列
            GridBand bandName = view.Bands.AddBand("姓名");
            GridBand bandSex = view.Bands.AddBand("性别");
            GridBand bandBirth = view.Bands.AddBand("出生日期");
            GridBand bandScore = view.Bands.AddBand("分数");
            GridBand bandMath = bandScore.Children.AddBand("数学");
            GridBand bandChinese = bandScore.Children.AddBand("语文");
            GridBand bandEnglish = bandScore.Children.AddBand("英语");
            GridBand bandSubTotal = bandScore.Children.AddBand("小计");
            GridBand bandRemark = view.Bands.AddBand("备注");
            //列标题对齐方式
            bandName.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            bandSex.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            bandBirth.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            bandScore.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            bandMath.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            bandChinese.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            bandEnglish.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            bandSubTotal.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            bandRemark.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
            //模拟几个数据
            List<Record> listDataSource = new List<Record>();
            listDataSource.Add(new Record(1, "张三", "", Convert.ToDateTime("1989-5-6"), 115.5f, 101, 96, ""));
            listDataSource.Add(new Record(2, "李四", "", Convert.ToDateTime("1987-12-23"), 92, 85, 87, ""));
            listDataSource.Add(new Record(3, "王五", "", Convert.ToDateTime("1990-2-11"), 88, 69, 41.5f, ""));
            listDataSource.Add(new Record(4, "赵六", "", Convert.ToDateTime("1988-9-1"), 119, 108, 110, "备注行"));
            //绑定数据源并显示
            gridControl1.DataSource = listDataSource;
            gridControl1.MainView.PopulateColumns();
            //[小计]这一列因为没绑定数据源,所以需要手动添加
            //(有点复杂,慢慢看吧)
            string[] fieldNames = new string[] { "SubTotal" };
            GridColumn column;   //声明单列
            column = view.Columns.AddField(fieldNames[0]);  //添加一个数据字段
            column.VisibleIndex = view.Columns.Count - 1;  //设置该列在编辑视图时的显示位置(倒数第二列)
            column.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
            column.OptionsColumn.AllowEdit = false;     //此列不可编辑
            column.Visible = true;
            view.Columns.Add(column);   //视图中添加一列
            //绑定事件,当[分数]改变时[小计]也跟着变
            //(好像只有在绑定事件里才能改变该单元格数值,直接修改无效)
            view.CustomUnboundColumnData += new
                DevExpress.XtraGrid.Views.Base.CustomColumnDataEventHandler(advBandedGridView1_CustomUnboundColumnData);
            //[性别]列绑定ComboBox
            RepositoryItemComboBox riCombo = new RepositoryItemComboBox();
            riCombo.Items.AddRange(new string[] { "", "" });
            gridControl1.RepositoryItems.Add(riCombo);
            view.Columns["Sex"].ColumnEdit = riCombo;
            //[出生年月]列绑定Date
            RepositoryItemDateEdit riDate = new RepositoryItemDateEdit();
            gridControl1.RepositoryItems.Add(riDate);
            view.Columns["Birth"].ColumnEdit = riDate;
            //[分数]列绑定SpinEdit
            RepositoryItemSpinEdit riSpin = new RepositoryItemSpinEdit();
            gridControl1.RepositoryItems.Add(riSpin);
            view.Columns["Math"].ColumnEdit = riSpin;
            view.Columns["Chinese"].ColumnEdit = riSpin;
            view.Columns["English"].ColumnEdit = riSpin;
            //[备注]列绑定MemoExEdit
            RepositoryItemMemoExEdit riMemoEx = new RepositoryItemMemoExEdit();
            gridControl1.RepositoryItems.Add(riMemoEx);
            view.Columns["Remark"].ColumnEdit = riMemoEx;
            //小计列添加汇总
            view.OptionsView.ShowFooter = true;     //显示表格页脚
            view.Columns["SubTotal"].SummaryItem.FieldName = "SubTotal";
            view.Columns["SubTotal"].SummaryItem.DisplayFormat = "{0:f2}";
            view.Columns["SubTotal"].SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Average;
            //将标题列和数据列对应
            view.Columns["ID"].OwnerBand = bandID;
            view.Columns["Name"].OwnerBand = bandName;
            view.Columns["Sex"].OwnerBand = bandSex;
            view.Columns["Birth"].OwnerBand = bandBirth;
            view.Columns["Math"].OwnerBand = bandMath;
            view.Columns["Chinese"].OwnerBand = bandChinese;
            view.Columns["English"].OwnerBand = bandEnglish;
            view.Columns["SubTotal"].OwnerBand = bandSubTotal;
            view.Columns["Remark"].OwnerBand = bandRemark;
            view.EndDataUpdate();//结束数据的编辑
            view.EndUpdate();   //结束视图的编辑
        }
        // 计算小计
        private float calcSubTotal(float math, float chinese, float english)
        {
            return math + chinese + english;
        }
        private void advBandedGridView1_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e)
        {
            ColumnView colView = sender as ColumnView;
            if (e.Column.FieldName == "SubTotal" && e.IsGetData) e.Value = calcSubTotal(
                     Convert.ToSingle(colView.GetRowCellValue(e.RowHandle, colView.Columns["Math"])),
                     Convert.ToSingle(colView.GetRowCellValue(e.RowHandle, colView.Columns["Chinese"])),
                     Convert.ToSingle(colView.GetRowCellValue(e.RowHandle, colView.Columns["English"])));
        }
        #region 运行时绑定到实现Ilist接口的数据源
        public class Record
        {
            private int id;
            private DateTime birth;
            private string name, sex, remark;
            private float math, chinese, english;
            public Record(int id, string name, string sex, DateTime birth, float math, float chinese, float english, string remark)
            {
                this.id = id;
                this.name = name;
                this.sex = sex;
                this.birth = birth;
                this.math = math;
                this.chinese = chinese;
                this.english = english;
                this.remark = remark;
            }
            public int ID { get { return id; } }
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public string Sex
            {
                get { return sex; }
                set { sex = value; }
            }
            public DateTime Birth
            {
                get { return birth; }
                set { birth = value; }
            }
            public float Math
            {
                get { return math; }
                set { math = value; }
            }
            public float Chinese
            {
                get { return chinese; }
                set { chinese = value; }
            }
            public float English
            {
                get { return english; }
                set { english = value; }
            }
            public string Remark
            {
                get { return remark; }
                set { remark = value; }
            }
        }
        #endregion 运行时绑定到实现Ilist接口的数据源
    }
}

自定义列显示文本

比如数值为0时显示为空白, 使用CustomColumnDisplayText事件

private void gridView1_CustomColumnDisplayText(object sender,CustomColumnDisplayTextEventArgs e) {
   if(e.Column.FieldName == "Discount")
      if(Convert.ToDecimal(e.Value) == 0) e.DisplayText = "";
}

使用StyleFormatCondition类进行条件格式化

界面操作:在对GridControl绑定好数据后:
  No.1:右键GridControl选择Run Designer;
  No.2:Appearance下Style Conditions点击Add,需要注意的是每一个变色条件都得Add一个变色方案;
  No.3:在Properties中需要用到的属性依次往下详解为: Appearance下BackColor=255.255.128,BackColor2=255.255.128,此项指定符合特定条件时单元格/行背景颜色,如果两项设置颜色不同时则为渐变效果;

StyleFormatCondition condition1 = new DevExpress.XtraGrid.StyleFormatCondition();
condition1.Column = gvData.Columns["AuditStatus"];
condition1.Appearance.BackColor =  Color.FromArgb(56, 173, 40);
condition1.Appearance.Options.UseBackColor = true;
condition1.Condition = FormatConditionEnum.Expression;
condition1.Expression =  "AuditStatus=='已审核'";

gvData.FormatConditions.Add(condition1);//审核状态(色块)
原文地址:https://www.cnblogs.com/springsnow/p/10298971.html