У меня есть две таблицы в наборе данных, которые я отношу как родитель-потомок. Я хотел бы отображать и редактировать их в том же 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();
}
}
Кто-нибудь может подсказать мне в правильном направлении, как сделать все столбцы редактируемыми?
Большое спасибо