Как я могу редактировать родительские столбцы, добавленные через DataRelation в DataGridView? - PullRequest
0 голосов
/ 11 января 2019

У меня есть две таблицы в наборе данных, которые я отношу как родитель-потомок. Я хотел бы отображать и редактировать их в том же DataGridView. Поэтому я добавил интересующий родительский столбец в дочернюю таблицу.

Визуализация в порядке. В DataGridView я вижу все дочерние строки, и те из родительской таблицы перечислены несколько раз (что и задумано - другая тема). Но когда дело доходит до редактирования (двойной щелчок по ячейке или нажатие «F2»), это невозможно, т. Е. Я могу редактировать только столбцы из исходной дочерней таблицы. Пытаясь заставить колонку ReadOnly = false; приведет к ошибке.

Причиной выбора этой формы отображения является компактное получение данных для моего приложения. Будет добавлена ​​дополнительная логика для добавления и удаления строк из таблицы данных, что выходит за рамки этой проблемы.

Прикреплена небольшая демонстрационная программа:

class DataGridViewDemo : Form
{
    private DataGridView dataGridView1 = new DataGridView();

    [STAThreadAttribute()]
    public static void Main()
    {
        Application.Run(new DataGridViewDemo());
    }


    public DataGridViewDemo()
    {
        this.dataGridView1.Dock = DockStyle.Fill;
        this.dataGridView1.AllowUserToAddRows = false;

        this.Controls.Add(this.dataGridView1);
        this.Load += new EventHandler(DataTableProblem);
        this.Text = "DataGridView row demo";
    }


    public void DataTableProblem(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();

        DataTable parentTable = new DataTable("Parent");
        DataTable childTable = new DataTable("Child");

        ds.Tables.Add(parentTable);
        ds.Tables.Add(childTable);

        DataColumn column;
        DataRow row;

        column = new DataColumn("ID", System.Type.GetType("System.Int32"));
        ds.Tables["Parent"].Columns.Add(column);
        column = new DataColumn("ParentName", System.Type.GetType("System.String"));
        ds.Tables["Parent"].Columns.Add(column);

        row = ds.Tables["Parent"].NewRow();
        row["ID"] = 1;
        row["ParentName"] = "Test";
        ds.Tables["Parent"].Rows.Add(row);

        column = new DataColumn("ID", System.Type.GetType("System.Int32"));
        ds.Tables["Child"].Columns.Add(column);
        column = new DataColumn("parentID", System.Type.GetType("System.Int32"));
        ds.Tables["Child"].Columns.Add(column);
        column = new DataColumn("ChildName", System.Type.GetType("System.String"));
        ds.Tables["Child"].Columns.Add(column);

        row = ds.Tables["Child"].NewRow();
        row["ID"] = 1;
        row["parentID"] = 1;
        row["ChildName"] = "My Name";
        ds.Tables["Child"].Rows.Add(row);

        row = ds.Tables["Child"].NewRow();
        row["ID"] = 2;
        row["parentID"] = 1;
        row["ChildName"] = "My other Name";
        ds.Tables["Child"].Rows.Add(row);

        DataRelation relation = new DataRelation(
            "p2c",
            ds.Tables["Parent"].Columns["ID"],
            ds.Tables["Child"].Columns["parentID"]);

        ds.Relations.Add(relation);

        ds.Tables["Child"].Columns.Add(
            "ParentName",
            ds.Tables["Parent"].Columns["ParentName"].DataType,
            "Parent(p2c).ParentName");

        dataGridView1.DataSource = ds.Tables["Child"];
        //dataGridView1.Columns["ParentName"].ReadOnly = false; // --> removing comment will result in an error
        dataGridView1.Refresh();
    }
}

Кто-нибудь может подсказать мне в правильном направлении, как сделать все столбцы редактируемыми?

Большое спасибо

...