セル編集時に 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
の内容に影響を与えることは決してありません