C# 在更新绑定对象之前验证单元格输入
我使用BindingList将对象绑定到DataGridView 在更新基础绑定对象属性之前,我需要验证键入到单元格中的数据 我试图使用C# 在更新绑定对象之前验证单元格输入,c#,winforms,datagridview,C#,Winforms,Datagridview,我使用BindingList将对象绑定到DataGridView 在更新基础绑定对象属性之前,我需要验证键入到单元格中的数据 我试图使用cellvalizing事件,但我已经设置了断点,绑定对象的属性在cellvalizing之前获得了新值 我正在寻找类似于CellBeforeUpdate的事件,该事件在此网格中不存在 我错过了什么明显的东西吗 {Edit,这是一个编程错误。我插入了一个将索引移位1的列,CellValidating事件中的代码看到了错误的注释 我认为更好的做法是使用列名而不是索
cellvalizing
事件,但我已经设置了断点,绑定对象的属性在cellvalizing
之前获得了新值
我正在寻找类似于CellBeforeUpdate的事件,该事件在此网格中不存在
我错过了什么明显的东西吗
{Edit,这是一个编程错误。我插入了一个将索引移位1的列,CellValidating事件中的代码看到了错误的注释
我认为更好的做法是使用列名而不是索引来避免像这样的错误}我不同意你的评论,即 “绑定对象的属性在 “是的。” 在执行“离开”网格
cellvalizing
事件之前,基础数据源不会更改
在单元验证
事件的开始处放置断点。然后运行代码,对网格中的单元格进行更改,然后尝试离开该单元格。当断点到达时,请查看底层数据源。它不会显示网格单元中的更改
由于没有显示代码,我只能假设在cellvalizing
事件中,有“某种”检查来验证单元格中的数据是否无效。您如何检查这是未知的,我们只能假设您正在检查正确的值
但是,在任何情况下,如果您检查单元格中的值并确定它是无效值,并且希望在“编辑”之前将单元格值设置为其原始值,则调用gridsCancelEdit()
方法即可完成此操作。类似于
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
if (e.FormattedValue.ToString() == "some invalid value") {
dataGridView1.CancelEdit();
}
}
编辑…
为了帮助你,我所能做的就是证明你所说的正在发生。。。在给定信息下不可复制
从我能理解的
BindingList
作为网格的数据源
private BindingList<ItemClass> GetData() {
BindingList<ItemClass> bl = new BindingList<ItemClass>();
for (int i = 1; i < 16; i++) {
bl.Add(new ItemClass { ItemCode = i, ItemName = "Item " + i });
}
return bl;
}
CellValidating
事件
int
属性被命名为“ItemCode”。此外,还添加了一个名为“ItemName”的附加字符串属性。该属性尽可能基本
public class ItemClass {
public int ItemCode { get; set; }
public string ItemName { get; set; }
}
为了提供帮助,我们将创建一个GetData
方法,该方法返回15个ItemClass
对象的BindingList
。我们将使用此绑定列表作为网格的数据源
private BindingList<ItemClass> GetData() {
BindingList<ItemClass> bl = new BindingList<ItemClass>();
for (int i = 1; i < 16; i++) {
bl.Add(new ItemClass { ItemCode = i, ItemName = "Item " + i });
}
return bl;
}
因此,创建一个新的winforms项目并将一个DataGridView
放到表单上。除了上面的代码,我们需要的唯一代码是下面的
BindingList<ItemClass> GridBindingList;
public Form2() {
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e) {
GridBindingList = GetData();
dataGridView1.DataSource = GridBindingList;
}
BindingList GridBindingList;
公共表格2(){
初始化组件();
}
私有void Form2_加载(对象发送方、事件参数e){
GridBindingList=GetData();
dataGridView1.DataSource=GridBindingList;
}
我们创建一个“全局”变量gridbindingslist
,以便在设置的任何断点处检查其值。在formsLoad
事件中,用测试数据填充GridBindingList
,最后将gridsDataSource
设置为此绑定列表
这是我能破译的最接近匹配您的代码的代码,因为您拒绝显示它
您可以声明,当用户在网格中的单元格中键入文本,然后尝试离开该单元格时,gridbindingslist
会在调用网格cellvalizing
事件之前使用网格单元格中的文本进行更新
我坚持我的意见,你在这个问题上是错的。使用上面的代码,您应该能够自己进行测试
执行时,上面的代码应该会生成类似于左侧表单的内容
在编辑网格中的第二项后,它可能看起来像右边的表单
然后离开单元格,网格cellvalizing
事件触发。满足断点,在事件的第一行停止执行,如下所示
如图所示,GridBindingList
的第二项尚未更改。此外,在观察列表的下方,我们可以看到格式化值“fsdgfdfdf”仍显示在网格中
private BindingList<ItemClass> GetData() {
BindingList<ItemClass> bl = new BindingList<ItemClass>();
for (int i = 1; i < 16; i++) {
bl.Add(new ItemClass { ItemCode = i, ItemName = "Item " + i });
}
return bl;
}
你能提供再现你描述的代码吗?从你对这个答案的评论中
“我在底层对象的属性中放置断点,它在CellValidating事件之前100%激发。”
然后“展示”一个这样的例子。我希望这个示例演示在网格cellvalizing
事件触发之前,底层数据源不会发生更改。请发布您的代码好吗?或者您尝试过但似乎不起作用的内容。通常的顺序是CellEndEdit
,CellValueChanged
,CellEndEdit
,CellEndEdit
。在CellValidating
中,基础数据对象保持不变。没有太多可以粘贴的代码。我有一个绑定到datagridview的BindingList。我有一个单元格列ItemCode,它绑定到Bindinglist中对象的ItemCode属性。我在属性设置程序中设置了一个断点,当我编辑单元格时,它会在触发CellValidating事件之前到达设置程序断点。很抱歉,浪费了大家的时间。这是一个编程错误。我使用索引而不是列名访问列,并且在前面添加了一列,将所有索引移动了一位。Cellvalidating事件在设置becau后触发