Динамично добавяне на колони към DataGrid в wpf

В момента работя върху персонализирано платно и трябва да добавя таблица, така че реших, че dataGrid ще бъде добре. И така, искам да създам "Таблица" от "Datagrid", чрез която потребителят може да добави таблица към платното по време на изпълнение.

Досега се опитвах да попълня DataGrid със списък и успях.

Как мога да добавя колони към Datagrid по време на изпълнение, така че броят на колоните и стойността на заглавката да бъдат взети от потребителя по време на изпълнение с помощта на текстово поле и въз основа на стойността на текстовото поле datagrid трябва да добави колони и стойност на заглавка.

Всъщност искам да разработя таблица, в която потребителят предава броя на колоните и заглавката на колоната и таблицата трябва да се генерира.

Or

„Можете ли да ми предложите начин къде да гледам, за да „начертая“ таблица с помощта на клас 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; }
    }
}

person Abhinav    schedule 27.03.2013    source източник
comment
Спряхте ли да използвате DrawingVisual, за да начертаете мрежата си или бихте се радвали да продължите да използвате DataGrid, ако можете динамично да добавяте колони?   -  person Dutts    schedule 27.03.2013
comment
@Richard Благодаря за отговора. DrawingVisual би било страхотно!!! но ако не е възможно с DrawingVisual, тогава трябва да се установя с datagrid.   -  person Abhinav    schedule 27.03.2013


Отговори (1)


Можете динамично да изграждате колоните на 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. Например, следният код създава DataGrid с 3 реда и 3 колони.

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 или неговите елементи, преди да се опитам да го изобразя сам. Това е само мое мнение все пак. Късмет!

РЕДАКТИРАНЕ:

Ако искате да генерирате колоните на таблицата въз основа на въвеждане от потребителя, трябва просто да поставите кода за генериране на колони в манипулатор на събития. Във вашия пример можете да добавите манипулатор на събитие за събитието 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);
        }
    }
}
person Timothy Schoonover    schedule 27.03.2013
comment
Благодаря за предложението, и мисля, че не мога да обясня изискването си, съжалявам за това!! Това, което ми обяснихте, работи перфектно, но не е това, което искам. Как мога да начертая таблица въз основа на въвеждане от потребителя за Например: Ако потребителят се нуждае от 3 колони, тогава той ще въведе 3 в текстовото поле (нещо, от което той предоставя вход) и трябва да се генерира таблица, съдържаща 3 колони. Оценявам вашата помощ!!!!!! благодаря още веднъж!! - person Abhinav; 28.03.2013
comment
Актуализирах отговора си, за да включва информация за това как да генерирам колоните въз основа на въвеждане от потребителя. - person Timothy Schoonover; 28.03.2013