DevEXpress中的GridControl 的使用方法

23 篇文章 0 订阅
9 篇文章 0 订阅

GridControl
  关于数据绑定:明细部分数据赋值的时候不需要象MultilRow那样逐行赋值,它只需要绑定数据集就可以了,在DataSet里需要对应字段名,这样在SetRowCellValue或者GetRowCellValue里指定的Columns[“xx”]才能设置或取到正确的数据
在SetRequestData里用记录集收集数据,而不需要象MultilRow取明细中的值,要注意的是在行离开的时候最好用到View的UpdateCurrentRow方法用语更新记录集
在GetResponseData直接用GridControl 的DataSource绑定到传回的记录集上,如果有显示不正确的说明在DataSet里或着Columns的FiledName不正确
明细选择不要背景色 Appearance FocuseRow HideSelectionRow
内部Enter能跳动 GridView OptionsNavigation EnterMoveNextColoumnàTrue
 
GridView设置
IndicatorWidth 行头的宽度设置
Tab键可用:OptionsBehavioràFocusLeaveOnTab àTrue
设置列是否可移动,可筛选,可排序:OptionsCustomizationàAllowColumnMovingàFalse AllowFilteràFalse AllowSortàFalse
光标进入单元格而不是整行的设置:OptionsSelect EnableApppearanceFocusedRowà False MultiSelectàCellSelect
明细进入处于编辑状态:OptionsSelectionàEnableAppearanceFocuseRowàFalse MultiSelectModeàCellSelect
Columns的设置 ColumnEdit设置列的类型比如combox
   FieldName 填充的字段名
  列的操作OptionsColumn àAllowEdit,AllowFocus,ReadOnly,TabStop
  数字型注意设置DisplayFormat,对齐方式一般是右对齐设置在AppearanceCellàTextOptionsàHAlignmentàFar,数字型有时候需要清空处理,赋成空会出现错误,要赋成Null就需要设置ColumnEditàAllowNullInputàTrue
有多个明细不出现Tab选项上面文字 OptionsDetailàShowDetailTabs à False
一次只展开一个明细的数据 OptionsDetailàAllowOnlyOneMasterRowExpanded à True
Combox在明细没有显示出来  ShowButtonMode à ShowAlways 初始化的时候也需要加载数据
检索画面需要单双行颜色不一致 OptionsView à EnableAppearanceEvenRow à True 在设计代码中加上皮肤颜色
NumberSpinTextBox
Properties à DisplayFormat,EditFormat 设置Numeric
           EditMask设置d  Mask EditMask设置d
      MaxValue,MinValue
DateTextBox
Properties à DisplayFormat,EditFormat 设置DataTime
      Mask UseMaskAsDisplayFormat True 
      MaxValue,MinValue
 
GridView事件
CustomDrawRowIndicator用于处理行头的自动编号
InvalidRowException 用于只捕捉自定义异常,如果不写这个事件的话,如果列输入的格式不正确的话系统会自动报出输入的字符串格式不正确,但这个是它内部捕捉的,这个不要让它报出来就在这个事件里写
ValidateRow 用于行离开时处理,列本身长度的控制是MaxLength,但这个是字符长度,通常需要按字节截取,行离开的时候字节截取就在这个事件处理;判断数据合法性也在这个事件处理,需要注意的是在之前调用View的CloseEditor()用于关闭编辑状态,如果没用这方法的话会出现有时行离开取不到之前的值最后需要刷新记录集UpdateCurrentRow()
ValidatingEditor 用于处理正在编辑离开处理,这个事件可以用来处理合法性的判断,但它只能捕捉到有值改变的情况下,如果是直接是空离开,是不触发的,如果是有值的情况再改变成空是可以触发的
TextEdit事件
控件的Enter事件
  如this.LastText = this.ViewMaterial.GetRowCellValue(this.ViewMaterial.FocusedRowHandle, "MaterialID").ToString();
控件的Leave事件
  用于如ID离开取出相应的名称,或者补0,或者后面的列清空,注意数字型的清空如果之前设置了允许Null的情况,清空时列的值是赋成null
