在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件
在使用DevExpress的GridView的时候,我们为了方便,往往使用一些扩展函数,动态创建GridView列的编辑控件对象,然后我们可以灵活的对内容进行编辑或者使用一些弹出的对话框窗体进行处理内容的录入,本篇随笔就是介绍这一主题:在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件。
1、使用扩展函数动态创建列
我们创建列,为了绑定相应的数据源信息展示,一般指定列的名称和显示的列标题名称,如下是一个简单的列创建处理代码。
grv.CreateColumn("Note", "备注说明");
如果赢绑定了数据源,我们也可以根据列的FieldName进行获得列的控制权,然后给它指定不同的编辑控件,如下所示。
gridview.Columns.ColumnByFieldName("Introduction").CreateMemoEdit();
上面的CreateMemoEdit()函数就是一个简单的扩展函数,用于创建一个备注列的处理,它的编辑器控件 RepositoryItemMemoEdit 的RepositoryItem 扩展对象。扩展函数如下所示的代码。
/// <summary>
/// 创建GridView的列编辑为MemoEdit
/// </summary>
/// <param name="gridColumn">GridColumn列对象</param>
/// <returns></returns>
public static RepositoryItemMemoEdit CreateMemoEdit(this GridColumn gridColumn)
{
RepositoryItemMemoEdit repositoryItem = new RepositoryItemMemoEdit
{
AutoHeight = false,
LinesCount = 0
};
gridColumn.View.GridControl.RepositoryItems.Add(repositoryItem);
gridColumn.ColumnEdit = repositoryItem;
return repositoryItem;
}
我们把它们(这些扩展函数)定义在不同的类文件中,使用静态类就可以了。例如对于GridControl和GridView的相关处理扩展函数,我们把它整理放在一个类文件中,定义各种方便使用的方法即可,如下所示。

对于一些简单的录入我们保留让他使用默认文本输入框即可,如下所示代码。
this.gridViewRequisition.CreateColumn("需求金额", "需求金额", 80);
this.gridViewRequisition.CreateColumn("采购数量", "采购数量", 80);
this.gridViewRequisition.CreateColumn("采购金额", "采购金额", 80);
this.gridViewRequisition.CreateColumn("库存数量", "库存数量", 80);
this.gridViewRequisition.CreateColumn("可用库存", "可用库存", 80);
当然,如果我们想获得对应列的一些特殊的处理,那么可以把获得的列对象,赋值给变量,然后进行相关的属性处理。
var colQuantity = grv.CreateColumn("Quantity", "销售数量");
colQuantity.AppearanceCell.BackColor = Color.Moccasin;
colQuantity.AppearanceCell.Options.UseBackColor = true;
colQuantity.CreateSpinEdit();
而对于一些特殊的列,如一些下拉列表的列,我们可以指定他们的下拉列表,可以是固定列表,也可以通过函数获取数据库的记录进行绑定处理,如下所示。
var purchaseType = this.gridViewRequisition.CreateColumn("采购类型", "采购类型", 80).CreateGridLookUpEdit();
var typeList = new List<CListItem>()
{
new CListItem("正品"),
new CListItem("样品"),
new CListItem("免费")
};
purchaseType.BindDictItems(typeList, false);
而如果备注处理,嫌GridView里面输入太麻烦,可以使用弹出的对话框进行处理,如下代码所示。
var note = this.gridViewRequisition.CreateColumn("备注", "备注", 100).CreateButtonEdit();
note.EditValueChanging += (ss, ee) =>
{
gridViewRequisition.SetFocusedRowCellValue("备注", ee.NewValue);
};
note.ButtonClick += (ss, ee) =>
{
var dlg = new FrmShowTextEdit();
dlg.FieldDefaultValue = gridViewRequisition.GetFocusedRowCellDisplayText("备注");
dlg.FieldDisplayName = "备注";
if (dlg.ShowDialog() == DialogResult.OK)
{
gridViewRequisition.SetFocusedRowCellValue("备注", dlg.ReturnValue);
}
};

弹出界面如下所示。

或者有时候,我们使用一些其他的选择对话框,也是类似的处理方式。
gridview.Columns.ColumnByFieldName("Creator").CreateButtonEdit().ButtonClick += (object sender, ButtonPressedEventArgs e) =>
{
FrmSelectCustomer dlg = new FrmSelectCustomer();
if(dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
if(gridview.GetFocusedRow() == null)
{
gridview.AddNewRow();//如果首次则增加一行
}
gridview.SetFocusedRowCellValue("Creator", dlg.CustomerName);
}
};
如一些列表,也可以使用LookupEdit的编辑控件进行处理选择的展示。

