Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Благодарности 18 страница






Шрифт указывается в виде ссылки на вновь созданный объект класса System.Drawing.Font. В качестве первого параметра конструктору этого класса передается название шрифта, в качестве второго — размер шрифта в единицах, передаваемый посредством четвертого параметра. В нашем случае размер шрифта указывается в пунктах.

Третий параметр задает стиль шрифта, а пятый — номер кодовой страницы Unicode. Значение 204 соответствует кириллической кодовой странице.

Заголовок таблицы задается при помощи свойства CaptionText:

this.dataGrid1.CaptionText = " Контакты";

Значения других свойств определяются следующим образом:

this.dataGrid1.HeaderForeColor =
System.Drawing.SystemColors.ControlText;
this.dataGrid1.Location = new System.Drawing.Point(32, 96);
this.dataGrid1.Name = " dataGrid1";
this.dataGrid1.Size = new System.Drawing.Size(288, 208);
this.dataGrid1.TabIndex = 0;

Добавление таблицы стилей

Таблица стилей создается для нашего элемента управления DataGrid как объект класса System.Windows.Forms.DataGridTableStyle:

this.dataGridTableStyle1 =
new System.Windows.Forms.DataGridTableStyle();

В процессе инициализации приложения эта таблица стилей подключается к элементу управления DataGrid при помощи метода AddRange:

this.dataGrid1.TableStyles.AddRange(
new System.Windows.Forms.DataGridTableStyle[]
{
this.dataGridTableStyle1
}
);

Заметим, что к одному элементу управления DataGrid можно подключить сразу несколько таблиц стилей, по одному на каждую таблицу, хранящуюся в DataGrid.

Для каждого столбца мы создаем свой стиль, который затем подключается к таблице стилей dataGridTableStyle1 методом AddRange:

this.dataGridTextBoxColumn1 =
new System.Windows.Forms.DataGridTextBoxColumn();

this.dataGridTextBoxColumn2 =
new System.Windows.Forms.DataGridTextBoxColumn();

this.dataGridTextBoxColumn3 =
new System.Windows.Forms.DataGridTextBoxColumn();

this.dataGridTableStyle1.GridColumnStyles.AddRange
(
new System.Windows.Forms.DataGridColumnStyle[]
{
this.dataGridTextBoxColumn1,
this.dataGridTextBoxColumn2,
this.dataGridTextBoxColumn3
}
);

Кроме того, необходимо подключить таблицу стилей к элементу управления DataGrid, записав соответствующую ссылку в поле DataGrid таблицы стилей:

this.dataGridTableStyle1.DataGrid = this.dataGrid1;

Стили оформления каждого столбца также задаются в процессе инициализации приложения. Ниже мы привели соответствующий фрагмент кода:

//
// dataGridTextBoxColumn2
//
this.dataGridTextBoxColumn2.Format = " ";
this.dataGridTextBoxColumn2.FormatInfo = null;
this.dataGridTextBoxColumn2.HeaderText = " Имя";
this.dataGridTextBoxColumn2.MappingName = " Имя";
this.dataGridTextBoxColumn2.NullText = " (имя)";
this.dataGridTextBoxColumn2.Width = 75;
//
// dataGridTextBoxColumn3
//
this.dataGridTextBoxColumn3.Format = " ";
this.dataGridTextBoxColumn3.FormatInfo = null;
this.dataGridTextBoxColumn3.HeaderText = " Фамилия";
this.dataGridTextBoxColumn3.MappingName = " Фамилия";
this.dataGridTextBoxColumn3.NullText = " (фамилия)";
this.dataGridTextBoxColumn3.Width = 75;
//
// dataGridTextBoxColumn1
//
this.dataGridTextBoxColumn1.Format = " ";
this.dataGridTextBoxColumn1.FormatInfo = null;
this.dataGridTextBoxColumn1.HeaderText = " Идентификатор";
this.dataGridTextBoxColumn1.MappingName = " id";
this.dataGridTextBoxColumn1.ReadOnly = true;
this.dataGridTextBoxColumn1.Width = 75;

Как видите, программная реализация нашего несложного приложения, позволяющего отображать и редактировать одну реляционную таблицу, получается довольно громоздкой.

К счастью, дизайнер форм выполняет за нас всю черновую работу по созданию и сопровождению программного кода, отвечающего за инициализацию и настройку свойств элементов управления DataGrid и DataSet. В этом и заключается одно из преимуществ использования такого инструментального средства, как Microsoft Visual Studio.NET.

