- •Лабораторная работа №6. Доступ к данным с помощью технологии ado.Net
- •1. Цель работы
- •2. Сведения из теории
- •2.1. Типы пространства имен System.Data
- •2.5. Возможности класса DataSet
- •3.2.1. Обновление содержимого главного окна приложения
- •2.6. Класс DataRelation
- •3. Пример выполнения работы
- •3.1. Визуальное проектирование диалогового окна
- •3.2. Проектирование программного кода
- •3.2.2. Добавление нового контакта
- •3.2.3. Добавление номера телефона
- •3.2.4. Выбор записей в таблицах
- •3.2.5. Редактирование записей таблицы Contacts
- •3.2.6. Изменение номера телефона
- •3.2.7. Удаление записей таблицы Contacts
- •If (MessageBox.Show("Вы действительно хотите удалить
- •3.2.8. Удаление номера телефона
- •If (MessageBox.Show("Вы действительно хотите удалить
- •3.2.9. Фильтрация данных
- •4. Задание для самостоятельной работы
3.2.7. Удаление записей таблицы Contacts
Для того чтобы удалить строку, выделенную пользователем в списке контактов, нужно воспользоваться кнопкой Удалить. Ниже приведен исходный текст метода, выполняющего обработку событий от этой кнопки:
private void DelContactButton_Click(object sender, EventArgs e)
{
//если выбрана запись для удаления
if (dataGridView1.SelectedRows.Count != 0)
{
If (MessageBox.Show("Вы действительно хотите удалить
запись?", "Подтверждение",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try
{
//удалить выбранную строку
dataSet11.Contacts.Rows[RowId].Delete();
}
catch (Exception)
{
}
//обновить БД и ее содержимое на форме
UpdateContacts();
}
}
else
MessageBox.Show("Выберите строку для удаления",
"Ошибка");
}
После проверки, выбрана ли в таблице строка для удаления и вывода подтверждающего сообщения, непосредственное удаление записи выполняется методом Delete(), после чего изменения сохраняются в базу данных и отображаются на форме.
При связывании таблиц Contacts и Phones в списке Delete rule было выбрано значение Cascade, задающее режим автоматического внесения изменений в дочернюю таблицу при удалении записей родительской таблицы. Поэтому при удалении строк родительской таблицы происходит удаление соответствующих строк дочерней таблицы.
3.2.8. Удаление номера телефона
Для удаления номера телефона предназначена кнопка Удалить, расположенная возле списка телефонов. Далее приведен обработчик событий для этой кнопки:
private void DelPhoneButton_Click(object sender, EventArgs e)
{
//если выбрана запись для удаления
if (dataGridView2.SelectedRows.Count != 0)
{
If (MessageBox.Show("Вы действительно хотите удалить
запись?", "Подтверждение",
MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try
{
//удалить выбранную строку
dataSet11.Phones.Rows[PhoneId].Delete();
}
catch (Exception)
{
}
//обновить БД и ее содержимое на форме
UpdateContacts();
}
}
else
MessageBox.Show("Выберите строку для удаления",
"Ошибка");
}
Код обработчика идентичен предыдущему (естественно, работа идет с таблицей Phones и компонентом dataGridView2).
3.2.9. Фильтрация данных
В данном приложении приведен пример фильтра, который позволяет просматривать номера телефона одного, выбранного человека. Фамилия этого человека выбирается в выпадающем списке FamComboBox. Режим фильтрации включается флажком FilterCheckBox. Код обработки щелчка по этому флажку приведен ниже:
private void FilterCheckBox_CheckedChanged(object sender, EventArgs e)
{
//если установлен флажок и выбрана фамилия
if (FilterCheckBox.Checked && FamComboBox.Text != "")
{
//получить выбранную фамилию
string fio = FamComboBox.SelectedItem.ToString();
//составить условие для поиска нужного человека
//в таблице Contacts
string str = "Fam='" + fio + "'";
//найти нужного человека в таблице Contacts
DataRow[] contacts = dataSet11.Contacts.Select(str);
//составить условие для фильтра
str = "ContactId=" + contacts[0]["id"];
//применить фильтр
phonesBindingSource.Filter = str;
}
else
//отменить фильтрацию
phonesBindingSource.Filter = "";
}
В начале работы метода проверяется, установил ли пользователь флажок фильтрации и задал ли требуемую фамилию.
Так как фильтрация будет задаваться для таблицы Phones, а поле «фамилия» находится в таблице Contacts, необходимо получить идентификатор (порядковый номер) требуемой фамилии, чтобы потом найти его в таблице телефонов. Получить выбранную фамилию из выпадающего списка можно методом SelectedItem, а отобрать запись с этой фамилией из таблицы Contacts – методом Select().
Далее из полученной записи выделяется значение поля id, на основе которого задается условие для фильтрации: ContactId = <значение поля id>. Сформированный фильтр применяется к компоненту phonesBindingSource с помощью свойства Filter. Этот компонент генерируется автоматически при добавлении адаптеров доступа к базе данных.
Если флажок FilterCheckBox не отмечен или в списке не выбрана фамилия, свойству Filter присваивается значение пустой строки, т.е. фильтрация отменяется.
