4

我目前正在使用自定义画布,并且我必须添加一个表格,所以我认为 dataGrid 会很好。所以我想从“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; }
    }
}
4

1 回答 1

5

您可以按如下方式动态构建 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 | 0 | c0 |  
+-----+------+------+  
| a1 | b1 | c1 |  
+-----+------+------+  
| a2 | b2 | c2 |   
+-----+------+------+

在不知道您的确切要求的情况下,除非您有一些特殊需要的自定义图形,否则我不会在代码中手动绘制表格,即使在这种情况下,我也会考虑使用 XAML 重新设置 DataGrid 或其元素的样式,然后再尝试自己呈现它。这只是我的意见。祝你好运!

编辑:

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

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);
        }
    }
}
于 2013-03-27T15:51:11.523 回答