Работа с DataSet при помощи методов и свойств

Как мы уже говорили, элемент управления DataGrid позволяет вводить новые данные в таблицы набора DataSet. Однако операции добавления и извлечения данных из набора DataSet можно выполнять и с помощью специально предназначенных для этого методов и свойств.

Добавление новой строки

Для того чтобы добавить новую строку в таблицу набора данных DataSet, Вы вначале должны создать эту строку как объект класса DataRow, а затем добавить ее в набор строк таблицы при помощи метода DataTable.Rows.Add.

Ниже мы показали фрагмент кода, добавленного в конструктор класса Form1, и предназначенного для вставки в таблицу Contacts двух новых строк:

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//

DataRow row = contactsDataTable.NewRow();
row[" Имя" ] = " Иван";
row[" Фамилия" ] = " Петров";
contactsDataTable.Rows.Add(row);

DataRow row1 = contactsDataTable.NewRow();
row1[" Имя" ] = " Петр";
row1[" Фамилия" ] = " Сидоров";
contactsDataTable.Rows.Add(row1);
}

Здесь мы вначале создаем новую строку в таблице, пользуясь для этого методом NewRow.

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

В результате после инициализации приложения в таблице Contacts появятся две строки (рис. 8-28).

Рис. 8-28. Две строки были добавлены в момент инициализации приложения

Теперь давайте задействуем поля ввода Имя и Фамилия, а также кнопку Добавить, расположенные в верхней части окна нашего приложения (рис. 8-28).

Создайте следующий обработчик события Click для кнопки Добавить:

private void button1_Click(object sender, System.EventArgs e)
{
DataRow row = contactsDataTable.NewRow();
row[" Имя" ] = textBoxFName.Text;
row[" Фамилия" ] = textBoxLName.Text;
contactsDataTable.Rows.Add(row);
}

Здесь мы предполагаем, что идентификатор поля Имя хранится в textBoxFName, а поля Фамилия — в textBoxLName.

Удаление строки

Вы можете удалять выделенные строки таблицы при помощи клавиши Delete. Однако есть и другая возможность — использование метода DataTable.Rows.Delete.

Добавьте в главное окно нашего приложения кнопку Удалить (рис. 8-29). Эта кнопка будет удалять запись, выделенную в окне элемента управления DataGrid.

Рис. 8-29. Добавлена кнопка для удаления выделенной строки

Добавьте для этой кнопки следующий обработчик событий:

private void button2_Click(object sender, System.EventArgs e)
{
try
{
contactsDataTable.Rows[dataGrid1.CurrentCell.RowNumber].Delete();
contactsDataTable.AcceptChanges();
}
catch(Exception ex)
{
}
}

Здесь мы используем свойство DataGrid.CurrentCell.RowNumber для получения номера строки, выделенной пользователем в таблице. Кстати, если пользователь выделил столбец, то его номер можно получить при помощи свойства DataGrid.CurrentCell.ColumnNumber.

Что же касается метода AcceptChanges, то его применение требует некоторых пояснений.

Дело в том, что при удалении строки методом DataTable.Rows.Delete строка фактически не удаляется, а только отмечается для удаления. Ее еще можно восстановить методом DataTable.Rows.RejectChanges. И только после вызова метода AcceptChanges удаление становится окончательным.

Во время выполнения всех этих операций возможно возникновение исключения DeletedRowInaccessibleException. Это исключение возникает в том случае, если предпринимается попытка удаления строки, которая уже была удалена ранее. Поэтому в нашей программе мы предусмотрели обработчик исключения, игнорирующий попытки повторного удаления строк.

Приложение PhoneBookApp

До сих пор мы работали с набором данных DataSet при помощи элемента управления DataGrid. Однако есть ряд приложений, в которых использование элемента DataGrid для представления данных невозможно или нецелесообразно. Большинство приложений, например, вводят информацию в базу данных при помощи форм с полями различного типа, а не с помощью таблиц.

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

Окно приложения PhoneBookApp показано на рис. 8-30.

Рис. 8-30. Окно приложения PhoneBookApp

В верхней части этого окна расположены элементы управления, предназначенные для просмотра и редактирования списка имен и фамилий, а в нижней — для просмотра и редактирования номеров телефонов.

Создание проекта приложения

Создайте новое приложение с именем PhoneBookApp, пользуясь мастером проектов. Затем добавьте в его окно необходимые элементы управления.

Элементы управления для работы со списком имен и фамилий

