在wpf中动态地将列添加到DataGrid

我目前正在制作一个自定义canvas,并且我必须添加一个表,所以我认为dataGrid会很好。 所以我想从“Datagrid”创建一个“ 表” ,用户可以在运行时将一个表添加到canvas。

直到现在,我已经尝试使用列表填充DataGrid并成功。

如何在运行时将列添加到Datagrid,以便在运行时使用文本框从用户获取列数和标题值,并基于文本框的值,数据网格应添加列和标题值。

实际上我想开发一个表,其中用户传递no的列和列标题,并且应该生成表。

要么

“你能否建议我使用DrawingVisual类”绘制“表格”

它是GraphicsTable类的一部分

//Custom Classes "DrawingCanvas & GraphicsTable" public void CreateDataGrid(GraphicsTable graphicsTable, DrawingCanvas drawingCanvas) { dt = new DataGrid(); dt.Name = "Data"; dt.ItemsSource = person(); dt.AllowDrop = true; dt.AutoGenerateColumns = true; dt.Height = graphicsTable.Rectangle.Height; dt.Width = graphicsTable.Rectangle.Width; drawingCanvas.Children.Add(dt); Canvas.SetTop(dt, graphicsTable.Rectangle.Top); Canvas.SetLeft(dt, graphicsTable.Rectangle.Left); dt.Width = dt.Width; dt.Height = dt.Height; dt.Focus(); } //I have just tried to add dome dummy data to the datagrid. public List person() { List peep = new List(); peep.Add(new Person() {}); return peep; } public class Person { private string name; private double salary; public string Names { get { return name; } set { name = value; } } public double Salary { get { return salary; } set { salary = value; } } } 

您可以按如下方式动态构建DataGrid的列。

 public void buildTable(string[] headers) { myGrid.Columns.Clear(); foreach (string header in headers) { DataGridTextColumn c = new DataGridTextColumn(); c.Header = header; myGrid.Columns.Add(c); } } 

但是,如果要设置ItemsSource,则行数和列数将自动调整以匹配ItemsSource的值。 例如,以下代码生成一个包含3行和3列的DataGrid。

 dt = new DataTable(); for (int i = 0; i < 3; i++) dt.Columns.Add("col" + i.ToString()); for (int i = 0; i < 3; i++) { DataRow r = items.NewRow(); r[0] = "a" + i.ToString(); r[1] = "b" + i.ToString(); r[2] = "c" + i.ToString(); dt.Rows.Add(r); } myGrid.ItemsSource = dt; 
 + ------ + ------ + ------ +  
 |  col0 |  col1 |  col2 |  
 + ------ + ------ + ------ +  
 |  a0 |  b0 |  c0 |  
 + ------ + ------ + ------ +  
 |  a1 |  b1 |  c1 |  
 + ------ + ------ + ------ +  
 |  a2 |  b2 |  c2 |   
 + ------ + ------ + ------ + 

在不知道您的确切要求的情况下,我不会费心手动在代码中绘制表格,除非您有一些特殊需要的自定义图形,甚至在这种情况下我会考虑使用XAML来重新设置DataGrid或它的元素,然后再尝试自己渲染它。 这只是我的看法。 祝你好运!

编辑:

如果要根据用户输入生成表列,则只需将列生成代码放在事件处理程序中。 在您的示例中,您可以为Textbox TextChanged事件添加事件处理程序,如下所示。 每次文本框中的文本更改时,此事件处理程序都将运行。 您可能希望添加validation以防止用户大量输入。

 private void numColsTextbox_TextChanged(object sender, TextChangedEventArgs e) { int numCols; if (Int32.TryParse(tb.Text, out numCols)) { myGrid.Columns.Clear(); for (int i = 1; i <= numCols; i++) { DataGridTextColumn c = new DataGridTextColumn(); c.Header = "Column " + i.ToString(); myGrid.Columns.Add(c); } } }