2012-05-18 12 views
5

Estoy tratando de agregar datos a una cuadrícula de datos (de hecho, cualquier control que presente datos en una cuadrícula), pero las columnas (nombres y números)) no se conocen hasta el tiempo de ejecución.Agregar filas a una cuadrícula de datos WPF donde las columnas no se conocen hasta el tiempo de ejecución

Las columnas que sí sé cómo crear: por ejemplo

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

Pero ¿cómo puedo añadir filas? No veo cómo puedo usar el enlace porque mis datos no están contenidos en un objeto con propiedades conocidas. Por ejemplo, los datos de cada fila pueden venir como una cadena []. Así que una vez podría tener tres columnas, otra vez podría tener cinco.

que estaba esperando do ser capaz de hacer algo como esto:

// 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

El enlace funciona con índices: puede crear una columna cuya expresión de enlace apunte a un índice de la fuente de datos si lo desea. También podría usar un diccionario para cada fila y usar una cadena como la clave, entonces su enlace podría usar el nombre de la columna en el diccionario para obtener el valor en lugar de un índice numérico – Charleh

Respuesta

11

tendría que Empieza a conectar en VS para entender el código exacto, pero lo más probable es que simplemente crees tus columnas y utilices la clave de columna como expresión de enlace, ya que las vinculaciones indexadas funcionan en WPF

Voy a conseguir un poco de código en un minuto - pero sería algo como el código de creación de la fila, pero con fijaciones en las columnas que parecen algo así como (valga los nombres de los métodos posiblemente incorrectos)

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

Actualización:

Sí no estoy seguro si esto es lo que está buscando, pero funciona:

crea una sola ventana con una cuadrícula de datos en él (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

Genial, no sabía que podrías vincular un índice. Funciona muy bien, ¡gracias! – MrNick

+1

He estado buscando respuestas en todo SO y esta es de lejos la solución más simple y directa que he visto para esto. Gracias. - Como nota adicional para otras personas que usan esta solución, asegúrese de que la propiedad 'AutoGenerateColumns' para DataGrid esté establecida en 'False'. – brandonstrong

-1

no han jugado con DataGrids mucho, pero se puede intentar algo como esto

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 no tiene un Propiedad de filas. Mi 'código' fue solo para ilustración. – MrNick

Cuestiones relacionadas