В верхнюю часть окна нужно поместить два поля ввода текстовой информации с метками Имя и Фамилия. Первое из них должно иметь идентификатор fnTextBox, а второе — lnTextBox.

Для просмотра списка имен и фамилий, хранящихся в нашей базе данных, добавьте в окно приложения элемент управления ListView с идентификатором listView1. Отредактировав свойство Columns, добавьте в него три столбца, как это показано на рис. 8-31.

Рис. 8-31. Столбцы элемента управления listView1

Для первого столбца задайте в свойстве Text заголовок Имя, для второго — Фамилия, и, наконец, для третьего — id.

Назначение столбцов Имя и Фамилия очевидно — в них будут отображаться имена и фамилии людей, чьи телефонные номера хранятся в базе данных. Что же касается столбца id, то он предназначен для отображения уникальных идентификаторов строк в таблице Contacts, хранящей имена и фамилии.

Задайте идентификаторы столбцов Имя и Фамилия равными, соответственно, fnColumnHeader и lnColumnHeader.

Кроме этого, переключите элемент управления ListView в режим отображения детализированной таблицы. Для этого задайте свойству View значение Details.

Операции добавления, изменения и редактирования имен и фамилий мы будем выполнять при помощи кнопок Добавить, Изменить и Удалить. Перетащите значки этих кнопок из инструментальной панели Microsoft Visual Studio.NET и расположите их справа от списка просмотра имен и фамилий.

Элементы управления для работы со списком телефонов

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

Это поле редактирования текстовой информации с меткой Телефон, поле класса Label для просмотра имени и фамилии человека, телефоны которого в настоящий момент просматриваются или редактируются, список для просмотра телефонов, а также кнопки Добавить, Изменить и Удалить. С помощью кнопок пользователь сможет отредактировать список телефонов.

Поле редактирования номера телефона Телефон должно иметь идентификатор phoneTextBox. Задайте этот идентификатор, отредактировав соответствующим образом свойство Name.

Что касается поля Label для просмотра имени и фамилии человека, список телефонов которого просматривается или редактируется, то оно должно иметь идентификатор currentContactLabel. Настройте для него свойство BorderStyle, выбрав значение Fixed3D, а также свойство TextAlign, задав выравнивание MiddleLeft. Вы можете также изменить шрифт, которым будет отображаться имя и фамилия, при помощи свойства Font.

Далее Вам необходимо добавить в окно приложения еще один элемент управления ListView, предназначенный для отображения списка телефонов. Этот элемент управления должен иметь идентификатор listView2.

Переключите список listView2 в режим отображения детализированной таблицы, назначив свойству View значение Details, а также добавьте три столбца с названиями Телефон, id и idContacts (рис. 8-32).

Рис. 8-32. Столбцы элемента управления listView2

Столбец Телефон предназначен для отображения номеров телефона человека, имя которого выделено в верхнем списке. Что же касается столбцов id и idContacts, то первый из них предназначен для отображения уникальных идентификаторов записей в таблице Phones, хранящей номера телефонов, а второй — для хранения внешних ключей таблицы Contacts. Обе эти таблицы мы рассмотрим ниже в этой главе.

Создание таблиц базы данных

База данных нашего телефонного справочника будет напоминать базу данных, которую мы рассматривали ранее при описании приложения DataSetApp. Она тоже будет состоять из двух таблиц Contacts и Phones, однако теперь эти таблицы будут связаны между собой.

Для того чтобы создать базу данных, перетащите из инструментальной панели Toolbox системы Microsoft Visual Studio.NET в окно дизайнера форм значок элемента управления DataSet. Соответствующий компонент будет иметь идентификатор dataSet1.

Далее Вам нужно будет добавить в базу данных две таблицы, отредактировав для этого свойство Tables.

Таблица Contacts

Таблица Contacts, как мы уже говорили, предназначена для хранения имен и фамилий людей, чьи телефоны мы собираемся записывать в нашу базу данных. Эта таблица должна иметь идентификатор contactsDataTable (рис. 8-33).

Рис. 8-33. Свойства таблицы Contacts

Создайте в таблице Contacts три столбца id, Имя и Фамилия, как это показано на рис. 8‑ 34.

Рис. 8-34. Столбцы таблицы Contacts

Столбец id предназначен для хранения уникальных числовых идентификаторов строк таблицы. О настройке его свойств мы рассказывали при изучении приложения DataSetApp. Столбцы Имя и Фамилия предназначены для хранения текстовых строк и не имеют никаких особенностей.

