簡體   English   中英

在wpf中動態地將列添加到DataGrid

[英]Dynamically add Columns to DataGrid in wpf

我目前正在制作一個自定義畫布,並且我必須添加一個表,所以我認為dataGrid會很好。 所以我想從“Datagrid”創建一個“ 表” ,用戶可以在運行時將一個表添加到畫布。

直到現在,我已經嘗試使用列表填充DataGrid並成功。

如何在運行時將列添加到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> 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; }
    }
}

您可以按如下方式動態構建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事件添加事件處理程序,如下所示。 每次文本框中的文本更改時,此事件處理程序都將運行。 您可能希望添加驗證以防止用戶輸入大量數據。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM