DevExpress 在GridControl中使用BindingList

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中操作即可,行验证继续有效。

扫描二维码关注公众号,回复: 6046921 查看本文章
  • 删除数据:

通过获取选中行的数据对象类,从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来操作数据,不仅减少的界面的创建,同时它的验证机制也方便我们根据自己的需要进行编辑。

  • 补充:关于List与BindingList的转换

1、DataGridView数据绑定对比(DataTable与泛型List):
  当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时,DataGridView的数据会随之改变,无需重新绑定到DataGridView。
  当DataGridView的DataSource是泛型List,当List的数据改变时,则需要先将DataGridView的DataSource设置为new List<T>(),再将改变后的List<T>赋给DataGridView的DataSource。

绑定List时,注意:切莫将DataGridView的DataSource设置为Null,否则会破坏DataGridView的列结构。

2、数据绑定后的添加删除问题:
  如果要对绑定在DataGridView中的List<T>进行数据的添加删除,先要把List<T>转换成BindingList<T>,再进行绑定:DataGridView.DataSource=new BindingList<T>(new List<T>)。否则的话会产生许多意想不到的错误。
如:初始绑定空数据后再添加数据绑定后,却取不到DataGridView.CurrentCell属性。

3、使用泛型绑定依然可以添加删除:
  IList<T> list= new List<T>();
  DataGridView.DataSource=list;//DataGridView的行不能添加删除
  DataGridView.DataSource=new BindingList<T>(list);//DataGridView的行可以添加删除(只有允许添加行、删除行)

4、BingdingList<T>转List<T>

List<T> modelList=new List<T>((BindingList<T>)this.DataGridView.DataSource);
说明:BindingList<T>和List<T>都有个构造函数,参数是IEnumerable<T>,既然他们俩个都是继承IEnumerable,当然能相互转换。

---------------------

原文:https://blog.csdn.net/duanzi_peng/article/details/77742738
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/kone0611/article/details/88894823