Создав таблицу Contacts, отметьте столбец id как ключевой столбец, отредактировав соответствующим образом свойство таблицы PrimaryKey.

Таблица Phones

В таблице Phones мы будем хранить номера телефонов. Эта таблица должна иметь идентификатор phonesDataTable.

Создав таблицу, добавьте к ней три столбца id, idContacts и Телефон (рис. 8-35).

Рис. 8-35. Столбцы таблицы Phones

Столбец id должен играть роль первичного ключа (такого же, как и в таблице Contacts). Настройка свойств этого столбца показана на рис. 8-35.

Столбец Телефон хранит телефонные номера в виде обычных текстовых строк и не имеет никаких особенностей.

Что же касается столбца idContacts, то он хранит так называемые внешние ключи (foreign keys) таблицы Contacts. Таким образом, каждая строка таблицы Phones с номером телефона содержит идентификатор строки таблицы Contacts с именем и фамилией владельца этого телефона.

Очевидно, что если у человека имеется несколько телефонных номеров, то в таблице Phones для него будет создано несколько строк с одинаковыми значениями в ячейках столбца idContacts.

На рис. 8-36 мы показали настройку свойств для столбца idContacts.

Рис. 8-36. Свойства столбца idContacts таблицы Phones

Как видно из этого рисунка, столбец должен хранить целые числа типа System.Int32. За это отвечает свойство DataType.

Мы не разрешаем хранение в столбце idContacts пустых значений, т.к. если в базе данных есть телефон, то он обязательно должен кому-нибудь принадлежать. Поэтому мы приравниваем значение свойства AllowDBNull константе false.

Связывание таблиц Contacts и Phones

Элемент управления DataSet имеет свойство Relations, специально предназначенное для создания отношений между таблицами, входящими в набор данных.

Отредактируйте свойство Relations. Когда редактор отношений запускается в первый раз для набора данных, в котором еще нет отношений, на экране появляется диалоговое окно Relation, показанное на рис. 8-37.

Рис. 8-37. Создание нового отношения

В поле Name Вы можете задать имя для создаваемого отношения. В приложении PhoneBookApp мы оставили имя отношения, оставленное по умолчанию.

При создании нового отношения Вам нужно выбрать родительскую таблицу в списке Parent table и дочернюю таблицу в списке Child table. В нашем случае роль родительской таблицы будет играть таблица Contacts, а в роли дочерней — таблица Phones.

В списке Columns нужно указать связываемые поля. Мы привязываем столбец id родительской таблицы Contacts (выбирая его в списке Key Columns) к полю idContacts дочерней таблицы Phones (выбирая его в списке Foreign Key Columns).

Список Update rule задает режим автоматического внесения изменений в дочернюю таблицу при изменении записей родительской таблицы.

Если в данном списке выбрано значение Cascade, то при удалении или обновлении строк родительской таблицы происходит обновление соответствующих строк дочерней таблицы. Мы выбрали именно этот режим для приложения PhoneBookApp.

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

Если указать значение None, то изменения в родительской таблице не будут отражаться на дочерней таблице.

Список Delete rule задает режим удаления записей дочерней таблицы при удалении записи родительской таблицы.

И, наконец, список Accept/Reject rule определяет, как нужно изменять записи дочерней таблицы, когда новые записи родительской таблицы добавляются или отвергаются.

Когда хотя бы одно отношение создано, то попытка редактирования свойства Relations приводит к появлению на экране редактора набора отношений Relations Collection Editor, показанного на рис. 8-38.

Рис. 8-38. Просмотр и редактирование списка отношений

Кнопки Add и Remove позволяют, соответственно, добавить новые отношения или удалить существующие. Для того чтобы изменить параметры отношения, его нужно выделить в списке Members, а затем щелкнуть кнопку Edit.

Проектирование кода для управления базой данных

В этом разделе нашей книги мы добавим в наше приложение PhoneBookApp программный код, обеспечивающий всю необходимую функциональность.

Добавление нового контакта

Добавление нового контакта происходит тогда, когда пользователь щелкает кнопку Добавить, расположенную в верхней части главного окна приложения (рис. 8-30). Предварительно пользователь должен ввести имя и фамилию человека в полях Имя и Фамилия, соответственно.

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

