2012-05-18 9 views
5

Próbuję dodać dane do datagridu (w rzeczywistości każda kontrolka, która prezentuje dane w siatce), ale kolumny (zarówno nazwy, jak i liczby)) nie są znane do czasu wykonania.Dodawanie wierszy do datagridu WPF, w którym kolumny nie są znane do czasu wykonania

Kolumny wiem jak utworzyć: np

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

Ale jak mogę dodać wiersze? Nie widzę sposobu, w jaki można używać wiązania, ponieważ moje dane nie są zawarte w obiekcie o znanych właściwościach. Na przykład dane dla każdego wiersza mogą pojawić się jako ciąg []. Więc pewnego razu mogę mieć trzy kolumny, innym razem mogę mieć pięć.

Spodziewałem się bądź w stanie zrobić coś takiego:

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

Tworzenie powiązań z indeksami - możesz utworzyć kolumnę, której wiążące wyrażenie wskazuje na indeks źródła danych, jeśli chcesz. Możesz także użyć słownika dla każdego wiersza i użyć ciągu jako klucza - wtedy twoje powiązanie może używać nazwy kolumny w słowniku, aby pobrać wartość, a nie numeryczny indeks – Charleh

Odpowiedz

11

Musiałbym zacznij odłączyć się w VS, aby uzyskać dokładniejszy kod, ale najprawdopodobniej po prostu utwórz kolumny i użyj klucza kolumny jako wyrażenia wiążącego, widząc jak indeksowane wiązania działają w WPF

Będę trochę kodu w górę w minutę - ale to wyglądać kodzie tworzenia wierszy, ale z powiązaniami na kolumnach, które wyglądają mniej więcej tak (wybacz ewentualnie nieprawidłowe nazwy metody)

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

UPDATE:

Tak nie wiem, czy to jest to, czego szukasz, ale to działa:

Utworzono jedno okno z datagrid na nim (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

Fajnie, nie wiedziałem, że możesz związać indeks. Działa bardzo dobrze, dziękuję! – MrNick

+1

Szukałem odpowiedzi na całym SO i jest to zdecydowanie najbardziej proste i proste rozwiązanie, jakie widziałem w tym zakresie. Dziękuję Ci. - Jako dodatkową notatkę dla innych osób, które używają tego rozwiązania, upewnij się, że właściwość "AutoGenerateColumns" dla DataGrid jest ustawiona na "False". – brandonstrong

-1

nie grałeś z datagrids dużo, ale można spróbować coś takiego

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 nie ma Właściwość wierszy. Mój "kod" miał jedynie charakter ilustracyjny. – MrNick

Powiązane problemy