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
版权声明:本文为博主原创文章,转载请附上博文链接!