Cómo enlazar la lista a dataGridView?

Parece que estoy corriendo en círculos y lo he estado haciendo en las últimas horas.

Quiero rellenar una vista de cuadrícula de datos a partir de una matriz de cadenas. He leído que no es posible directamente, y que necesito crear un tipo personalizado que mantenga la cadena como una propiedad pública. Entonces hice una clase:

public class FileName { private string _value; public FileName(string pValue) { _value = pValue; } public string Value { get { return _value; } set { _value = value; } } } 

esta es la clase contenedor, y simplemente tiene una propiedad con el valor de la cadena. Todo lo que quiero ahora es que la cadena aparezca en la vista de cuadrícula de datos, cuando vinculo su fuente de datos a una lista.

También tengo este método, BindGrid () con el que quiero rellenar la vista de cuadrícula de datos. Aquí está:

  private void BindGrid() { gvFilesOnServer.AutoGenerateColumns = false; //create the column progtwigtically DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn(); DataGridViewCell cell = new DataGridViewTextBoxCell(); colFileName.CellTemplate = cell; colFileName.Name = "Value"; colFileName.HeaderText = "File Name"; colFileName.ValueType = typeof(FileName); //add the column to the datagridview gvFilesOnServer.Columns.Add(colFileName); //fill the string array string[] filelist = GetFileListOnWebServer(); //try making a List from that array List filenamesList = new List(filelist.Length); for (int i = 0; i < filelist.Length; i++) { filenamesList.Add(new FileName(filelist[i].ToString())); } //try making a bindingsource BindingSource bs = new BindingSource(); bs.DataSource = typeof(FileName); foreach (FileName fn in filenamesList) { bs.Add(fn); } gvFilesOnServer.DataSource = bs; } 

Finalmente, el problema: la matriz de cadenas se llena, la lista se crea bien, pero obtengo una columna vacía en la vista de tabla de datos. También probé datasource = list directamente, en lugar de = bindingsource, todavía nada.

Realmente agradecería un consejo, esto me está volviendo loco.

Gracias

Use una BindingList y establezca DataPropertyName -Property de la columna.

Pruebe lo siguiente:

 ... private void BindGrid() { gvFilesOnServer.AutoGenerateColumns = false; //create the column progtwigtically DataGridViewCell cell = new DataGridViewTextBoxCell(); DataGridViewTextBoxColumn colFileName = new DataGridViewTextBoxColumn() { CellTemplate = cell, Name = "Value", HeaderText = "File Name", DataPropertyName = "Value" // Tell the column which property of FileName it should use }; gvFilesOnServer.Columns.Add(colFileName); var filelist = GetFileListOnWebServer().ToList(); var filenamesList = new BindingList(filelist); // < -- BindingList //Bind BindingList directly to the DataGrid, no need of BindingSource gvFilesOnServer.DataSource = filenamesList } 

puede ser un poco tarde pero útil para el futuro. si no necesita establecer propiedades personalizadas de la celda y solo se preocupa por el texto del encabezado y el valor de la celda, este código le ayudará

 public class FileName { [DisplayName("File Name")] public string FileName {get;set;} [DisplayName("Value")] public string Value {get;set;} } 

y luego puede vincular List como origen de datos como

 private void BindGrid() { var filelist = GetFileListOnWebServer().ToList(); gvFilesOnServer.DataSource = filelist.ToArray(); } 

para obtener más información, puede visitar esta página. Lista de objetos de clase como fuente de datos a DataGridView.

Espero que esto te ayudará.

Sé que esto es viejo, pero esto me colgó por un tiempo. Las propiedades del objeto en su lista deben ser “propiedades” reales, no solo miembros públicos.

 public class FileName { public string ThisFieldWorks {get;set;} public string ThisFieldDoesNot; } 

En lugar de crear la nueva clase Container, puede usar una dataTable.

 DataTable dt = new DataTable(); dt.Columns.Add("My first column Name"); dt.Rows.Add(new object[] { "Item 1" }); dt.Rows.Add(new object[] { "Item number 2" }); dt.Rows.Add(new object[] { "Item number three" }); myDataGridView.DataSource = dt; 

Puede encontrar más información sobre este problema aquí: http://psworld.pl/Programming/BindingListOfString

El uso de DataTable es válido como declaró user927524. También puede hacerlo agregando filas manualmente, lo que no requerirá agregar una clase de ajuste específica:

 List filenamesList = ...; foreach(string filename in filenamesList) gvFilesOnServer.Rows.Add(new object[]{filename}); 

En cualquier caso, ¡gracias user927524 por borrar este extraño comportamiento!