Cómo actualizar la fuente de datos de DataGridView en la edición de celdas

Cómo actualizar la fuente de datos de DataGridView en la edición de celdas

La solución para cómo actualizar la fuente de datos de DataGridView en la edición de celdas
se proporciona a continuación:

Adjunté los informes de mi clase a la fuente de datos de DataGridView a través de la instrucción Select a continuación porque no quiero que Prop3 aparezca en el DGV. Luego actualicé el evento cellClick para eliminar ReadOnly porque parecía ser un problema durante las ejecuciones iniciales.

Cuando hago clic en una celda y trato de cambiar un valor a 123, vuelve a cambiar a 456 una vez que presiono Intro. Intenté usar varios otros eventos como CellEndEdit, CellValueChanged y cualquier otro evento que pensé que podría ayudar sin suerte. Ni siquiera puedo encontrar el valor (123) que intento cambiar a almacenado en cualquier lugar mientras ejecuto el código con puntos de interrupción. Quiero asegurarme de que el valor en myClass se establezca en 123 después de que se haya completado la edición de la celda. Si no uso la declaración de selección, las 3 propiedades se mostrarán en el DGV y luego puedo editar los valores de la forma en que lo solicito, pero nuevamente no quiero que se muestre Prop3, así que usé la declaración de selección.

    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 mucho más sencillo eliminar la columna del DGV después de que se haya generado

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

Tenga en cuenta que, de forma predeterminada, AutoGenerateColumns de DataGridView la propiedad es verdadera. Cuando se vincula a una lista de MyClass, DGV inspeccionará las propiedades de MyClass y creará columnas para ellas, teniendo en cuenta el tipo de datos y el nombre

Nada te impide editar sus creaciones después:

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

Pero la cuadrícula no está vinculada a myClass; creaste una Lista nueva, diferente y totalmente separada en otra parte de la memoria cuando hiciste ToList() en myClass.Select(...).ToList() y vinculó la cuadrícula a la nueva lista.

Peor aún, en el Select creó un nuevo objeto anónimo escrito y copió los contenidos de datos de las propiedades de sus elementos de MyClass, lo que desconectó por completo las instancias de MyClass almacenado en myClass y vinculó la cuadrícula a una lista llena de tipos anónimos que simplemente tenían copias de los datos

La gota que colmó el vaso es que los tipos anónimos son inmutables – Ha vinculado su cuadrícula a una lista completamente nueva, llena de nuevos tipos anónimos de solo lectura..

..la cuadrícula nunca podría influir en el contenido de myClass