Введение в ADO.NET. Источник данных - XML-файл. Отображение данных связанной таблицы, страница 4

  studs.Columns.Add("Name");          // Определяем схему таблицы

  studs.Columns.Add("Phone");

  studs.Columns.Add("Addr");

  DataTable exams = new DataTable("Exams");   // Вторая таблица

  SetPrimaryColumn(exams);

  exams.Columns.Add("Credit", typeof(bool));

  exams.Columns.Add("Date", typeof(DateTime));

  exams.Columns.Add("Mark", typeof(byte));

  ds.Tables.Add(studs);    // Вставляем таблицы в коллекцию таблиц DataSet

  ds.Tables.Add(exams);

  InitTables();        // Заполнение таблиц DataTable (создайте заглушку)

  //==== Привязка DataGridView к данным таблицы DataSet. Работает DataBinding

  studsGrid.DataSource = ds;

  studsGrid.DataMember = ds.Tables[0].TableName;

}

Поля первичных ключей обеих таблиц удобно добавить с помощью вспомогательного метода.

void SetPrimaryColumn(DataTable table)

{

  DataColumn dc = new DataColumn("ID", typeof(int));

  dc.AutoIncrement = true;

  dc.AutoIncrementSeed = 1;

  dc.ReadOnly = true;

  table.Columns.Add(dc);

  table.PrimaryKey = new DataColumn[] { dc };

}

Если заполнить таблицу студентов (объект DataTable), а для этого следует написать код метода InitTables, то компонент DataGridView способен отбразить данные этой таблицы на форме. Напомним, что DataSet и, вложенная в него, DataTable хранятся в памяти, а DataGridView отображает эти данные на экране. Важным шагом является привязка компонента studsGrid к данным одной из таблиц набора DataSet. Механизм привязки к данным (DataBinding) задействован двумя операторами C#:

  studsGrid.DataSource = ds;

  studsGrid.DataMember = ds.Tables[0].TableName;

Такой способ привязки (коллекции к коллекции) называется Complex DataBinding, в отличие от Simple DataBinding, когда одно значение (свойство) привязывается к одному значению (свойству).

Добавьте еще один вспомогательный метод, который сэкономит ваше время на заполнение таблиц данными.

void InitTables()

{

  object[] studs = {

    new object[] {1, "Charlie Parker", "123-4455", "Broadway, 52a"},

    new object[] {2, "Alex Black", "555-1122", "5-th Avenue, 74" },

    new object[] {3, "Andy Williams", "430-5125", "Back st., 22" },

    new object[] {4, "Charley Mingus", "230-1466", "Hi st., 30" },

    new object[] {5, "Chet Baker", "320-8656", "Howard st., 15" },

    new object[] {6, "Lou Rowles", "552-4233", "Basin st., 10" },

  };

  foreach (object[] o in studs)

    ds.Tables[0].Rows.Add(o);

}

¨  Запустите приложение и проверьте его работу в режиме ввода и редактирования данных.

¨  Добавьте метод, который изменяет облик DataGridView путем установки стилей отдельных колонок а также общих компонентов стиля, действующих на все ячейки.

void AddStyleStud(DataGridView grid)

{

  //=== Цикл прохода по колонкам таблицы (в памяти)

  foreach (DataColumn dc in ds.Tables[0].Columns)

  {

    //=== Создание колонки DataGridView (на экране)

    DataGridViewTextBoxColumn tb = new DataGridViewTextBoxColumn();

    tb.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;

    tb.DataPropertyName = dc.ColumnName;

    tb.HeaderText = dc.ColumnName;

    grid.Columns.Add(tb);

  }

  grid.DefaultCellStyle.SelectionBackColor = Color.LightSteelBlue;

  grid.DefaultCellStyle.SelectionForeColor = Color.Black;

  grid.AlternatingRowsDefaultCellStyle.BackColor = Color.Wheat;

}

¨  Вызовите метод AddStyleStud (studsGrid) после инициализации таблицы (InitTables).

¨  Проверьте результат (см. рис. ниже)

В методе AddStyleStud мы управляем набором колонок таблицы, которые отображает DataGridView, и компонентами его стиля. Здесь опять работает механизм DataBinding (привязка одного свойства к другому), он включается оператором tb.DataPropertyName = dc.ColumnName;. Параметр grid сейчас кажется лишним (ясно, что это — studsGrid), но он пригодится, когда придется форматировать совсем другой DataGridView, отображающий отфильтрованные данные таблицы студентов.