在WPF中动态添加列到数据网格

5
我目前正在开发一个自定义画布,在其中我需要添加一个表格,所以我认为DataGrid会很好用。因此,我想通过从DataGrid中创建"Table"的方式,让用户可以在运行时向画布添加表格。
到目前为止,我已经尝试使用列表填充DataGrid,并且成功了。
如何在运行时向Datagrid添加列,这样列的数量和标题值将从用户在文本框中输入的内容中获取,并且根据文本框的值,Datagrid应该添加列和标题值。
实际上,我想要开发一个表格,其中用户传递列数和列头,然后表格就被生成了。
或者
"您能否建议我寻找一种方法来使用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> person()
{
    List<Person> peep = new List<Person>();
    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; }
    }
}

你是否一直在使用DrawingVisual来绘制网格,或者如果你可以动态添加列,你会愿意继续使用DataGrid吗? - Dutts
@Richard 謝謝您的回應。如果可以使用 DrawingVisual,那就太好了!但是如果無法使用 DrawingVisual,我只能使用 datagrid 了。 - Abhinav
1个回答

6
您可以按照以下方式动态构建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事件的事件处理程序,如下所示。此事件处理程序将在每次文本更改时运行Textbox。您可能需要添加验证以防止用户键入大量数字。

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);
        }
    }
}

谢谢您的建议,我觉得我无法解释我的需求,对此我很抱歉! 您向我解释的内容完全有效,但那不是我想要的。我如何根据用户输入绘制表格,例如: 如果用户需要3列,则他将在文本框中输入3,然后应生成一个包含3列的表格。 非常感谢您的帮助!!!!再次感谢!! - Abhinav
我已经更新了我的答案,包括如何根据用户输入生成列的信息。 - Timothy Schoonover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接