Devexpress:在GridControl中使用BindingList

xiaoxiao2021-02-28  88

BindingList 是一个支持数据绑定的集合,修改集合或者集合中的项都可以反应到它的ListChanged事件中,将它作为gridcontrol的数据源可以通过编辑gridcontrol的cell来进行数据的添加,修改,删除以及验证等操作。

定义简单数据类:

public class Phone { public string Name { get; set; } public string Price { get; set; } public int Size { get; set; } }

定义数据管理类:

using System.ComponentModel; public class DataManager { BindingList<Phone> _modelList = new BindingList<Phone>(); /// <summary> /// 定义数据源 /// </summary> public BindingList<Phone> ModelList { get { return _modelList; } set { _modelList = value; } } }

定义窗口控件:

public partial class AddDataToGridControl : DevExpress.XtraEditors.XtraForm { DataManager manager = new DataManager(); public AddDataToGridControl() { InitializeComponent(); // 显示输入行 gv.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.True; gv.OptionsView.NewItemRowPosition = DevExpress.XtraGrid.Views.Grid.NewItemRowPosition.Top; gv.NewItemRowText = "点击输入数据"; #region 自定义列 GridColumn nameCol = new GridColumn(); nameCol.VisibleIndex = 0; nameCol.Caption = "Name"; nameCol.MinWidth = 30; nameCol.OptionsColumn.AllowMove = false; nameCol.FieldName = "Name"; GridColumn PriceCol = new GridColumn(); PriceCol.VisibleIndex = 1; PriceCol.Caption = "Price"; PriceCol.MinWidth = 50; PriceCol.OptionsColumn.AllowMove = false; PriceCol.FieldName = "Price"; GridColumn SizeCol = new GridColumn(); SizeCol.VisibleIndex = 2; SizeCol.Caption = "Size"; SizeCol.MinWidth = 50; SizeCol.OptionsColumn.AllowMove = false; SizeCol.FieldName = "Size"; gv.Columns.AddRange(new GridColumn[] { PriceCol, nameCol, SizeCol }); #endregion #region 添加底部统计显示 this.gv.OptionsView.ShowFooter = true; this.gv.Columns["Name"].Summary.Add(DevExpress.Data.SummaryItemType.Count, "Name", "共计:{0}"); #endregion // 绑定数据源 gc.DataBindings.Add(new Binding("DataSource", manager, "ModelList", true, DataSourceUpdateMode.OnPropertyChanged)); } 运行界面如下:

添加数据

“点击输入数据”,gridcontrol处于编辑模式,输入Name,Price,Size,按Enter键,数据添加到ModelList集合中:

行数据验证:

触发行的ValidateRow事件来进行数据有效性的验证,自定义设置显示错误信息。

#region 验证行事件 gv.ValidateRow += (m, n) => { GridView view = m as GridView; // 获取绑定的数据对象 Phone phone = n.Row as Phone; if (string.IsNullOrEmpty(phone.Name)) { view.SetColumnError(view.Columns["Name"], "名称不能为空"); // 设置列显示错误 n.Valid = false; return; } }; gv.InvalidRowException += (m, n) => { GridView view = m as GridView; n.WindowCaption = "提示"; n.ExceptionMode = ExceptionMode.NoAction; }; #endregion 假定验证Name不能为空(其它复杂验证一样),通过使用SetColumnError方法显示错误信息:

注意当验证失败,设置Valid=false;时  是不会更新数据到ModelList集合的。 异常提示方式也可以使用弹出框形式:

if (string.IsNullOrEmpty(phone.Name)) { //view.SetColumnError(view.Columns["Name"], "名称不能为空"); // 设置列显示错误 n.Valid = false; XtraMessageBox.Show("名称不能为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; }

编辑数据:

编辑数据直接在gridControl的cell中操作即可,行验证继续有效。

删除数据:

通过获取选中行的数据对象类,从ModelList集合中移除,此时ListChanged事件会触发并通知gridControl数据源已更改。选中oppo数据行,点击“删除”:

删除事件:

private void simpleButton1_Click(object sender, EventArgs e) { if (XtraMessageBox.Show("确定删除?", "提示", MessageBoxButtons.YesNo,MessageBoxIcon.Warning) == DialogResult.No) return; // 获取选中对象 Phone selModel = (Phone)gv.GetFocusedRow(); if (selModel != null) { manager.ModelList.Remove(selModel); } }

输入数据之后,验证输入数据的有效性之后,就可以直接对ModelList集合进行任何操作。使用gridControl来操作数据,不仅减少的界面的创建,同时它的验证机制也方便我们根据自己的需要进行编辑。

转载请注明原文地址: https://www.6miu.com/read-25126.html

最新回复(0)