在使用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的列中,动态创建列的时候,绑定不同的编辑处理控件的更多相关文章

  1. WPF 中动态创建和删除控件

    原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName(" ...

  2. cxgrid动态创建列

    cxgrid动态创建列 procedure TFrmRuleEdit.CreateCols;varColumn: TcxGridDBColumn;begincdsPowerPrj.First;whil ...

  3. Delphi中动态创建窗体有四种方式

    Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...

  4. 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机

    原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...

  5. HTML中关于动态创建的标签无法绑定js事件的解决方法:.on()方法的 [.selector]

    在前端页面的时候,会经常遇到用JavaScript动态创建出来的Button按钮或其他标签无法使用点击事件的问题.如下代码,使用jquery在body中动态创建一个class为demo的Button按 ...

  6. Android自定义控件:图形报表的实现(折线图、曲线图、动态曲线图)(View与SurfaceView分别实现图表控件)

    图形报表很常用,因为展示数据比较直观,常见的形式有很多,如:折线图.柱形图.饼图.雷达图.股票图.还有一些3D效果的图表等. Android中也有不少第三方图表库,但是很难兼容各种各样的需求. 如果第 ...

  7. jquery 动态创建的元素,绑定事件无效之解决方法

    今天遇到一个问题,动态创建的元素,绑定事件无效,如下: js 代码如下: var OaddX = $('.detright div.duibi div.duibox ul li span'); // ...

  8. js进阶---12-11、jquery如何给动态创建出来的元素绑定事件

    js进阶---12-11.jquery如何给动态创建出来的元素绑定事件 一.总结 一句话总结:通过事件委托的方式,通过on方法 1.on方法在事件绑定的时候,data方式带额外参数时,字符串参数和其它 ...

  9. C# DevExpress GridControl下动态创建列的方法

    这里是把在表格中创建控件的方法封装成一个类,然后在创建列的时候实例化"创建控件"的方法 1.在列中使用一些按钮 1 using Common; 2 using DevExpress ...

  10. 【Devexpress】Gridcontorl动态创建列不显示的问题

    通过代码创建列但是不显示,这个原因是因为代码创建的列Visible属性默认是false 所以需要设置为true就会显示了 gridColumn.Visible = true;

随机推荐

  1. blog图片资源

  2. 安装MongoDB、及基本使用

    1.MongoDB简介 MongoDB是一个介于关系数据库和非关系数据库之间的产品,基于分布式文件存储的数据库.是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构非常松散,是类似json ...

  3. vue-cli3构建和发布 实现分环境打包步骤(给不同的环境配置相对应的打包命令)

    https://panjiachen.github.io/vue-element-admin-site/zh/guide/essentials/deploy.html#%E6%9E%84%E5%BB% ...

  4. h5新增特性 和 css3 新特性

    H5新增: 1)用于绘画 canvas 元素. 2) 用于媒介回放的 video 和 audio 元素. 3)语义化标签 article.footer.header.nav.section3) 4)表 ...

  5. CQOI2013vp记

    新Nim游戏 因为第一次操作与其它操作不同,考虑拿出来单独做,剩下的操作就变成了 Nim游戏 了. 回忆一下 Nim游戏 先手必胜的条件是什么,是所有数的异或和不为 \(0\),那么这题就转化为求原集 ...

  6. SSM之简单的CRUD

    文章目录 前言 项目介绍 项目代码介绍 数据库文件 源码介绍 代码展示 配置文件 业务逻辑代码 总结 前言 大家好呀,前面不是说最近在学习SSM么,可能学的不是那么深,不过刚刚开始,学完肯定需要先动手 ...

  7. 2022-12-23:portainer是docker的web可视化工具。如果根据docker部署去写yaml,默认local是k8s,而不是docker,这不符合需求,需要修改yaml。请问部署在

    2022-12-23:portainer是docker的web可视化工具.如果根据docker部署去写yaml,默认local是k8s,而不是docker,这不符合需求,需要修改yaml.请问部署在 ...

  8. golang版本sdl2显示窗体

    golang版本sdl2显示窗体 go用syscall调用sdl2,在win10 x64上没问题,其他系统不敢保证. 见地址 package main import ( "fmt" ...

  9. vue全家桶进阶之路31:Vue3 数据和方法的双向绑定ref、reactive、toRefs

    ref 在 Vue 3 中,你可以使用 setup 函数来定义组件的数据和方法.在 setup 函数中,你可以使用 ref.reactive 和 computed 等 Vue 3 的响应式 API 来 ...

  10. Express实战个人订阅号实现网站登录

    今天我们来实现一个使用个人订阅号实现网站的功能,后端使用的是 express .其它框架原理基本一致,只是定义路由或返回响应数据部分代码跟 express 有所出入.先来一波效果图: 1. 前言 20 ...