private void button1_Click(object sender, System.EventArgs e)
{
if(fnTextBox.Text! = " " & & lnTextBox.Text! = " ")
{
DataRow row = contactsDataTable.NewRow();
row[" Имя" ] = fnTextBox.Text;
row[" Фамилия" ] = lnTextBox.Text;
contactsDataTable.Rows.Add(row);

listUpdate();
phonesUpdate();
}
}

Здесь мы вначале убеждаемся в том, что пользователь ввел как имя, так и фамилию. Для этого мы сравниваем содержимое свойства Text полей редактирования fnTextBox и lnTextBox с пустой строкой. Если какое-либо поле пустое, обработчик события завершает свою работу без выполнения других дополнительных действий.

В том случае, когда пользователь ввел все необходимые данные, обработчик события создает новую строку в таблице Contacts:

DataRow row = contactsDataTable.NewRow();

Для этого используется метод DataTable.NewRow.

На следующем этапе введенные строки имени и фамилии записываются в соответствующие столбцы строки:

row[" Имя" ] = fnTextBox.Text;
row[" Фамилия" ] = lnTextBox.Text;

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

contactsDataTable.Rows.Add(row);

Далее наш обработчик события последовательно вызывает два метода с именами listUpdate и phonesUpdate. Первый из них отображает текущее содержимое таблицы Contacts в окне верхнего списка, а второй — список телефонов человека, имя которого было выбрано в верхнем списке. Мы вернемся к детальному описанию этих функций немного позже.

Выбор записи в списке имен и фамилий

Для отслеживания контактов, выбираемых пользователем в верхнем списке, мы предусмотрели обработчик события listView1_SelectedIndexChanged:

private void listView1_SelectedIndexChanged(object sender,
System.EventArgs e)
{
try
{
int currentRowIndex = listView1.SelectedItems[0].Index;

DataRow row = contactsDataTable.Rows[currentRowIndex];

fnTextBox.Text = row[" Имя" ].ToString();
lnTextBox.Text = row[" Фамилия" ].ToString();
currentContactId = (int)row[" id" ];

currentContactLabel.Text = fnTextBox.Text + " " +
lnTextBox.Text;
}
catch(Exception ex)
{
}

phonesUpdate();
}

Когда пользователь выделяет новую строку в списке, этот обработчик вначале определяет индекс строки, которая стала выделенной в результате выполнения этой операции:

int currentRowIndex = listView1.SelectedItems[0].Index;

Далее он извлекает соответствующую строку из таблицы Contacts, а также получает значения столбцов извлеченной строки:

fnTextBox.Text = row[" Имя" ].ToString();
lnTextBox.Text = row[" Фамилия" ].ToString();
currentContactId = (int)row[" id" ];

Имя и фамилия при этом записывается в поля редактирования fnTextBox и lnTextBox для того чтобы пользователь смог просмотреть их и при необходимости отредактировать.

Что же касается идентификатора строки id, то он сохраняется в поле currentContactId класса Form1. Создайте это поле следующим образом:

private int currentContactId;

Дополнительно обработчик события listView1_SelectedIndexChanged записывает имя и фамилию текущего контакта в поле, расположенное непосредственно над списком телефонов (чтобы пользователю было ясно, чьи телефоны отображаются в этом списке):

currentContactLabel.Text = fnTextBox.Text + " "
+ lnTextBox.Text;

Перед тем как завершить свою работу, обработчик события вызывает метод phonesUpdate для обновления списков телефонов выделенного контакта.

Редактирование записей таблицы Contacts

Для того чтобы отредактировать имя или фамилию человека, нужно выделить его имя в верхнем списке, содержащем записи таблицы Contacts. После этого только что рассмотренный обработчик события listView1_SelectedIndexChanged запишет имя и фамилию в текстовые поля редактирования Имя и Фамилия, соответственно.

Отредактировав имя или фамилию, пользователь должен щелкнуть кнопку Изменить. Ниже мы привели исходный текст обработчика событий для этой кнопки, изменяющего содержимое ячеек соответствующей строки в таблице Contacts:

private void button2_Click(object sender, System.EventArgs e)
{
if(fnTextBox.Text! = " " & & lnTextBox.Text! = " ")
{
string filter = " id='" + currentContactId.ToString() + " '";
DataRow[] contactsRows = contactsDataTable.Select(filter);

contactsRows[0].BeginEdit();
contactsRows[0][" Имя" ] = fnTextBox.Text;
contactsRows[0][" Фамилия" ] = lnTextBox.Text;
contactsRows[0].EndEdit();

contactsDataTable.AcceptChanges();

listUpdate();
}
}

