So aktualisieren Sie die Datenquelle einer DataGridView bei der Zellenbearbeitung

So aktualisieren Sie die Datenquelle einer DataGridView bei der Zellenbearbeitung

Die Lösung zum Aktualisieren der Datenquelle einer DataGridView bei der Zellenbearbeitung
ist unten angegeben:

Ich habe meine Klassenberichte über die unten stehende Select-Anweisung an die DataSource einer dataGridView angehängt, weil ich nicht möchte, dass Prop3 im DGV angezeigt wird. Ich habe dann das cellClick-Ereignis aktualisiert, um ReadOnly zu entfernen, da dies bei den ersten Durchläufen ein Problem zu sein schien.

Wenn ich auf eine Zelle klicke und versuche, einen Wert auf 123 zu ändern, wechselt er zurück zu 456, sobald ich die Eingabetaste drücke. Ich habe versucht, verschiedene andere Ereignisse wie CellEndEdit, CellValueChanged und alle anderen Ereignisse zu verwenden, von denen ich dachte, dass sie erfolglos helfen könnten. Ich kann nicht einmal den Wert (123) finden, den ich ändern möchte, um ihn irgendwo zu speichern, während ich den Code mit Haltepunkten ausführe. Ich möchte sicherstellen, dass der Wert in myClass auf 123 gesetzt wird, nachdem die Zellenbearbeitung abgeschlossen ist. Wenn ich die Select-Anweisung nicht verwende, werden alle 3 Eigenschaften im DGV angezeigt und ich kann dann die Werte so bearbeiten, wie ich es verlange, aber ich möchte auch hier nicht, dass Prop3 die Select-Anweisung anzeigt. P>

    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() { }
    }

Es ist viel einfacher, die Spalte einfach aus der DGV zu entfernen, nachdem sie generiert wurde

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

Beachten Sie, dass standardmäßig der AutoGenerateColumns einer DataGridView ist Eigentum ist wahr. Wenn Sie an eine Liste von MyClass binden, untersucht DGV die Eigenschaften von MyClass und erstellt Spalten für sie, wobei der Datentyp und der Name berücksichtigt werden

Nichts hindert Sie daran, seine Kreationen nachträglich zu bearbeiten:

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

Aber das Raster ist nicht an myClass gebunden; Sie haben an anderer Stelle im Speicher eine neue, andere, völlig separate Liste erstellt, als Sie ToList() gemacht haben in myClass.Select(...).ToList() und das Gitter an die neue Liste gebunden.

Schlimmer noch, im Select Sie haben ein neues anonymes typisiertes Objekt erstellt und die Dateninhalte der Eigenschaften Ihrer MyClass-Elemente kopiert, wodurch die Instanzen von MyClass vollständig getrennt wurden gespeichert in myClass und band das Grid an eine Liste voller anonymer Typen, die zufällig Kopien der Daten hatten

Der Strohhalm, der das Fass zum Überlaufen bringt, ist, dass anonyme Typen unveränderlich sind – Sie haben Ihr Grid an eine brandneue Liste gebunden, voller brandneuer schreibgeschützter anonymer Typen..

..das Grid könnte niemals den Inhalt von myClass beeinflussen