在使用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. 详解 APISIX Lua 动态调试插件 inspect

    作者罗锦华,API7.ai 技术专家/技术工程师,开源项目 pgcat,lua-resty-ffi,lua-resty-inspect 的作者. 原文链接 为什么需要 Lua 动态调试插件? Apac ...

  2. Network Science:巴拉巴西网络科学阅读笔记2 第一章图论

    第一章:图论 完全图又被称为团. Metcalfe's Law: Metcalfe's law states that the value of a telecommunications networ ...

  3. Django框架——静态文件配置、form表单、request对象、连接数据库、ORM简介、ORM基本操作和语句

    配置文件介绍 SECRET_KEY = '0yge9t5m9&%=of**qk2m9z^7-gp2db)g!*5dzb136ys0#)*%*a' # 盐 DEBUG = True # 调试模式 ...

  4. 2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K。 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑。返回所有可能的结果中,代表最大数字的结果。

    2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K. 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑.返 ...

  5. blender 3D 建模仿真摄像头视角

    前言 摄像头的视角模拟,可以在产品概念设计阶段提供比较直观的视觉效果,通过将模型与实际环境进行校准,基本上可以通过模型来确定摄像头需要FOV,焦距,景深和安装位置及角度等参数. 由于工作需要,第一次自 ...

  6. LLM探索:GPT概念与几个常用参数 Top-k, Top-p, Temperature

    前言 上一篇文章介绍了几个开源LLM的环境搭建和本地部署,在使用ChatGPT接口或者自己本地部署的LLM大模型的时候,经常会遇到这几个参数,本文简单介绍一下~ temperature top_p t ...

  7. Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】

    〇.简介 1.什么是简单工厂模式? 一句话解释:   客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类. 简单工厂模式(Simple Factory Pattern)是日常开发中常用的 ...

  8. 代码随想录算法训练营Day52 动态规划

    代码随想录算法训练营 代码随想录算法训练营Day52 动态规划| 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 300.最长递增子序列 题目链接:300.最长递增子序列 ...

  9. 10.5. 版本控制(如Git)

    版本控制系统(Version Control System,VCS)是软件开发过程中用于管理源代码的工具.它可以帮助你跟踪代码的变更历史,方便回滚到之前的版本,以及协同多人共同开发.Git是当前最流行 ...

  10. WPF中控件转命令

    WPF不是所有控件都有Command属性,如果窗体需要在ViewModel 使用System.Windows.Interactivity事件 在nuget浏览搜索 下载System.Windows.I ...