文本和Combox组合的情况
选择框赋值时注意,选择框没有SelectIndex属性,赋值的时候就用SetRowCellValue(this.ViewMaterial.FocusedRowHandle, ViewMaterial.Columns["UnitName"], this.cmbMXUnitName.Items[i])
SelectedIndexChanged 用于处理选择后给文本赋值
SetRowCellValue(this.ViewMaterial.FocusedRowHandle, ViewMaterial.Columns["MXUnitID"], ((DevExpress.XtraEditors.ComboBoxEdit)sender).SelectedItem.ToString().Substring(0, vLength));
事件 Leave 和Validated是不同的,特别是在需要补0的控件,需要使用Validated才会有效果,他们的区别在于Validated是先检验处理,在触发Leave事件,而Leave就只是离开时
 
 
需要统一处理的
1.      明细部分移动由Enter改成Tab,设置参照上面的
2.        主的有效明细字段清空时,清空后面的数据
3.        主的有效明细字段为空的时候,不提示错误信息,因为该行不作为数据收集
4.        如果主的有效明细字段不为空的时候,其他有效明细字段为空,提示错误信息
图形说明上述情况:
材料编号作为主的有效明细字段
(2)如果材料编号清空的话,材料名,规格,数量,单位就要清空
(3)如果材料编号为空,就算数量,单位不为空也不提示错误,因为编号没填就不是有效明细
(4)如果材料编号不为空,数量或单位为空,提示错误信息
 
 
 
 
明细内式样设计:
1.        组合控件:如TextBox+Label+Button或TextBox+ComboBox的字段,字段标题居中显示,字段设计如下所示:
 
2.数字类型的数据右对齐,数字类型的控件有CalcEdit和SpinEdit,可以通过需求选择,两者的区别
              CalcEdit                                      SpinEdit
  没有MaxValue和MinValue                 可以通过设置MaxValue和MinValue属性设置数字大小
 
共同点: 设置MaxLength,最大长度, 设置输入格式,Mask→EditMask,  显示格式:DisplayFormat,
画面显示时按显示格式要求显示时:Mask→UseMaskAsDisplayFormat=True,金额计算方式 / 显示格式:SummaryItem→SummaryType / DisplayFormat
2.        ComboBoxEdit的使用 ,焦点不能进入:AllowFocus=false,不能进行编辑:TextEditStyle=DisableTextEditor调用该控件的字段的属性设置:OptionsColumn→AllowMove=false,TabStop=false
3.  ButtonEdit的使用,只显示按钮:TextEditStyle=HideTextEditor   宽度:Width=22
4.  用于只读控件的属性设置,OptionsColumn 的AllowEdit=false、AllowFocus=false、ReadOnly=True、TabStop=false
4. 明细内部字段和基本的字段设计相同部分按照基本设计修改,明细行高为20(此为默认行高,不需要进行设置)
5. 若无法正好显示明细内行,经确认后再行修改,不得随意按个人意愿修改
 
关于之前遗留问题解决方案:
1.   明细行离开会把全部错误信息都提示出来,如果某一列已经合法了错误提示信息依然存在,并不能及时清空错误信息,原因是在ValidatingEditor事件没有清空ValidateRow事件时捕捉的错误,办法是在ValidatingEditor事件里,如果合法就清空ValidateRow事件时捕捉的错误清空调用方法如     XX.SetColumnError(this.XX.Columns["Quantity"], "");
2.   关于明细复选框勾选不上的原因,明细复选框的数据源必须是bool型,所以在数据集绑定的字段要设置DataType为System.Boolean,默认是System.String
3.   明细数字用到SpinEdit如果在单元格上下列点击,再关闭窗体出现系统错误,原因是在ValidatingEditor事件中e.Value是null,而用于接受数字值是CastUtility.ToDecimal(e.Value.ToString()),e.Value.ToString()是会转换失败的,解决办法是如果判断当前列是数字的话,先判断e.Value是不是Null在不是Null的情况才进行下面的处理
 
