セル編集時に DataGridView のデータソースを更新する方法

セル編集時に DataGridView のデータソースを更新する方法の解決策は
以下にあります:

Prop3 を DGV に表示させたくないので、以下の Select ステートメントを使用してクラス Reports を dataGridView の DataSource にアタッチしました。次に cellClick イベントを更新して ReadOnly を削除しました。最初の実行で問題が発生したようだったからです。

セルをクリックして値を 123 に変更しようとすると、Enter キーを押すと 456 に戻ります。 CellEndEdit、CellValueChanged など、他のさまざまなイベントを使用しようとしましたが、運が悪いと思われる他のイベントを使用しました。ブレークポイントを使用してコードを実行しているときに、格納されている場所に変更しようとしている値 (123) を見つけることさえできません。セルの編集が完了した後、myClass の値が 123 に設定されるようにしたいと考えています。 select ステートメントを使用しない場合、3 つのプロパティすべてが DGV に表示され、要求どおりに値を編集できますが、Prop3 を表示したくないので、select ステートメントを使用します。

    List<MyClass> myClass;
    public Form3()
    {
        InitializeComponent();

        myClass = new List<MyClass>();
        for (int i = 0; i < 2; i++)
        {
            myClass.Add(new MyClass(456, 456));
        }
        dataGridView1.DataSource = myClass.Select(x => new { x.Prop1, x.Prop2 }).ToList();
        dataGridView1.ReadOnly = false;
        dataGridView1.CellClick += DataGridView1_CellClick;
    }

    private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        (sender as DataGridView).CurrentCell.ReadOnly = false;

    }

    public class MyClass
    {
        public int Prop1{get;set;}
        public int Prop2 {get;set;}
        public int Prop3 {get;set;}
        public MyClass(int prop1, int prop2)
        {
            Prop1 = prop1;
            Prop2 = prop2;
        }
        public MyClass() { }
    }

列を生成した後、DGV から列を削除する方がはるかに簡単です

var x = new List<MyClass>(){
  new MyClass(){ Prop1 = 1, Prop2 = 22, Prop3 = 4015559191 },
  new MyClass(){ Prop1 = "Fred", Prop2 = 23, Prop3 = "4015559002" },
};

デフォルトでは DataGridView の AutoGenerateColumns に感謝します プロパティは true です。 MyClass のリストにバインドすると、DGV は MyClass のプロパティを検査し、データ型と名前を考慮してそれらの列を作成します

後でその作品を編集するのを止めるものは何もありません:

dataGridView1.DataSource = x;

dataGridView1.AutogenerateColumns = false; //turn it off so it doesn't later recreate removed columns
dataGridView1.Columns.Remove("Prop3"); //Prop3 property became a column named Prop3

ただし、グリッドは myClass にバインドされていません; ToList() を実行したときに、メモリ内の別の場所に新しい、異なる、まったく別のリストを作成しました myClass.Select(...).ToList() で グリッドを新しいリストにバインドします。

さらに悪いことに、Select では 新しい匿名の型付きオブジェクトを作成し、MyClass アイテムのプロパティのデータ コンテンツをコピーしました。これにより、MyClass のインスタンスが完全に切断されました。 myClass に保存 グリッドを、たまたまデータのコピーを持つ匿名型でいっぱいのリストにバインドします

ラクダの背中を壊すストローは、匿名型が不変であるということです – まったく新しい読み取り専用の匿名型でいっぱいの、まったく新しいリストにグリッドをバインドしました..

..グリッドが myClass の内容に影響を与えることは決してありません