2、列内容的格式处理
在上面动态创建的列编辑控件,对于编辑的值发生变化,需要及时的反映到实际的列表对应的单元格的值中,一般在事件EditValueChanging 中通过SetFocusedRowCellValue 就可以设置回去了,如下代码所示。
var note = this.gridViewRequisition.CreateColumn("备注", "备注", 100).CreateButtonEdit();
note.EditValueChanging += (ss, ee) =>
{
gridViewRequisition.SetFocusedRowCellValue("备注", ee.NewValue);
};
而对于一些数值型的内容处理,如SpinEdit的编辑器控件,那么每次输入一个不同的字符都会触发这个处理,那么就有点不正常的了,因此可以通过下面的方式进行矫正,利用EditValueChanged事件的处理。
var xuqiuLiang = this.gridViewRequisition.CreateColumn("需求数量", "需求数量", 80).CreateSpinEdit();
xuqiuLiang.ValidateOnEnterKey = true;
xuqiuLiang.EditValueChanged += async (ss, ee) =>
{
var value = ((ss) as SpinEdit).Value;
this.gridViewRequisition.SetFocusedRowCellValue("需求数量", value); //刷新显示
gridViewRequisition.RefreshRow(gridViewRequisition.FocusedRowHandle);
};
上面的代码,通过把对应的当前控件转换为编辑器控件,获得值再行处理也是可以的。
另外,有时候,如果列的内容变更了,我们需要及时刷新指定列表行的内容,可以通过下面的代码实现的。
gridViewRequisition.RefreshRow(gridViewRequisition.FocusedRowHandle);
对于一些列表,需要给它指定删除的操作,方便移除整条记录,那么为它添加删除键即可,如下代码所示。
//行删除操作
this.gridViewRequisition.OptionsBehavior.AllowDeleteRows = DefaultBoolean.True;
this.gridViewRequisition.KeyDown += (s, ee) =>
{
if (ee.KeyCode == Keys.Delete)
{//移除记录
gridViewRequisition.DeleteRow(gridViewRequisition.FocusedRowHandle);
gridViewRequisition.RefreshData(); ee.Handled = true;
}
};
而对于列的一些格式转义操作,我们可以统一处理,可以把几个不同的GridView的转义函数放在一起。
//统一处理转义信息
this.gridViewRequisition.CustomColumnDisplayText += CustomColumnDisplayText;
this.gridViewSubx.CustomColumnDisplayText += CustomColumnDisplayText;
this.gridViewSpecification.CustomColumnDisplayText += CustomColumnDisplayText;
转义一般对日期的格式和数值型的格式进行一些格式化处理,如下代码所示。
private void CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e)
{
string columnName = e.Column.FieldName;
if (e.Column.ColumnType == typeof(DateTime) || e.Column.ColumnType == typeof(DateTime?))
{
if (e.Value != null)
{
if (e.Value == DBNull.Value || Convert.ToDateTime(e.Value) <= Convert.ToDateTime("1900-1-1"))
{
e.DisplayText = "";
}
else
{
e.DisplayText = Convert.ToDateTime(e.Value).ToString("yyyy-MM-dd HH:mm");//yyyy-MM-dd
}
}
}
else if (e.Column.ColumnType == typeof(decimal) || e.Column.ColumnType == typeof(decimal?))
{
decimal value;
if (decimal.TryParse(e.DisplayText, out value))
{
e.DisplayText = value.ToString("0.################");
}
}
}
而如果喜欢对列的背景色等进行自定义,可以在事件RowCellStyle中,根据不同的字段名称进行处理。
this.gridViewSpecification.RowCellStyle += (s, e) =>
{
e.Appearance.BackColor = Color.Transparent;
if (e.Column.FieldName == "序列")
{
var xulie = string.Concat(gridViewSubx.GetFocusedRowCellValue("序列"));
if (!xulie.IsNullOrEmpty() && e.CellValue?.ToString() == xulie)
{
e.Appearance.BackColor = Color.Red; //醒目颜色
}
}
};
以上就是一些利用GridView进行处理的一些经验代码总结,希望对您有所启发。
在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件的更多相关文章
- WPF 中动态创建和删除控件
原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName(" ...
- cxgrid动态创建列
cxgrid动态创建列 procedure TFrmRuleEdit.CreateCols;varColumn: TcxGridDBColumn;begincdsPowerPrj.First;whil ...
- Delphi中动态创建窗体有四种方式
Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...
- 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机
原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...
- HTML中关于动态创建的标签无法绑定js事件的解决方法:.on()方法的 [.selector]
在前端页面的时候,会经常遇到用JavaScript动态创建出来的Button按钮或其他标签无法使用点击事件的问题.如下代码,使用jquery在body中动态创建一个class为demo的Button按 ...
- Android自定义控件:图形报表的实现(折线图、曲线图、动态曲线图)(View与SurfaceView分别实现图表控件)
图形报表很常用,因为展示数据比较直观,常见的形式有很多,如:折线图.柱形图.饼图.雷达图.股票图.还有一些3D效果的图表等. Android中也有不少第三方图表库,但是很难兼容各种各样的需求. 如果第 ...
- jquery 动态创建的元素,绑定事件无效之解决方法
今天遇到一个问题,动态创建的元素,绑定事件无效,如下: js 代码如下: var OaddX = $('.detright div.duibi div.duibox ul li span'); // ...
- js进阶---12-11、jquery如何给动态创建出来的元素绑定事件
js进阶---12-11.jquery如何给动态创建出来的元素绑定事件 一.总结 一句话总结:通过事件委托的方式,通过on方法 1.on方法在事件绑定的时候,data方式带额外参数时,字符串参数和其它 ...
- C# DevExpress GridControl下动态创建列的方法
这里是把在表格中创建控件的方法封装成一个类,然后在创建列的时候实例化"创建控件"的方法 1.在列中使用一些按钮 1 using Common; 2 using DevExpress ...
- 【Devexpress】Gridcontorl动态创建列不显示的问题
通过代码创建列但是不显示,这个原因是因为代码创建的列Visible属性默认是false 所以需要设置为true就会显示了 gridColumn.Visible = true;
随机推荐
- 基于深度强化学习(DQN)的迷宫寻路算法
QLearning方法有着明显的局限性,当状态和动作空间是离散的且维数不高时可使用Q-Table存储每个状态动作的Q值,而当状态和动作时高维连续时,该方法便不太适用.可以将Q-Table的更新问题变成 ...
- Python 列表的修改、添加和删除元素
列表修改.添加和删除元素 大多数创建的列表都是动态的,随程序的运行增删元素 修改列表元素 指定列表名和要修改的元素的索引,再指定要修改元素的新值 # 修改列表元素案例 motorcycles = [' ...
- Spring Boot 整合邮件服务
参考教程 首先参考了 Spring Boot整合邮件配置,这篇文章写的很好,按照上面的操作一步步走下去就行了. 遇到的问题 版本配置 然后因为反复配置版本很麻烦,所以参考了 如何统一引入 Spring ...
- Redis主从和哨兵搭建
今天主要分享Redis主从架构和哨兵的搭建. 主从集群搭建 总共三个节点,一个主节点和两个从节点.都安装在一台机器上模拟主从集群,信息如下: IP PORT 角色 192.168.246.140 70 ...
- 2020-11-07:已知一个正整数数组,两个数相加等于N并且一定存在,如何找到两个数相乘最小的两个数?
福哥答案2020-11-07: 1.哈希法.2.排序+双指针夹逼. golang代码如下: package main import ( "fmt" "sort" ...
- 2022-07-25:xiu是用rust语言编写的流媒体服务器软件项目。k8s安装xiu,drone文件如何写?
2022-07-25:xiu是用rust语言编写的流媒体服务器软件项目.k8s安装xiu,drone文件如何写? 答案2022-07-25: 云原生环境不可能完全一样,只能做参考. 我采用的是dron ...
- 2020-11-23:go中,s是一个字符串,s[0]代表什么?是否等于固定字节数?
福个答案2020-11-23:Golang 的字符串(string)是合法的 UTF-8 序列,这就涉及到了两种不同的遍历方式,一种是按照 Unicode 的 codepoint 遍历,另一种是把 s ...
- HCIP- ICT实战进阶ex1-MPLS
HCIP- ICT实战进阶ex1-MPLS 0 前言 由于BGP设备之间是通过TCP协议实现的跨设备互联, 所以在两台BGP设备之间的其他设备是没有配置BGP协议的, 因此中间的其他设备很可能无法学习 ...
- Uncaught TypeError: imageStyle.getImageState is not a function
这个错误也是遇得到哟,柑橘自己好无辜呀,我哪里错了,找了半天原来还是自己找的错误 看 import Circle from 'ol/geom/Circle'; feature.setStyle(new ...
- Kafka在Linux下的安装和使用
Kafka简介 Tips:本文主要介绍在Linux系统中安装和使用Lafka的操作步骤. 安装Kafka 访问Kafka官网,下载安装包版本(https://kafka.apache.org/down ...