У меня есть программа, которая содержит 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?