4

私は現在、カスタムキャンバスに取り組んでおり、その中でテーブルを追加する必要があるため、dataGrid は問題ないと思いました。SO i は、ユーザーが実行時にテーブルをキャンバスに追加できる「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 | 列1 | col2 |  
+------+------+------+  
| | a0 | b0 | c0 |  
+------+------+------+  
| | a1 | b1 | c1 |  
+------+------+------+  
| | a2 | b2 | c2 |   
+------+------+------+

あなたの正確な要件を知らなくても、特別なカスタムグラフィックスが必要でない限り、コードでテーブルを手動で描画することは気にしません. それは私の意見です。頑張ってください!

編集:

ユーザー入力に基づいてテーブル列を生成する場合は、列生成コードをイベント ハンドラーに配置するだけで済みます。あなたの例では、次のように 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);
        }
    }
}
于 2013-03-27T15:51:11.523 に答える