关闭

Devexpress:在GridControl中使用BindingList

110人阅读 评论(0) 收藏 举报
分类:

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

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:103572次
    • 积分:1377
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:0篇
    • 译文:1篇
    • 评论:24条
    文章分类
    最新评论