2012-05-18 10 views
5

Sto tentando di aggiungere dati a un datagrid (in effetti, qualsiasi controllo che presenta i dati in una griglia), ma le colonne (sia nomi che numeri) non sono noti fino al runtime.Aggiunta di righe a un datagide WPF in cui le colonne non sono note fino al runtime

Le colonne so come creare: per esempio

DataGridTextColumn textColumn = new DataGridTextColumn(); 
textColumn.Header = column.DisplayName; 
MyDataGrid.Columns.Add(textColumn); 

Ma come faccio ad aggiungere le righe? Non vedo come posso utilizzare l'associazione perché i miei dati non sono contenuti in un oggetto con proprietà note. Ad esempio, i dati per ogni riga potrebbero venire come una stringa []. Quindi una volta potrei avere tre colonne, un'altra potrei averne cinque.

mi aspettavo do essere in grado di fare qualcosa del genere:

// Example data to represent a single row. 
string[] row1 = new[] { "value1", "value2", "value3" }; 

var row = new Row; 
row.AddCell(row1[0]); 
row.AddCell(row1[1]); 
row.AddCell(row1[2]); 
MyDataGrid.Rows.Add(row); 
+0

Il collegamento funziona con gli indici: è possibile creare una colonna la cui espressione di legame punta a un indice dell'origine dati, se lo si desidera. È anche possibile utilizzare un dizionario per ogni riga e utilizzare una stringa come chiave - quindi il binding potrebbe utilizzare il nome della colonna nel dizionario per recuperare il valore anziché un indice numerico – Charleh

risposta

11

avrei dovuto iniziare a collegare in VS per ottenere la mia testa intorno al codice esatto, ma molto probabilmente puoi semplicemente creare le tue colonne e usare la chiave di colonna come espressione di binding visto come i collegamenti indicizzati funzionano in WPF

I'll ottenere un certo codice in un minuto - ma sarebbe qualcosa di simile il codice di creazione fila ma con attacchi sulle colonne che sembrano qualcosa di simile (perdonare i nomi dei metodi eventualmente sbagliati)

textColumn.Bindings.Add(new Binding("this[" + columnIndex.ToString() + "]")); 

Aggiornamento:

Sì non so se questo è ciò che stai cercando, ma funziona:

creato una singola finestra con un datagrid su di esso (dataGrid1)

public MainWindow() 
    { 
     InitializeComponent(); 

     var col = new DataGridTextColumn(); 
     col.Header = "Column1"; 
     col.Binding = new Binding("[0]"); 
     dataGrid1.Columns.Add(col); 

     col = new DataGridTextColumn(); 
     col.Header = "Column2"; 
     col.Binding = new Binding("[1]"); 
     dataGrid1.Columns.Add(col); 

     col = new DataGridTextColumn(); 
     col.Header = "Column3"; 
     col.Binding = new Binding("[2]"); 
     dataGrid1.Columns.Add(col); 

     //dataGrid1.ad 

     List<object> rows = new List<object>(); 
     string[] value; 

     value = new string[3]; 

     value[0] = "hello"; 
     value[1] = "world"; 
     value[2] = "the end"; 
     rows.Add(value); 

     dataGrid1.ItemsSource = rows; 
    } 

Example

+0

Cool, non sapevo che potessi legarti a un indice. Funziona molto bene, grazie! – MrNick

+1

Ho cercato risposte in tutto SO e questa è di gran lunga la soluzione più semplice e diretta che ho visto per questo. Grazie. - Come nota aggiuntiva ad altre persone che utilizzano questa soluzione, assicurarsi che la proprietà 'AutoGenerateColumns' per DataGrid sia impostata su 'False'. – brandonstrong

-1

Non ho giocato con DataGrid molto, ma si può provare qualcosa di simile

int currentRow = MyDataGrid.Rows.Add(); 

MyDataGrid.Rows[currentRow].Cells[0].Value = row1[0]; 
MyDataGrid.Rows[currentRow].Cells[1].Value = row1[1]; 
MyDataGrid.Rows[currentRow].Cells[2].Value = row1[2]; 
+0

System.Windows.Controls.DataGrid non ha un Proprietà di righe Il mio 'codice' era solo a scopo illustrativo. – MrNick