Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在更新绑定对象之前验证单元格输入_C#_Winforms_Datagridview - Fatal编程技术网

C# 在更新绑定对象之前验证单元格输入

C# 在更新绑定对象之前验证单元格输入,c#,winforms,datagridview,C#,Winforms,Datagridview,我使用BindingList将对象绑定到DataGridView 在更新基础绑定对象属性之前,我需要验证键入到单元格中的数据 我试图使用cellvalizing事件,但我已经设置了断点,绑定对象的属性在cellvalizing之前获得了新值 我正在寻找类似于CellBeforeUpdate的事件,该事件在此网格中不存在 我错过了什么明显的东西吗 {Edit,这是一个编程错误。我插入了一个将索引移位1的列,CellValidating事件中的代码看到了错误的注释 我认为更好的做法是使用列名而不是索

我使用BindingList将对象绑定到DataGridView

在更新基础绑定对象属性之前,我需要验证键入到单元格中的数据

我试图使用
cellvalizing
事件,但我已经设置了断点,绑定对象的属性在
cellvalizing
之前获得了新值

我正在寻找类似于CellBeforeUpdate的事件,该事件在此网格中不存在

我错过了什么明显的东西吗

{Edit,这是一个编程错误。我插入了一个将索引移位1的列,CellValidating事件中的代码看到了错误的注释


我认为更好的做法是使用列名而不是索引来避免像这样的错误}

我不同意你的评论,即

“绑定对象的属性在 “是的。”

在执行“离开”网格
cellvalizing
事件之前,基础数据源不会更改

单元验证
事件的开始处放置断点。然后运行代码,对网格中的单元格进行更改,然后尝试离开该单元格。当断点到达时,请查看底层数据源。它不会显示网格单元中的更改

由于没有显示代码,我只能假设在
cellvalizing
事件中,有“某种”检查来验证单元格中的数据是否无效。您如何检查这是未知的,我们只能假设您正在检查正确的值

但是,在任何情况下,如果您检查单元格中的值并确定它是无效值,并且希望在“编辑”之前将单元格值设置为其原始值,则调用grids
CancelEdit()
方法即可完成此操作。类似于

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;
    }
    
  • 现在还不知道“T”是什么,我们只能猜测它是一个基本类

  • 电网已订阅(连接)其
    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
    ,以便在设置的任何断点处检查其值。在forms
    Load
    事件中,用测试数据填充
    GridBindingList
    ,最后将grids
    DataSource
    设置为此绑定列表

    这是我能破译的最接近匹配您的代码的代码,因为您拒绝显示它

    您可以声明,当用户在网格中的单元格中键入文本,然后尝试离开该单元格时,
    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后触发