Come associare l’elenco a dataGridView?

Mi sembra di andare in giro in tondo e lo sto facendo nelle ultime ore.

Voglio compilare un datagridview da una serie di stringhe. Ho letto il suo non è ansible direttamente, e che ho bisogno di creare un tipo personalizzato che tiene la stringa come una proprietà pubblica. Così ho fatto una lezione:

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

questa è la class contenitore e ha semplicemente una proprietà con il valore della stringa. Tutto quello che voglio ora è che la stringa appaia nella vista datagrid quando lego la sua origine dati ad una lista.

Inoltre ho questo metodo, BindGrid () con cui voglio riempire il datagridview. Ecco qui:

  private void BindGrid() { gvFilesOnServer.AutoGenerateColumns = false; //create the column programatically 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; } 

Infine, il problema: l’array di stringhe si riempie bene, l’elenco è creato ok, ma ottengo una colonna vuota nella vista datagrid. Ho anche provato datasource = list direttamente, invece di = bindingsource, ancora niente.

Gradirei davvero un consiglio, questo mi ha fatto impazzire.

Grazie

Utilizzare un BindingList e impostare DataPropertyName -Property della colonna.

Prova quanto segue:

 ... private void BindGrid() { gvFilesOnServer.AutoGenerateColumns = false; //create the column programatically 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 } 

potrebbe essere un po ‘tardi ma utile per il futuro. se non hai bisogno di impostare le proprietà personalizzate della cella e ti preoccupi solo del testo dell’intestazione e del valore della cella, questo codice ti aiuterà

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

e quindi è ansible associare Elenco come origine dati come

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

per ulteriori informazioni è ansible visitare questa pagina Associare l’elenco di oggetti di class come origine dati a DataGridView

spero che questo ti possa aiutare.

So che è vecchio, ma questo mi ha impiccato per un po ‘. Le proprietà dell’object nel tuo elenco devono essere “proprietà” effettive, non solo membri pubblici.

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

Invece di creare la nuova class Container puoi usare un 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; 

Maggiori informazioni su questo problema sono disponibili qui: http://psworld.pl/Programming/BindingListOfString

L’uso di DataTable è valido come dichiarato dall’utente927524. Puoi farlo anche aggiungendo manualmente le righe, che non richiedono l’aggiunta di una specifica class di wrapping:

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

In ogni caso, grazie user927524 per cancellare questo strano comportamento !!