DevExpress中GridControl使用技巧总结-详解图文并茂 本文关键词:图文并茂,使用技巧,详解,DevExpress,GridControl
DevExpress中GridControl使用技巧总结-详解图文并茂 本文简介:个人博客园http://www.16fw.com/lqsilly/GridControl详解(基础)控件常用属性设置1、如何解决单击记录整行选中的问题View->OptionsBehavior->EditorShowMode设置为:Click2、如何新增一条记录(1)、gridView.AddNe
DevExpress中GridControl使用技巧总结-详解图文并茂 本文内容:
个人博客园
http://www.16fw.com/lqsilly/
GridControl详解(基础)控件常用属性设置
1、
如何解决单击记录整行选中的问题
View->OptionsBehavior->EditorShowMode
设置为:Click
2、
如何新增一条记录
(1)、gridView.AddNewRow()
(2)、实现gridView_InitNewRow事件
3、如何解决GridControl记录能获取而没有显示出来的问题
gridView.populateColumns();
4、如何让行只能选择而不能编辑(或编辑某一单元格)
(1)、View->OptionsBehavior->EditorShowMode
设置为:Click
(2)、View->OptionsBehavior->Editable
设置为:false
5、如何禁用GridControl中单击列弹出右键菜单
设置Run
Design->OptionsMenu->EnableColumnMenu
设置为:false
6、如何隐藏GridControl的GroupPanel表头
设置Run
Design->OptionsView->ShowGroupPanel
设置为:false
7、如何禁用GridControl中列头的过滤器
过滤器如下图所示:
设置
Run
Design->OptionsCustomization->AllowFilter
设置为:false
8、如何在查询得到0条记录时显示自定义的字符提示/显示
如图所示:
方法如下:
//When
no
Records
Are
Being
Displayed
private
void
gridView1_CustomDrawEmptyForeground(object
sender,CustomDrawEventArgs
e)
{
//方法一(此方法为GridView设置了数据源绑定时,可用)
ColumnView
columnView
=
sender
as
ColumnView;
BindingSource
bindingSource
=
this.gridView1.DataSource
as
BindingSource;
if(bindingSource.Count
==
0)
{
string
str
=
“没有查询到你所想要的数据!“;
Font
f
=
new
Font(“宋体“,10,FontStyle.Bold);
Rectangle
r
=
new
Rectangle(e.Bounds.Top
+
5,e.Bounds.Left
+
5,e.Bounds.Right
-
5,e.Bounds.Height
-
5);
e.Graphics.DrawString(str,f,Brushes.Black,r);
}
//方法二(此方法为GridView没有设置数据源绑定时,使用,一般使用此种方法)
if
(this._flag)
{
if
(this.gridView1.RowCount
==
0)
{
string
str
=
“没有查询到你所想要的数据!“;
Font
f
=
new
Font(“宋体“,10,FontStyle.Bold);
Rectangle
r
=
new
Rectangle(e.Bounds.Left
+
5,e.Bounds.Top
+
5,e.Bounds.Width
-
5,e.Bounds.Height
-
5);
e.Graphics.DrawString(str,f,Brushes.Black,r);
}
}
}
9、如何显示水平滚动条?
设置this.gridView.OptionsView.ColumnAutoWidth
=
false;
10、如何定位到第一条数据/记录?
设置
this.gridView.MoveFirst()
11、如何定位到下一条数据/记录?
设置
this.gridView.MoveNext()
12、如何定位到最后一条数据/记录?
设置
this.gridView.MoveLast()
13、设置成一次选择一行,并且不能被编辑
this.gridView1.FocusRectStyle
=
DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFocus;
this.gridView1.OptionsBehavior.Editable
=
false;
this.gridView1.OptionsSelection.EnableAppearanceFocusedCell
=
false;
14、如何显示行号?
this.gridView1.IndicatorWidth
=
40;
//显示行的序号
private
void
gridView1_CustomDrawRowIndicator(object
sender,RowIndicatorCustomDrawEventArgs
e)
{
if
(e.Info.IsRowIndicator
}
}
15、如何让各列头禁止移动?
设置gridView1.OptionsCustomization.AllowColumnMoving
=
false;
16、如何让各列头禁止排序?
设置gridView1.OptionsCustomization.AllowSort
=
false;
17、如何禁止各列头改变列宽?
设置gridView1.OptionsCustomization.AllowColumnResizing
=
false;
GridControl详解(一)原汁原味的表格展示
Dev控件中的表格控件GridControl控件非常强大。不过,一些细枝末节的地方有时候用起来不好找挺讨厌的。使用过程中,多半借助Demo和英文帮助文档。网上具体的使用方法也多半零碎。偶遇一个简单而且详细的使用文档。好记性不如烂笔头!转载过来,整理整理发出来做个记录,总共有十个小节。做的非常精细,非常感谢原作者。
插件所在位置
使用时拖拽过来,如下所示即使拖拽过来原封不动的样子:
在程序中写入构建一个表格的代码:
[csharp]
view
plaincopyprint?
1.
private
DataTable
InitDt()
2.
{
3.
DataTable
dt
=
new
DataTable(“个人简历“);
4.
dt.Columns.Add(“id“,typeof(int));
5.
dt.Columns.Add(“name“,typeof(string));
6.
dt.Columns.Add(“sex“,typeof(int));
7.
dt.Columns.Add(“address“,typeof(string));
8.
dt.Columns.Add(“aihao“,typeof(string));
9.
dt.Columns.Add(“photo“,typeof(string));
10.
dt.Rows.Add(new
object[]
{
1,“张三“,1,“东大街6号“,“看书“,““});
11.
dt.Rows.Add(new
object[]
{
1,“王五“,0,“西大街2号“,“上网,游戏“,““});
12.
dt.Rows.Add(new
object[]
{
1,“李四“,1,“南大街3号“,“上网,逛街“,““});
13.
dt.Rows.Add(new
object[]
{
1,“钱八“,0,“北大街5号“,“上网,逛街,看书,游戏“,““});
14.
dt.Rows.Add(new
object[]
{
1,“赵九“,1,“中大街1号“,“看书,逛街,游戏“,““});
15.
return
dt;
16.
}
17.
private
DataTable
InitDt()
{
DataTable
dt
=
new
DataTable(“个人简历“);
dt.Columns.Add(“id“,typeof(int));
dt.Columns.Add(“name“,typeof(string));
dt.Columns.Add(“sex“,typeof(int));
dt.Columns.Add(“address“,typeof(string));
dt.Columns.Add(“aihao“,typeof(string));
dt.Columns.Add(“photo“,typeof(string));
dt.Rows.Add(new
object[]
{
1,“张三“,1,“东大街6号“,“看书“,““});
dt.Rows.Add(new
object[]
{
1,“王五“,0,“西大街2号“,“上网,游戏“,““});
dt.Rows.Add(new
object[]
{
1,“李四“,1,“南大街3号“,“上网,逛街“,““});
dt.Rows.Add(new
object[]
{
1,“钱八“,0,“北大街5号“,“上网,逛街,看书,游戏“,““});
dt.Rows.Add(new
object[]
{
1,“赵九“,1,“中大街1号“,“看书,逛街,游戏“,““});
return
dt;
}
书写gridControl1绑定数据方法:
[csharp]
view
plaincopyprint?
1.
private
void
BindDataSource(DataTable
dt)
2.
{
3.
//绑定DataTable
4.
gridControl1.DataSource
=
dt;
5.
//绑定DataSet
6.
//gridControl1.DataSource
=
ds;
7.
//gridControl1.DataMember
=
“表名“;
8.
}
private
void
BindDataSource(DataTable
dt)
{
//绑定DataTable
gridControl1.DataSource
=
dt;
//绑定DataSet
//gridControl1.DataSource
=
ds;
//gridControl1.DataMember
=
“表名“;
}
程序调用:BindDataSource(InitDt());
呈现结果如下:
GridControl详解(二)表格的列名配置
点击Run
Designer控件上的按钮,弹出视图设计窗口:
列配置:
我们配置完列名后,会发现设计视图发生了变化:
运行结果:
GridControl详解(三)列数据的格式设置
为了测试方便,我们加入新的3列,格式分别是数据,时间,字符串。代码增加下列部分:
[csharp]
view
plaincopyprint?
1.
//格式增加
2.
dt.Columns.Add(“数据“,typeof(decimal));
3.
dt.Columns.Add(“时间“,typeof(DateTime));
4.
dt.Columns.Add(“自定义“,typeof(string));
5.
dt.Rows.Add(new
object[]
{
1,“张三“,1,“东大街6号“,“看书“,““,-52.874,“2011-8-5
17:52:55“,“###“});
6.
dt.Rows.Add(new
object[]
{
1,“王五“,0,“西大街2号“,“上网,游戏“,““,-37.257,“2011-8-5
17:52:55“});
7.
dt.Rows.Add(new
object[]
{
1,“李四“,1,“南大街3号“,“上网,逛街“,““,-54.254,“2011-8-9
17:52:55“});
8.
dt.Rows.Add(new
object[]
{
1,“钱八“,0,“北大街5号“,“上网,逛街,看书,游戏“,““,-35.127,“2011-8-9
17:52:55“});
9.
dt.Rows.Add(new
object[]
{
1,“赵九“,1,“中大街1号“,“看书,逛街,游戏“,““,-29.548,“2011-8-9
20:52:55“});
//格式增加
dt.Columns.Add(“数据“,typeof(decimal));
dt.Columns.Add(“时间“,typeof(DateTime));
dt.Columns.Add(“自定义“,typeof(string));
dt.Rows.Add(new
object[]
{
1,“张三“,1,“东大街6号“,“看书“,““,-52.874,“2011-8-5
17:52:55“,“###“});
dt.Rows.Add(new
object[]
{
1,“王五“,0,“西大街2号“,“上网,游戏“,““,-37.257,“2011-8-5
17:52:55“});
dt.Rows.Add(new
object[]
{
1,“李四“,1,“南大街3号“,“上网,逛街“,““,-54.254,“2011-8-9
17:52:55“});
dt.Rows.Add(new
object[]
{
1,“钱八“,0,“北大街5号“,“上网,逛街,看书,游戏“,““,-35.127,“2011-8-9
17:52:55“});
dt.Rows.Add(new
object[]
{
1,“赵九“,1,“中大街1号“,“看书,逛街,游戏“,““,-29.548,“2011-8-9
20:52:55“});
给gridControl1增加3列,对应上述三列。
数据:
具体数据公式可以查看输入控件的MASK设置器,里面有全部的格式公式:
运行结果:
时间:
自定义:
事件转换:
概念明确:
1.
gridControl1的每一列原始数据是Value,但是显示数据是
DisplayText,默认DisplayText的值即是Value通过DisplayFormat转换之后的值。
2.
gridControl下的事件一般是包含表格GridView切换,点击,更改的事件,用的不多;每一个GridView下的事件包含行列处理,菜单显示,分组排序等事件,我们常用。(所有在使用事件时,一定要明确是control事件还是view事件)
GridView存在事件:自定义列显示事件
增加事件:
[csharp]
view
plaincopyprint?
1.
private
voidgridView1_CustomColumnDisplayText(objectsender,DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgse)
2.
{
3.
if(e.Column.FieldName
==“sex“)
4.
{
5.
switch(e.Value.ToString().Trim())
6.
{
7.
case“1“:
8.
e.DisplayText
=
“男“;
9.
break;
10.
case“0“:
11.
e.DisplayText
=
“女“;
12.
break;
13.
default:
14.
e.DisplayText
=
““;
15.
break;
16.
}
17.
}
18.
}
private
voidgridView1_CustomColumnDisplayText(objectsender,DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgse)
{
if(e.Column.FieldName
==“sex“)
{
switch(e.Value.ToString().Trim())
{
case“1“:
e.DisplayText
=
“男“;
break;
case“0“:
e.DisplayText
=
“女“;
break;
default:
e.DisplayText
=
““;
break;
}
}
}
显示结果:
GridControl详解(四)分组排序汇总
分组:
按时间分第一组:
按性别分第二组:
显示结果:
高级设置:
将所有组展开代码:gridView1.ExpandAllGroups();
显示结果:
自定义组名,GridView级事件
增加事件:
[csharp]
view
plaincopyprint?
1.
private
void
gridView1_CustomDrawGroupRow(object
sender,DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs
e)
2.
{
3.
GridGroupRowInfo
GridGroupRowInfo
=
e.Info
as
GridGroupRowInfo;
4.
GridGroupRowInfo.GroupText
=
“第“+
(e.RowHandle).ToString()
+
“行
“+
GridGroupRowInfo.EditValue.ToString();
5.
}
private
void
gridView1_CustomDrawGroupRow(object
sender,DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs
e)
{
GridGroupRowInfo
GridGroupRowInfo
=
e.Info
as
GridGroupRowInfo;
GridGroupRowInfo.GroupText
=
“第“+
(e.RowHandle).ToString()
+
“行
“+
GridGroupRowInfo.EditValue.ToString();
}
显示结果:
注意:每一行都有一个RowHandle属性,普通行的RowHandle为非负整数,从0开始;组行
排序:
排序设置
显示结果:
汇总:
汇总数据列设置
注意:汇总结果是显示在Footer面板中的,gridControl中的Footer面板默认是不显示的,所以如果要汇总数据,那么必须先设置Footer面板显示。
显示结果:
组计:
代码:
[csharp]
view
plaincopyprint?
1.
gridView1.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum,“数据“,gridColumn7,“组计:{0}“);
gridView1.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum,“数据“,gridColumn7,“组计:{0}“);
结果显示
GridControl详解(五)设置行备注和行号
备注显示设置
设置备注字段
显示结果:
可以写入按键事件F3,用以开关备注显示
[csharp]
view
plaincopyprint?
1.
private
void
Form4_KeyUp(object
sender,KeyEventArgs
e)
2.
{
3.
if
(e.KeyCode
==
Keys.F3)
4.
{
5.
gridView1.OptionsView.ShowPreview
=
!gridView1.OptionsView.ShowPreview;
6.
}
7.
}
private
void
Form4_KeyUp(object
sender,KeyEventArgs
e)
{
if
(e.KeyCode
==
Keys.F3)
{
gridView1.OptionsView.ShowPreview
=
!gridView1.OptionsView.ShowPreview;
}
}
行号显示要用到的事件:
代码:
[csharp]
view
plaincopyprint?
1.
private
void
gridView1_CustomDrawRowIndicator(object
sender,DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs
e)
2.
{
3.
if
(e.Info.IsRowIndicator)
4.
{
5.
e.Info.DisplayText
=
“Row
“+
e.RowHandle.ToString();
6.
}
7.
}
8.
gridView1.IndicatorWidth
=
70;
private
void
gridView1_CustomDrawRowIndicator(object
sender,DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs
e)
{
if
(e.Info.IsRowIndicator)
{
e.Info.DisplayText
=
“Row
“+
e.RowHandle.ToString();
}
}
gridView1.IndicatorWidth
=
70;
显示结果
GridControl详解(六)样式设置
表格样式:全局设置
例子:
例子:
列样式:只作用于当前的列
通用样式:外观设定
注意:样式设定都是相同的,Appearance前缀。
GridControl详解(七)事件
[csharp]
view
plaincopyprint?
1.
private
void
gridView1_RowCellClick(object
sender,DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs
e)
2.
{
3.
if
(e.Button
==
MouseButtons.Left)
4.
{
5.
//鼠标的那个按钮按下
6.
}
7.
if
(e.Clicks
==
2)
8.
{
9.
//鼠标点击次数
10.
}
11.
if
(e.Delta
>
0)
12.
{
13.
//鼠标滚轮滚动方向
14.
}
15.
if
(e.X
>
0
6.
if
(GridCellInfo.IsDataCell
13.
}
14.
}
private
void
gridView1_CustomDrawCell(object
sender,DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs
e)
{
if
(e.Column.FieldName
==
“数据“)
{
GridCellInfo
GridCellInfo
=
e.Cell
as
GridCellInfo;
if
(GridCellInfo.IsDataCell
}
}
重新计算备注事件:gridView1_CalcPreviewText
代码:
[csharp]
view
plaincopyprint?
1.
private
void
gridView1_CalcPreviewText(object
sender,DevExpress.XtraGrid.Views.Grid.CalcPreviewTextEventArgs
e)
2.
{
3.
DataRow
dr
=
gridView1.GetDataRow(e.RowHandle);
4.
e.PreviewText
=
dr[“name“].ToString()
+
“:
“+
dr[“aihao“].ToString();
5.
}
private
void
gridView1_CalcPreviewText(object
sender,DevExpress.XtraGrid.Views.Grid.CalcPreviewTextEventArgs
e)
{
DataRow
dr
=
gridView1.GetDataRow(e.RowHandle);
e.PreviewText
=
dr[“name“].ToString()
+
“:
“+
dr[“aihao“].ToString();
}
注意:GridView中大多数事件我们都会并且必须用到e这个参数,我们可以从e这个参数中获取很多信息,包括单元格、列、行、表格、GridControl的信息。我们要根据事件的意义来了解这个e是单元格级别的,或是行级别的,或是列级别的等,因为我们可以获取e的层级以上的信息,层级以下的信息就不能获取了。
e中的属性都是大同小异,其中最常用的是e.RowHandle这个属性,它代表行号的意思,通过gridView1.GetDataRow(e.RowHandle)方法可以获得这一行的数据行DataRow;并以此来做很多操作。
上述我们也说过组行的RowHandle为负数,我们通过GetDataRow获取数据行是错误的,这时我们通过gridView1.GetDataRowHandleByGroupRowHandle(e.RowHandle);方法来转化,这时得到的数据行是该组的第一行数据。在此我们需特别注意。如果加入上述转换,我们选择数据时每组第一行数据就会重复,我们要做去重复处理。
皮肤设置
GridControl详解(八)菜单
菜单控件
拖入窗口中
显示如下
设置popupMenu
设置barManager
设置controller
增加菜单项
弹出配置窗口
一般菜单项设置
对应属性如下:
对应事件:
选择菜单项设置
事件同上,是否可见同上。
子菜单项设置
是否可见同上,很少去写他的点击事件,一般都写的是他的子菜单中点击事件。
编辑菜单项设置
菜单分组设置
GridControl详解(九)表格中的控件
选择完成控件后,可用+号点开ColumnEdit列,改控件的类型是RepositoryItem类型的,其相应的属性和相应的控件属性是类似的
构建数据如下:
[csharp]
view
plaincopyprint?
1.
DataTable
dt
=
new
DataTable();
2.
dt.Columns.Add(“名称“);
3.
dt.Columns.Add(“范围“);
4.
dt.Columns.Add(“小区总数“);
5.
dt.Columns.Add(“类型“);
6.
dt.Columns.Add(“子类型“);
7.
dt.Columns.Add(“子片区数量“);
8.
dt.Columns.Add(“责任人“);
9.
dt.Columns.Add(“编号“);
10.
dt.Columns.Add(“选择“);
11.
12.
dt.Rows.Add(new
object[]
{
“片区1“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“1“,“0“});
13.
dt.Rows.Add(new
object[]
{
“片区2“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“2“,“0“});
14.
dt.Rows.Add(new
object[]
{
“片区3“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“3“,“1“});
15.
dt.Rows.Add(new
object[]
{
“片区4“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“4“,“1“});
16.
dt.Rows.Add(new
object[]
{
“片区5“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“5“,“0“});
17.
dt.Rows.Add(new
object[]
{
“片区6“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“6“,“1“});
18.
dt.Rows.Add(new
object[]
{
“片区7“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“7“,“1“});
19.
dt.Rows.Add(new
object[]
{
“片区8“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“8“,“0“});
20.
dt.Rows.Add(new
object[]
{
“片区9“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“9“,“0“});
21.
dt.Rows.Add(new
object[]
{
“片区10“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“10“,“1“});
22.
dt.Rows.Add(new
object[]
{
“片区11“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“11“,“1“});
23.
dt.Rows.Add(new
object[]
{
“片区12“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“12“,“0“});
24.
25.
gridControl1.DataSource
=
dt;
DataTable
dt
=
new
DataTable();
dt.Columns.Add(“名称“);
dt.Columns.Add(“范围“);
dt.Columns.Add(“小区总数“);
dt.Columns.Add(“类型“);
dt.Columns.Add(“子类型“);
dt.Columns.Add(“子片区数量“);
dt.Columns.Add(“责任人“);
dt.Columns.Add(“编号“);
dt.Columns.Add(“选择“);
dt.Rows.Add(new
object[]
{
“片区1“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“1“,“0“});
dt.Rows.Add(new
object[]
{
“片区2“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“2“,“0“});
dt.Rows.Add(new
object[]
{
“片区3“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“3“,“1“});
dt.Rows.Add(new
object[]
{
“片区4“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“4“,“1“});
dt.Rows.Add(new
object[]
{
“片区5“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“5“,“0“});
dt.Rows.Add(new
object[]
{
“片区6“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“6“,“1“});
dt.Rows.Add(new
object[]
{
“片区7“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“7“,“1“});
dt.Rows.Add(new
object[]
{
“片区8“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“8“,“0“});
dt.Rows.Add(new
object[]
{
“片区9“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“9“,“0“});
dt.Rows.Add(new
object[]
{
“片区10“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“10“,“1“});
dt.Rows.Add(new
object[]
{
“片区11“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“11“,“1“});
dt.Rows.Add(new
object[]
{
“片区12“,“范围“,“5“,“线“,“普通公路“,“5“,“qiangfei“,“12“,“0“});
gridControl1.DataSource
=
dt;
注意:我们表格中【选择】一列的值是字符串型,那么表格中设置的类型也必须是字符串型。类型必须统一。
结果呈现:
必要设置:【编辑】属性
我们如果添加了选择框列,肯定要对选择列可用进行点击选中的操作,所以我们必须先打开表格的可编辑状态。
但是这样每一列都可以编辑,所以要关闭其他列的可编辑状态。
这样我们就可以操作选择列,而其他列不可编辑。
由此我们可以看出gridview上的Editable属性控制大于列的AllowEdit属性。
进阶:
当我们点击某一行的选择列checkbox控件是,其绑定的值也会发生变化,联动其datatable中的值也会发生变化,即选中时,datatable对应的值会变成1;未选中时,其值为0。那么我们可以通过如下代码获取选中的所有信息;
DataRow[]
drs
=
dt.Select(“选择=
1
“);
GridControl详解(十)Ba