Динамически добавлять столбцы в DataGrid в wpf

В настоящее время я работаю над пользовательским холстом, и мне нужно добавить таблицу, поэтому я подумал, что 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, то я должен успокоиться с сеткой данных.   -  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 или его элементов, прежде чем пытаться сделать это сам. Это только мое мнение. Удачи!

ИЗМЕНИТЬ:

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