4

我有一个绑定到列表的 DataGridView。值显示正常,当我单击一个值时,它开始编辑,但是当我按 Enter 时,更改被忽略,没有数据被更改。当我在值设置器中放置一个断点时,我可以看到它在编辑后执行,但没有显示任何更改的数据。我的绑定代码如下所示:

namespace DataGridViewList
{
  public partial class Form1 : Form
  {
    public struct LocationEdit
    {
      public string Key { get; set; }
      private string _value;
      public string Value { get { return _value; } set { _value = value; } }
    };

    public Form1()
    {
      InitializeComponent();
      BindingList<LocationEdit> list = new BindingList<LocationEdit>();
      list.Add(new LocationEdit { Key = "0", Value = "Home" });
      list.Add(new LocationEdit { Key = "1", Value = "Work" });
      dataGridView1.DataSource = list;
    }
  }
}

该项目是一个基本的 Windows 窗体项目,在设计器中创建了一个 DataGrid,列名为 Key 和 Value,并将 DataPropertyName 分别设置为 Key / Value。没有值设置为只读。

我缺少一些步骤吗?我需要实施INotifyPropertyChanged,还是其他什么?

4

1 回答 1

4

问题是您使用 astruct作为 BindingList 项目类型。解决方案是您应该更改structclass并且效果很好。struct但是,如果您想继续struct使用class. 整个想法是,每当一个单元格的值发生变化时,底层项目(它是一个结构)应该分配给一个全新的结构项目。这是您可以用来更改基础值的唯一方法,否则提交更改后的单元格值将不会更改。我发现该事件CellParsing适合这种情况下添加自定义代码,这是我的代码:

namespace DataGridViewList
{
   public partial class Form1 : Form
   {
     public struct LocationEdit
     {
       public string Key { get; set; }
       private string _value;
       public string Value { get { return _value; } set { _value = value; } }
     };

     public Form1()
     {
       InitializeComponent();
       BindingList<LocationEdit> list = new BindingList<LocationEdit>();
       list.Add(new LocationEdit { Key = "0", Value = "Home" });
       list.Add(new LocationEdit { Key = "1", Value = "Work" });
       dataGridView1.DataSource = list;
     }
     //CellParsing event handler for dataGridView1
     private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e){
        LocationEdit current = ((BindingList<LocationEdit>)dataGridView1.DataSource)[e.RowIndex];
        string key = current.Key;
        string value = current.Value;
        string cellValue = e.Value.ToString()
        if (e.ColumnIndex == 0) key = cellValue;
        else value = cellValue;
        ((BindingList<LocationEdit>)dataGridView1.DataSource)[e.RowIndex] = new LocationEdit {Key = key, Value = value};
     }
   }
}

我认为继续使用struct这种方式不是一个好主意,class会更好。

于 2013-05-29T14:24:23.237 回答