Получив управление, наш обработчик убеждается в том, что пользователь задал не непустую строку имени или фамилии. Если это так, обработчик начинает процедуру обновления таблицы Contacts.

Для этого он вначале делает выборку из таблицы Contacts с помощью специального фильтра и метода DataTable.Select. Текстовая строка фильтра, задающая условие выборки, передается методу DataTable.Select в качестве параметра. Она определяет условие отбора строк из таблицы. Таким образом, метод DataTable.Select напоминает по своему назначению оператор SELECT языка запросов SQL, хотя, конечно, он не обладает всей мощностью этого оператора.

Метод Select возвращает записи в виде массива строк класса DataRow, которые можно обрабатывать в цикле или индивидуально с указанием индекса.

В нашем случае строка фильтра имеет следующий вид:

id=’< содержимое поля currentContactId> ’

Напомним, что поле currentContactId класса Form1 содержит текущий идентификатор строки таблицы Contacts, выделенной пользователем в списке имен и фамилий. Это поле обновляется обработчиком событий listView1_SelectedIndexChanged, когда пользователь выделяет новую строку в упомянутом списке.

Так как нам нужно обновить имя и фамилию человека, чье имя выделено в списке, то из таблицы Contacts требуется выбрать такие строки, содержимое столбца id которых равно текущему значению поля currentContactId. В общем случае таких строк может быть несколько. Мы, однако, будем изменять только первую строку.

Вот как формируется и применяется строка фильтра в нашем приложении:

string filter = " id='" + currentContactId.ToString() + " '";
DataRow[] contactsRows = contactsDataTable.Select(filter);

Обратите внимание, что значение, которому должно быть равно содержимое столбца id, заключено в одинарные кавычки.

После выполнения метода Select мы получим набор ссылок на строки contactsRows, удовлетворяющих нашему условию. Чтобы обновить содержимое одной выбранной строки, записав в нее новое имя и фамилию, мы используем следующий фрагмент кода:

contactsRows[0].BeginEdit();
contactsRows[0][" Имя" ] = fnTextBox.Text;
contactsRows[0][" Фамилия" ] = lnTextBox.Text;
contactsRows[0].EndEdit();

Перед началом внесения изменений в ячейки строки мы вызываем метод BeginEdit, который отключает механизм проверки целостности для связанных таблиц. Когда все изменения внесены, этот механизм вновь включается при помощи метода EndEdit.

Далее мы вызываем метод AcceptChanges, который вносит сделанные изменения в таблицу Contacts, и обновляем содержимое списка контактов при помощи метода listUpdate:

contactsDataTable.AcceptChanges();
listUpdate();

Удаление записей таблицы Contacts

Для того чтобы удалить строку, выделенную пользователем в списке контактов, нужно воспользоваться кнопкой Удалить. Ниже мы привели исходный текст метода button3_Click, выполняющего обработку событий от этой кнопки:

private void button3_Click(object sender, System.EventArgs e)
{
try
{
string filter = " idContacts='" +
listView1.SelectedItems[0].Tag.ToString() + " '";

DataRow[] phones = phonesDataTable.Select(filter);

for(int i = 0; i < phones.Length; i++)
{
if(phones.Length! = 0)
{
phones[i].Delete();
}
}
phonesDataTable.AcceptChanges();

contactsDataTable.Rows[
listView1.SelectedItems[0].Index].Delete();

contactsDataTable.AcceptChanges();
}
catch(Exception ex)
{
}

listUpdate();
phonesUpdate();
}

Собственно удаление записи, соответствующей выделенной строке, выполняет следующий фрагмент кода:

contactsDataTable.Rows[listView1.SelectedItems[0].Index].Delete();
contactsDataTable.AcceptChanges();

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

При связывании таблиц Contacts и Phones мы выбрали в списке Update rule значение Cascade, задающее режим автоматического внесения изменений в дочернюю таблицу при изменении записей родительской таблицы(рис. 8-37). Поэтому при удалении строк родительской таблицы происходит обновление соответствующих строк дочерней таблицы.

Тем не менее, для примера мы приводим фрагмент кода, который удаляет все строки таблицы Phones, связанные с удаляемой строкой таблицы Contacts:

string filter = " idContacts='" +
listView1.SelectedItems[0].Tag.ToString() + " '";

DataRow[] phones = phonesDataTable.Select(filter);

for(int i = 0; i < phones.Length; i++)
{
if(phones.Length! = 0)
{
phones[i].Delete();
}
}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.