Как добавить пользовательские столбцы в WinForms DataGrid (ВНИМАНИЕ: не DataGridView) - PullRequest
0 голосов
/ 29 октября 2019

У меня есть программа, которая содержит DataSet с двумя DataTables и одним DataRelation. Таким образом, я могу показать все записи из «родительского» DataTable, и пользователь может развернуть одну из этих записей, чтобы увидеть все ее «потомки».

Код для создания DataTables, DataRelation и отображения DataGrid выглядит следующим образом:

DataSet dataSet;        

public Form1()
{
    InitializeComponent();

    dataSet = new DataSet();

    CreateParentsTable();

    CreateSonsTable();

    dataGrid1.DataSource = dataSet.Tables["parentsTable"];
} //Form1

//Function to generate parents table and fill it with random records
private void CreateParentsTable()
{
    dataSet.Tables.Add(new DataTable() { TableName = "parentsTable" });

    dataSet.Tables["parentsTable"].Columns.Add(new DataColumn() { ColumnName = "ID" });
    dataSet.Tables["parentsTable"].Columns.Add(new DataColumn() { ColumnName = "Name" });
    dataSet.Tables["parentsTable"].Columns.Add(new DataColumn() { ColumnName = "Sex" });

    //Generation of 101 random records
    for (int i = 100; i <= 200; i++)
    {
        int randomSeed = DateTime.Now.Millisecond * i;

        Random r = new Random(randomSeed);

        DataRow row = dataSet.Tables["parentsTable"].NewRow();

        row.SetField<int>("ID", i);
        row.SetField<string>("Name", GenerateRandomString(randomSeed, 4));
        row.SetField<string>("Sex", r.Next(0, 2) == 0 ? "Men" : "Women");

        dataSet.Tables["parentsTable"].Rows.Add(row);
    } //for
} //CreateFathersTable

//Function to generate sons table and fill it with random records
//This function will also generate relation between fathers and sons tables
private void CreateSonsTable()
{
    dataSet.Tables.Add(new DataTable() { TableName = "sonsTable" });

    dataSet.Tables["sonsTable"].Columns.Add(new DataColumn() { ColumnName = "ID" });
    dataSet.Tables["sonsTable"].Columns.Add(new DataColumn() { ColumnName = "Name" });
    dataSet.Tables["sonsTable"].Columns.Add(new DataColumn() { ColumnName = "Sex" });
    dataSet.Tables["sonsTable"].Columns.Add(new DataColumn() { ColumnName = "ParentID" });

    dataSet.Relations.Add("Display sons",
        dataSet.Tables["parentsTable"].Columns["ID"],
        dataSet.Tables["sonsTable"].Columns["ParentID"]);

    dataSet.Tables["sonsTable"].Columns.Add("Parent", typeof(string), "Parent.Name");

    //Generation of 301 random records
    for (int i = 1000; i <= 1300; i++)
    {
        int randomSeed = DateTime.Now.Millisecond * i;

        Random r = new Random(randomSeed);

        DataRow fila = dataSet.Tables["sonsTable"].NewRow();

        fila.SetField<int>("ID", i);
        fila.SetField<string>("Name", GenerateRandomString(randomSeed, 8));
        fila.SetField<string>("Sex", r.Next(0, 2) == 0 ? "Boy" : "Girl");
        fila.SetField<int>("ParentID", r.Next(100, 201));

        dataSet.Tables["sonsTable"].Rows.Add(fila);
    } //for
} //CreateSonsTable

//Function to generate a random string of a specified size
private static string GenerateRandomString(int seed, int size)
{
    char[] characters = new char[size];

    Random r = new Random(seed);

    for (int i = 0; i < size; i++)
    {
        characters[i] = Convert.ToChar(r.Next('A', 'Z' + 1));
    } //for

    string randomString = new string(characters);

    return randomString;
} //GenerateRandomString

Очень важная вещь, которую нужно иметь в виду: Я ИСПОЛЬЗУЮ DATAGRID, а не DATAGRIDVIEW.

Теперь это позволяет DataGrid отображать все столбцы в DataTable. Но, возможно, я хотел бы показать только некоторые столбцы (например, нет смысла показывать столбец "папа" в дочерней таблице). Я также хотел бы определить некоторые столбцы как другой элемент управления, а не TextBox (CheckBoxColumn для логических значений, ComboBoxColumn для внешних ключей ...).

Это все возможно с помощью DataGrid?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...