2013-03-27 175 views
4

我目前正在處理自定義畫布,並且我必須添加一個表格,所以我認爲dataGrid會很好。所以我想創建一個「表」「Datagrid」用戶可以在運行時添加一個表到畫布。動態添加列到WPF中的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; } 
    } 
} 
+0

如果您可以動態添加列,您是否使用DrawingVisual來繪製網格或者是否願意繼續使用DataGrid? – Dutts 2013-03-27 09:26:29

+0

@Richard感謝您的回覆。 DrawingVisual會很棒!!!但如果它不可能與DrawingVisual一起使用,那麼我必須用datagrid解決。 – Abhinav 2013-03-27 09:32:46

回答

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

感謝您的建議,我認爲我無法解釋我的要求,我很抱歉! 你解釋我的工作是完美的,但那不是我想要的。我如何根據用戶輸入繪製表格,例如: 如果用戶需要3列,他會在文本框(他提供輸入的東西)中輸入3,並且應該生成包含3列的表格。 我很感謝你的幫助!!!!!!再次感謝!! – Abhinav 2013-03-28 07:33:50

+0

我已經更新了我的答案,以包含有關如何基於用戶輸入生成列的信息。 – 2013-03-28 13:34:24