关于明细中用到多个View 的情况,处理办法如下:
1.      关于关系记录集的添加:在工程中(这个项目是添加在Core—>Relation)需要添加数据集xsd,在这里指定字段,以及主外键关系,编译以后在工具箱的组件中就会有刚添加的关系数据集,然后拖到现窗体画面
2.      本身View先画好主的以后,再添加Level,选择Level所需要用的View类型(本身属性设置略)这个时候子View里的FiledList是没有任何字段的
3.      指定关系绑定数据,这个是最重要的部分
默认情况,在GirdControl里的DataSource是无法选择刚添加的记录集中主表,而只有在界面设计类中通过代码来添加,打开Windows 窗体设计器生成的代码 ,添加如this.GridList.DataSource = this.dsOrder1.Order;这样回到窗体设计画面看到DataSource里绑定的是dsOrder1.Order,这样绑定了以后运行仍然是不正确的,不能出现子表设计画面,在 GirdControl上有两个按钮一个Retrieve Details和Run Designer,需要点击Retrieve Details然后会出现对话框,选择清空所有格式,这个时候Level中的之前画好的View会被清掉,被默认的取代,这个时候,点击新的View,然后会有两个选项,一个是新的设计View类型,一个是自己之前画好的子View,点击选择子View,这样就完成了主与子表的设计,这个时候再点击明细内部设计的Columns子View里的FiledLis就会出现字段
这样处理完了之后,怎么把数据加载到记录集数据的问题
   需要把数据导入到主表和子表中去 ,如
for (int i = 0; i < vResponse.Tables[0].Rows.Count; i++)
   {
 DataRow rw = vResponse.Tables[0].Rows[i];
        this.dsOrder1.Order.ImportRow(rw);
  }
 
    for (int j = 0; j < vResponse.Tables[1].Rows.Count; j++)
    {
         DataRow rw = vResponse.Tables[1].Rows[j];
         this.dsOrder1.OrderDetail.ImportRow(rw);
     }
要注意的是记录集的清空Clear(),特别是设置了主外键的时候,数据重复的话会冲突
 
行头自动编号
private void ViewMaterial_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
        {
            if (e.Info.IsRowIndicator && e.RowHandle >= 0)
            {
                e.Info.DisplayText = (e.RowHandle + 1).ToString().Trim();
            }
        }
 
下面再介绍关于怎么处理子的View里列离开事件响应处理的问题
通常情况下如Enter事件是
this.LastText = this.ViewData1.GetRowCellValue(this.ViewData1.FocusedRowHandle, "BillStatus").ToString();但是这个语句在子的View是不管用的,因为当前的FocusedRowHandle值是无法定位到子表中的位置,处理办法是用先接受当前GridView,只有判断当前是子的View的时候,再用当前View的FocusedRowHandle才能知道是哪一行
关于怎么接受字段值的问题:用之前实例过的View的GetDataRow(vRow) vRow就是用前面FocusedRowHandle
DevExpress.XtraGrid.Views.Grid.GridView view = this.GridList.FocusedView as DevExpress.XtraGrid.Views.Grid.GridView;
DataRow rw = view.GetDataRow(view.FocusedRowHandle);
this.LastText = rw["StatusID"].ToString();
关于怎么赋值给指定的列的问题:用之前实例过的View的SetFocusedRowCellValue
要注意的是事件中接受刚输入的值,以前是XXView. CloseEditor,才能接受新的值,但如果有多个View如果是用子View名. CloseEditor是没有作用的,需要用之前实例过当前的View的CloseEditor
 
页脚合计值的设置
首先View的ShowFooter 要设置成True,Columns的SummaryItem设置格式
默认合计是以行为单位,但如果要使界面能即使刷新是用ViewData.RefreshData();
取得合计值用ViewData.Columns["ProductMoney"].SummaryText
 
数字控件SpinEdit 边框默认会有下拉框,去掉的话是在Buttons中移除,同样计算器也是这样
 
出现滚动条设置在ColumnAutoWidthà False
不要出现页脚设置在ShowFooter àFlase
报表部分
纸型设置PaperKind A4 边距设置Margins
 
明细控制只读以及颜色的控制,现在是通过GridView_ShowingEditor和RowCellStyle组合控制,只是有个问题,如果e.Cancel = true的话会使明细的Enter键无效了,所以要处理如果让他能跳动就不要把e.Cancel 设置为 true,只是这个有点不好的是被锁住的列光标能进入,只是不能编辑
在ShowingEdito事件中通过this.GridView.FocusedColumn.FieldName来判断是否允许编辑如果可以编辑this.GridView.FocusedColumn.OptionsColumn.ReadOnly  = false ; e.Cancel = false
RowCellStyle事件主要控制颜色的显示,要注意的是获取列不能用FocusedColumn而要用 e.Column.FieldName,得到要设置的列后通过e.Appearance.BackColor设置背景色
 
有子明细的View,有时候需要获得它父类的所在行编号
通过实例化View对象              
DevExpress.XtraGrid.Views.Grid.GridView vFocusView = this.GridList.FocusedView as DevExpress.XtraGrid.Views.Grid.GridView;
通过vFocusView.Name判断是父View还是子View
如果是父View用vFocusView.FocusedRowHandle;如果是子View用vFocusView.SourceRowHandle
 
在子View里有检索按钮的话,如果检索画面跳出来后,明细行缩上去了,所以返回后赋值会找不到所要赋值的行,解决办法是先在记录父View所在行,用DataRow 记录子View检索后的数据最终反应到记录集中
 
DevExpress.XtraGrid.Views.Grid.GridView vFocusView = this.GridMaterialList.FocusedView as DevExpress.XtraGrid.Views.Grid.GridView;  //实例化对象
int vParentRowHandle = vFocusView.SourceRowHandle; //获得父类位置
this.GridMaterialView.BeginUpdate();
DataRow rw1 = vFocusView.GetDataRow(vFocusView.FocusedRowHandle);//获得子类当前行的记录
FrmSearch search = new FrmSearch(SearchMode.供应商查询);
if (search.CD1 != null && !search.CD1.Equals(""))
    {
         this.GridMaterialView.ExpandMasterRow(vParentRowHandle); //展开父类
AgtProvider agt2 = new AgtProvider();
         agt2.ProviderID = search.CD1;
DataSet vResponse = agt2.Get();
 if (vResponse.Tables[0].Rows.Count > 0)
         {
rw1["ProviderID"] = vResponse.Tables[0].Rows[0]["ProviderID"]; //设置查询到的数据
}
      }
this.GridMaterialView.EndUpdate();
 
明细行中有按钮上面文字要出来,默认是...内部按钮 ButtonsàCaption设置要显示的字 KindàGlyph
 
报错时需要把光标定义到子明细的列上
//把光标定义到父类
 this.GridMaterialView.FocusedRowHandle = i;
this.GridMaterialView.ExpandMasterRow(i);
//通过实例化父类对象,光标指定到子明细中
 GridView vFocusView = (GridView)this.GridMaterialView.GetVisibleDetailView(i);
this.GridMaterialList.FocusedView = vFocusView;
vFocusView.Focus();
 vFocusView.FocusedRowHandle = j;
vFocusView.FocusedColumn = vFocusView.Columns["ProvideQuantity"];
 
 
关于消息提示,跳出画面的总结
 
这是一种组合出来的结果。主画面通过alertControl来控制显示的样子
底下红色部分是用户自定义控件,通过imageList来显示相应图片,添加的办法是在alertControl的Buttons中添加
关于内容部分可以设置字体颜色在alertControl的AppearanceTextàForeColor
可以设置提示时间AutoFormDelay
可以设置初始化的状态,比如跳出的位置;是否栅住,在alertControl1_FormLoad事件中处理
自定义按钮的事件处理在alertControl1_ButtonClick;把当前提示框关闭e.AlertForm.Close()
文本连接事件处理在alertControl1_AlertClick
获取界面上有多少个提示框通过alertControl1.AlertFormList.Count
提示框跳出来的办法是control.Show(FindForm(),”标题”,”内容”,””,图片,null);
 
消息提示,使窗体闪动
[System.Runtime.InteropServices.DllImport("user32")]
  private static extern long FlashWindow(IntPtr hwnd, bool bInvert);
  private void button2_Click(object sender, EventArgs e)
 {
     FlashWindow(this.Handle, true);
 }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值