2012-05-18 20 views
5

Tôi đang cố gắng thêm dữ liệu vào bảng dữ liệu (trên thực tế, bất kỳ điều khiển nào trình bày dữ liệu trong lưới sẽ làm), nhưng các cột (cả tên và số)) không được biết cho đến khi chạy.Thêm hàng vào một DataGrid WPF nơi các cột không được biết đến cho đến khi chạy

Các cột TÔI biết làm thế nào để tạo ra: ví dụ

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

Nhưng làm thế nào để tôi thêm hàng? Tôi không thấy làm thế nào tôi có thể sử dụng ràng buộc bởi vì dữ liệu của tôi không được chứa trong một đối tượng với các thuộc tính đã biết. Ví dụ: dữ liệu cho mỗi hàng có thể là một chuỗi []. Vì vậy, một lần tôi có thể có ba cột, một lần khác tôi có thể có năm cột.

tôi đã mong làm có thể làm một cái gì đó như thế này:

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

Ràng buộc hoạt động với các chỉ mục - bạn có thể tạo cột có biểu thức ràng buộc trỏ đến chỉ mục của nguồn dữ liệu nếu bạn muốn. Bạn cũng có thể sử dụng từ điển cho mỗi hàng và sử dụng chuỗi làm khóa - khi đó liên kết của bạn có thể sử dụng tên cột trên từ điển để tìm nạp giá trị thay vì chỉ mục số – Charleh

Trả lời

11

tôi phải bắt đầu cắm vào VS để có được đầu của tôi vòng chính xác mã, nhưng bạn rất có thể chỉ cần tạo cột của bạn và sử dụng phím cột như biểu thức ràng buộc nhìn thấy như binded lập chỉ mục làm việc trong WPF

Tôi sẽ nhận được một số mã lên trong một phút - nhưng nó sẽ giống như mã tạo hàng của bạn, nhưng với các ràng buộc trên cột giống như thế (tha thứ cho tên phương pháp có thể không chính xác)

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

Cập nhật:

Ừ không chắc chắn nếu điều này là những gì bạn đang tìm kiếm nhưng nó hoạt động:

tạo một cửa sổ duy nhất với một DataGrid vào nó (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

Thật tuyệt, tôi không biết bạn có thể liên kết với chỉ mục. Hoạt động rất tốt, cảm ơn bạn! – MrNick

+1

Tôi đã tìm kiếm câu trả lời cho tất cả SO và đây là giải pháp đơn giản và thẳng tiến nhất mà tôi đã thấy cho điều này. Cảm ơn bạn. - Là một lưu ý bổ sung cho những người khác sử dụng giải pháp này, hãy đảm bảo rằng thuộc tính 'AutoGenerateColumns' cho DataGrid được đặt thành 'False'. – brandonstrong

-1

đã không chơi với datagrids rất nhiều nhưng bạn có thể thử một cái gì đó như thế này

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 không có Hàng thuộc tính. 'Mã' của tôi chỉ để minh họa. – MrNick

Các vấn đề liên quan