GridControl 控件笔记
Ø 简介
这是几年前的做 DevExpress 控件开发时做的笔记,现在由于时间关系就不去整理了。
给予初学者提供一些参考,少走弯路。
this.gridView1.Appearance属性可以获取行对象??this.gridView1.Appearance.OddRow.BackColor = Color.White; 可设置背景色?
一、GridControl
1) 设置GridView的样式(滚动条大小也会随着变化)
gridControl.LookAndFeel.UseDefaultLookAndFeel = false;
gridControl.LookAndFeel.SkinName = "Office 2010 Blue"; //可选项:DevExpress Style,VS2010,Seven Classic,Office 2010 Blue,Office 2010 Blue,Office 2010 Black,Office 2010 Silver,Office 2013
2) 设置GridView下面显示导航和分页 gridControl.UseEmbededNavigator=True; 就有导航和编辑按钮了。
二、GridView
注意:设置第12项后,整个gridView单元格都为只读,然后:1、可以添加MouseDown事件;2:gridView可以使用鼠标滚动轮
1、属性
1) 设置是否显示自动过滤行,设置属性 this.gridView1.OptionsView.ShowAutoFilterRow = true;
2) 设置是否自动列宽,设置属性 this.gridView1.OptionsView.ColumnAutoWidth = false;
3) 允许单元格合并,设置属性 this.gridView1.OptionsView.ShowAutoFilterRow = true;
4) 显示页脚,设置属性 this.gridView1.OptionsView.ShowFooter = true;
5) 设置是否显示表头分组框,设置属性 this.gridView1.OptionsView.ShowGroupPanel = false; 默认true
6) 显示指示器(第一列),设置属性 this.gridView1.OptionsView.ShowIndicator = false; 默认true
7) 显示最上端表格名称,设置属性 this.gridView1.OptionsView.ShowViewCaption = true;
8) 设置可添加新行的上/下位置或者不显示 this.gridView1.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom;
10) 表头文本设置 gridView.GroupPanelText = "表头文本";
11) 设置是否可编辑,设置属性 this.gridView1.OptionsBehavior.Editable = false; //鼠标的滚动轮滚动时gridView的滚动条也跟着滚动,需要设置
12) Editable还可以设置gruidView单元格不可编辑 this.gridView1.OptionsBehavior.Editable = false;
13) 设置是否显示过滤器(默认显示),设置属性 this.grid,设置属性.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
14) 设置每一列不能排序 gridView1.OptionsCustomization.AllowSort = false;
15) 获取光标列字段名 gridView1.FocusedColumn.FieldName;
16) 获取光标行句柄 gridView1.FocusedRowHandle; //如果为多选时,光标行也只会有一行。
17) 设置第一列(序号列)宽度 gridView1.IndicatorWidth = 40;
18) 设置最上端中间显示表格名称的字体大小和颜色 this.gridView1.ViewCaption = "表格名称"; //默认为"",如果为子明细,默认与父GridView.ViewCaption一致。
gridView1.Appearance.ViewCaption.Options.UseFont = true;
gridView1.Appearance.ViewCaption.Font = new System.Drawing.Font("Tahoma", 10F);
gridView1.Appearance.ViewCaption.Options.UseForeColor = true;
gridView1.Appearance.ViewCaption.ForeColor = System.Drawing.Color.Coral;
19) 获取gridView中的行数 this.gridView1.RowCount; 或者 this.gridView1.DataRowCount;
20) 设置是否只读,设置属性 this.gridView1.OptionsBehavior.ReadOnly = true;
21)设置是否可以多选,默认为false。this.gridView1.OptionsSelection.MultiSelect = true | false;
22)设置导出Excel自动列宽,设置this.gridView1.OptionPrint.AutoWidth = false;
23)设置自动行高(若某列文本项需要自动换行时,需在列上设置RepositoryItemMemoEdit),设置 this.OptionsView.RowAutoHeight = true;
24)设置是否显示底部(汇总栏),设置:gridView1.ShowFooter = true; //默认为false
25)获取查找面板是否显示:gridView1.IsFindPanelVisible;
26)设置自定义(列选择)窗体显示相关属性:gridView1.CustomizationFormBounds;
27)设置垂直滚动条位置:gridView1.TopRowIndex = 3;
28)设置水平滚动条位置:gridView1.LeftCoord = 3;
29)设置 GridView 列头居中显示(v14.2):
1. 设置某一列:gridView1.Columns["ColumnName"].AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
2. 设置所有列:gridView1.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
30)设置 GridView 内容居左显示(v14.2):gridView1.Columns["SerialId"].AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near;
2、方法
1) 添加新行方法 gridView1.AddNewRow();
2) 根据绑定的数据源 自动产生列/绑定数据源
DataTable dt = LinqToDataTable.ToDataTable(true, new List<ProSubPreTreatL>() { new ProSubPreTreatL() });
dt.Rows.RemoveAt(0);
gridView1.PopulateColumns(dt);
gridControl1.DataSource = dt;
3) 数据源绑定datatable,添加一行后可以获得dataRow gridView.GetFocusedDataRow();
4) 获取单元格的值方式1 this.gridView1.GetFocusedRowCellValue("Hall9VNs").ToString();
5) 获取单元格的值方式2 this.gridView1.GetRowCellValue(e.RowHandle, "FieldName").ToString();
6) 获取单元格的值方式3 this.gridView1.GetRowCellValue(this.gridView1.FocusedRowHandle, "FieldName").ToString();
7) 刷新所绑定的数据源 this.gridView1.RefreshData();
8) 检查gridView中数据是否有错误(数据是否有效) this.gridView1.ValidateEditor(); //有效返回true,否则false
9) 向gridView添加过滤条件
StringBuilder filterString = new StringBuilder("[SerialID] = '1' OR [SerialID] = '2'"); //过滤字符串
ViewColumnFilterInfo viewFilterInfo = new ViewColumnFilterInfo(gridView1.Columns["SerialID"], new ColumnFilterInfo(filterString.ToString()));
gridView1.ActiveFilter.Clear(); //清除所有过滤条件
gridView1.ActiveFilter.Add(viewFilterInfo); //添加过滤条件
示例1 (模糊过滤QCMark字段)(建议使用这种方式添加过滤条件,这样就可以单独为每个字段添加过滤条件)
gridView1.Columns["QCMark"].FilterInfo = new ColumnFilterInfo("[QCMark] LIKE 'F%'");
this.gridView1.Columns["QCMark"].ClearFilter(); //清除QCMark字段的过滤条件
10)保存排版和获取排版方法:SaveLayoutToXml()、RestoreLayoutFromXml()。
示例2 (过滤QCMark某个字段为DBnull.Value的数据行
ViewColumnFilterInfo viewFilterInfo = new ViewColumnFilterInfo(gridView1.Columns["QCMark"], new ColumnFilterInfo(bandedGridView1.Columns["QCMark"], DBNull.Value));
示例3 (过滤QCMark字段为DBnull.Value 或者 为''的数据行
ViewColumnFilterInfo viewFilterInfo = new ViewColumnFilterInfo(gridView1.Columns["QCMark"], new ColumnFilterInfo("[QCMark] Is Null OR [QCMark] = ''"));
示例3 (过滤QCMark字段不等于A并且不等于A/S的数据行
ViewColumnFilterInfo viewFilterInfo = new ViewColumnFilterInfo(gridView1.Columns["QCMark"], new ColumnFilterInfo("[QCMark] <> 'A' AND [QCMark] <> 'A/S'"));
添加过滤对象
gridView1.ActiveFilter.Add(viewFilterInfo); //添加过滤条件
示例4 (将精确过滤改为模糊过滤) gridView1.ActiveFilterString = gridView1.ActiveFilterString.Replace("StartsWith", "Contains");
3、事件
1) 单元值改变之前 CellValueChanging(object sender, CellValueChangedEventArgs e),手动输入会触发,时机点为值改变时,此时DataTable.Rows[0]["Name"]为原值,e.Value为新值。使用gridView.SetRowCellValue()方法不会触发。DataTable.Rows[0]["Name"] = "张三"也不会触发。
2) 单元值改变之后 CellValueChanged(object sender, CellValueChangedEventArgs e),手动输入会触发,时机点为光标单元格光标失去时,此时DataTable.Rows[0]["Name"]为新值,e.Value为新值。使用gridView.SetRowCellValue()方法会触发。DataTable.Rows[0]["Name"] = "张三"也不会触发。
3) 单元格单击事件 RowClick (如果需要每个单元格都触发事件,需要设置this.gridView1.OptionsBehavior.Editable = false;)
4) 鼠标按下事件,只要鼠标在GridView范围内按下就会触发此事件 MouseDown (如果需要每个单元格都触发事件,需要设置this.gridView1.OptionsBehavior.Editable = false;)
5) 行或者单元格单击事件 RowCellClick (如果需要每个单元格都触发事件,需要设置this.gridView1.OptionsBehavior.Editable = false;)
private void gridView1_MouseDown(object sender, MouseEventArgs e)
{
DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hInfo = gridView_ListTemplate.CalcHitInfo(new Point(e.X, e.Y));
if (e.Button == MouseButtons.Left && e.Clicks == 2)
{
//判断光标是否在行范围内
if (hInfo.InRow){ }
}
}
5) 新增行时(不包含数据源绑定) InitNewRow(object sender, InitNewRowEventArgs e)
6) 修改单元格事触发事件(可以用于验证)
gridView1.ValidatingEditor += new BaseContainerValidateEditorEventHandler(gridView1_ValidatingEditor);
void gridView1_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e)
{
int value;
if (int.TryParse(Convert.ToString(bcveea.Value), out value) && value < 1 || value > 25)
{
bcveea.ErrorText = "请输入1~25之间的数字";
bcveea.Valid = false;
formProSerial.IsError = true;
}
else
formProSerial.IsError = false;
}
7) gridView的光标行改变后(包括使用鼠标和使用键盘改变的)
gridView1.FocusedRowChanged += new DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventHandler(gridView1_FocusedRowChanged);
8) gridView过滤行过滤单元格值改变后 this.gridView1.ColumnFilterChanged += new EventHandler(delegate(object sender, EventArgs e) { } );
9)gridView列标题右键菜单创建过滤编辑器时 this.gridView1.FilterEditorCreated;
10)过滤编辑器创建时 this.gridView1.FilterEditorCreated;
11)弹出菜单显示时 this.gridView1.PopupMenuShowing;
12)显示自定义(列选择)窗体时 this.gridView1.ShowCustomizationForm;
三、GridColumn
1) 设置列标题文本,设置属性 DevExpress.XtraGrid.Columns.GridColumn.Caption='列标题'
2) 设置列数据绑定字段名,设置属性 DevExpress.XtraGrid.Columns.GridColumn.FieldName='数据绑定字段名'
3) 设置列是否只读 DevExpress.XtraGrid.Columns.GridColumn.OptionsColumn.ReadOnly = true;
4) 设置列是否显示 DevExpress.XtraGrid.Columns.GridColumn.Visible = false;
5) 设置列宽度 DevExpress.XtraGrid.Columns.GridColumn.Width = 100; //必须先设置 gridView.OptionsView.ColumnAutoWidth = false;
6) 设置列头显示位置 DevExpress.XtraGrid.Columns.GridColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center;
7) 设置单元格显示位置 DevExpress.XtraGrid.Columns.GridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near;
8) 设置列的数据类型 DevExpress.XtraGrid.Columns.GridColumn.DisplayFormat.FormatType = FormatType.DateTime; //默认FormatType.None
9) 绑定DataTable后,自动设置列的数据类型 DevExpress.XtraGrid.Columns.GridColumn.DisplayFormat.FormatType = FormatType.Custom;
10) 设置列的排序模式和方式:
设置列的排序模式(按照数组,还是字符):this.gridView1.Columns[3].SortMode = DevExpress.XtraGrid.ColumnSortMode.Default;
设置列的排序方式:this.gridView1.Columns[3].SortOrder = DevExpress.Data.ColumnSortOrder.Descending; //默认ColumnSortOrder.None
11) 设置某一列不允许排序 this.gridView1.Columns[3].OptionsColumn.AllowSort = DefaultBoolean.False;
12) 设置某一列冻结(拖动左右滚动条时,此列的不会移动) this.gridView1.Columns[1].Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left; //冻结某一列
13)格式化单元格 this.gridView_ListTemplate.Columns[5].DisplayFormat.FormatString = "yyyy/MM/dd";
14)获取或设置该列是否在该列隐藏时显示在自定义(列选择)窗体中。 gridColumn.OptionsColumn.ShowInCustomizationForm = false; //默认true
15)获取某一列的标题是否可以显示在自定义(列选择)中。gridColumn.CanShowInCustomizationForm;
四、为GridColumn列指定控件类型
1) 指定为ButtonEdit(按钮编辑),列的ColumnEdit属性选择为RepositoryItemButtonEdit类型的实例
是否启用按钮编辑控件 repositoryItemButtonEdit1.Buttons[0].Enabled = false;
设置不显示文本框的按钮 this.repositoryItemButtonEdit1.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.HideTextEditor;
2) 指定为TextEdit(文本框),列的ColumnEdit属性选择为RepositoryItemTextEdit类型的实例
设置单元格输入数据验证 this.repositoryItemTextEdit1.Mask.EditMask = "\\d{1,15}(.{1}\\d{1,25})?";
this.repositoryItemTextEdit1.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.RegEx;
3) 指定为DateEdit(日期控件),列的ColumnEdit属性选择为RepositoryItemDateEdit类型的实例
设置单元格选择的日期格式 this.repositoryItemDateEdit1.Mask.EditMask = "yyyy-MM-dd";
this.repositoryItemDateEdit1.Mask.UseMaskAsDisplayFormat = true; //默认为false,如果不设置会参数,时间值。
4) 指定为ComboBox(下拉框),列的ColumnEdit属性选择为RepositoryItemComboBox类型的实例
设置下拉框不可编辑 this.repositoryItemComboBox1.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor;
绑定数据 this.repositoryItemComboBox1.Items.AddRange(object[]);
5) 指定为CheckBox(复选框/单选框),列的ColumnEdit属性选择为RepositoryItemCheckEdit类型的实例
设置复选框文本 1、repositoryItemCheckEdit1.GlyphAlignment = DevExpress.Utils.HorzAlignment.Default;
2、repositoryItemCheckEdit1.Caption = "启用";
其他记录:
(三)设置gridview只读属性options->optionsbehavior->editable为false 设置单击选中该列,而不是单元格options->optionsSelction ->EnableApperanceFocusedCell为false
(四)将gridview中某一字段设置为RepositoryItemHyperLinkEdit,要触发该链接的事件,可以在In_place Editor Repository中触发click 事件。但是,触发该事件的同时,gridview中的OptionBehavior->Editable必须设置为true。
(五)在gridview中绑定内存表,要改变焦点行某一字段的值 '根据gridview的焦点行获取内存表的行数 Dim rowGoMain As DataRow = gridview.GetDataRow(sender.FocusedRowHandle) '修改该行的值 rowGoMain("字段名") = "aa"
(六)对DataSet进行查询: ds.Tables[0].DefaultView.RowFilter = "查询条件";
(七) 设置展开第一行的字表 gridview.SetMasterRowExpanded(1, True)
(八)设置gridview某一列汇总:选中该列,在SummaryItem设置相应属性即可。DisplayFormat为显示的格式,FieldName为需要汇总的字段……
(九)设置gridview单元格自动换行:在单元格中一个Memo控件,columnedit->new->MemoEdit,gridview中设置optionsview->rowautoheight=true
this.gvSchemesDescription.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFocus;
this.gvSchemesDescription.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.False;
this.gvSchemesDescription.OptionsBehavior.AllowDeleteRows = DevExpress.Utils.DefaultBoolean.False;
this.gvSchemesDescription.OptionsBehavior.AllowFixedGroups = DevExpress.Utils.DefaultBoolean.False;
this.gvSchemesDescription.OptionsBehavior.AutoSelectAllInEditor = false;
this.gvSchemesDescription.OptionsCustomization.AllowFilter = false;
this.gvSchemesDescription.OptionsCustomization.AllowGroup = false;
this.gvSchemesDescription.OptionsCustomization.AllowQuickHideColumns = false;
this.gvSchemesDescription.OptionsFilter.AllowFilterEditor = false;
this.gvSchemesDescription.OptionsFilter.AllowMultiSelectInCheckedFilterPopup = false;
this.gvSchemesDescription.OptionsMenu.EnableColumnMenu = false;
this.gvSchemesDescription.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
this.gvSchemesDescription.OptionsView.ShowGroupExpandCollapseButtons = false;
this.gvSchemesDescription.OptionsView.ShowGroupPanel = false;
1. 添加自动行号
this.gridView1.IndicatorWidth = 50; //设置显示行号的列宽
//添加事件
gridView1.CustomDrawRowIndicator += new DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventHandler(gridView2_CustomDrawRowIndicator);
//添加行号
void gridView2_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
{
if (e.Info.IsRowIndicator && e.RowHandle >= 0)
{
e.Info.DisplayText = (e.RowHandle + 1).ToString();
}
}
参考链接:
http://www.cnblogs.com/xiaofengfeng/archive/2013/03/13/2957440.html
http://blog.csdn.net/shuaishifu/article/details/8832883
http://www.cnblogs.com/HopeGi/archive/2012/10/17/GridControl.html
http://www.cnblogs.com/pan11jing/archive/2010/01/04/1638982.html