Devexpress:在GridControl中使用BindingList

原创 2017年08月31日 11:25:57

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

test

test

DataGridView单元格美化

#region 重绘Column、Row         int _RowHeadWidth = 41;         ///            /// 重绘Co...

DevExpress GridControl的使用

1.DevExpress控件组中的GridControl控件不能使横向滚动条有效。现象:控件中的好多列都挤在一起列宽都变的很小,根本无法正常浏览控件单元格中的内容。 解决: gridView1.O...

DevExpress-GridControl控件-GridView使用

GridControl在不同版本(目前使用14.1.8)提供了多种不同的视图,它不仅比DataGridView强大,而且在数据加载性能各方面也有了很大的提升。 在此对之前的研究做一份整理记录,以备后用...
  • Yokeqi
  • Yokeqi
  • 2015年01月21日 11:50
  • 4799

DevExpress Gridcontrol的使用小结

1. DevExpress控件组中的GridControl控件不能使横向滚动条有效。现象:控件中的好多列都挤在一起,列宽都变的很小,根本无法正常浏览控件单元格中的内容。 解决: gridV...

DevExpress中GridControl的使用

  • 2012年07月21日 16:01
  • 47KB
  • 下载

DevExpress的GridControl中自定义列中使用RadioButton在拉动滚动条后数据丢失的解决方法

在DevExpress中使用GridControl,其中有一列需要使用RadioButton,有两个问题,一是RadioButton的数据绑定问题,详见上一篇文章,二是在选中RadioButton后,...

DevExpress gridControl的使用技巧总结

一、如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二、如何新增一条记录 (1)、gridVi...

DevExpress GridControl使用

public Form2() { InitializeComponent(); //不显示内置的导航条。 gc1.UseEmbeddedNavigator = false; //不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Devexpress:在GridControl中使用BindingList
举报原因:
原因补充:

(最多只允许输入30个字)