Просмотрите список команд контекстного меню, а также список свойств этого дизайнера. В Visual Studio 2008 он приобрел новое, важное свойство Hierarchical Update. Найдите его в окне свойств и убедитесь, что оно установлено в True. Если установить его в False, то класс TableAdapterManager будет удален из множества сгенерированных классов. Класс TableAdapterManager нам очень нужен, так как именно он управляет процессом обновления таблиц с иерархической структурой.
Просмотрите код метода UpdateAll класса TableAdapterManager. До него можно быстро добраться с помощью диаграммы классов. Убедитесь, что обновление табличных данных производятся в порядке, учитывающем связь между таблицами студентов и экзаменов. Она имеет вид 1-оо (один ко многим), а алгоритм обновления напоминает тот, что был использован нами ранее.
· Поставьте фокус на линию связи между таблицами и нажмите правую кнопку мыши (или совершите двойной щелчок). Это действие открывает диалог Relation. Убедитесь. что по умолчанию флаг Choose what to create установлен в положение Relation only. Такая установка не соответствует структуре таблиц и нашему желанию вносить изменения в БД. Установите флажок и другие элементы управления так, как показано на рисунке ниже.
· Удалите из класса MainForm объявления переменных и большую часть методов, оставьте лишь минимум кода, как показано ниже.
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
void MainForm_Load(object sender, EventArgs e)
{
try
{
ConnectAndRead();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Text);
Application.Exit();
return;
}
}
void ConnectAndRead(){ }
void SerializeBinary()
{
Stream stream = new FileStream(@"..\..\Data\Students.stud", FileMode.Create);
IFormatter fmt = new BinaryFormatter();
// fmt.Serialize(stream, ds);
stream.Close();
}
void SerializeSoap()
{
Stream stream = new FileStream(@"..\..\Data\Students.soap", FileMode.Create);
IFormatter fmt = new SoapFormatter();
// fmt.Serialize(stream, ds);
stream.Close();
}
void bn_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
switch (e.ClickedItem.Text)
{
case "&Save": UpdateDB(); break;
case "Cancel Changes": CancelChanges(); break;
// case "Save XML": ds.WriteXml(@"..\..\Data\Students.xml", XmlWriteMode.WriteSchema); break;
case "Serialize Binary": SerializeBinary(); break;
case "Serialize SOAP": SerializeSoap(); break;
}
}
void CancelChanges() { }
void UpdateDB()
{
try{}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
· Перейдите в режим дизайна формы (Shift+F7) и принесите на нее компонент DataSet. При этом запустится диалог Add DataSet.
· В окне диалога оставьте выбранный по умолчанию флаг Typed dataset, а из выпадающего списка Name выберите строку Referenced Datasets. Текст строки списка изменится и укажет на типизированный DataSet.
· Нажмите кнопку OK и в окне свойств, в строке Name, присвойте объекту StudentsDataSet имя ds.
Так как настоящий проект является копией одного из предыдущих, то на форме уже присутствуют два компонента DataGridView: gridStud и gridExam. В данный момент они не привязаны ни к каким источникам данных, так как мы удалили весь код метода ConnectAndRead. Покажем, как осуществить привязку к данным таблиц типизированного DataSet в режиме дизайна.
· Откройте диалог DataGridView Tasks, нажав кнопку в правом верхнем углу компонента gridStud (небольшой маркер, называемый умной кнопкой — Smart Button).
· Откройте выпадающий список Choose Data Source и отыщите в дереве Other Data Sources таблицу Studs. Выбор этой таблицы в качестве источника данных создает новый синхронизатор studsBindingSource. На рисунке ниже показано дерево выбора источника данных при повторном открытии диалога, поэтому вы видите, что объект studsBindingSource уже существует.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.