Опубликован: 13.07.2010 | Уровень: специалист | Доступ: свободно
Самостоятельная работа 5:
Элементы управления Data в приложениях на C#
Добавление и удаление записей с использованием связанных элементов управления
Не менее важной задачей, чем редактирование данных, является возможность добавления новых и удаления существующих записей в таблице. Нужно поместить на форму две новых кнопки New и Delete и ввести переменную области действия класса для контроля за тем, происходит добавление или редактирование записи. Если будет вводиться новая запись, то при обновлении данных в приложении необходимо перегрузить данные в списке в том случае, если значение поля CompanyName попадает в область данных, загруженных в список с учетом фильтра поля txtCustLimit.
-
Создайте
копию формы файла Form4cs, переименуйте ее в файл Form5.cs
и отключите от проекта файл Form4.cs -
Просмотрите
код файла Form5.cs и выполните замену слов Form4 на Form5
в поисковике оболочки. -
Постройте
проект и убедитесь, что функциональность новой формы сохранилась. -
Под
кнопкой btnEdit поместите две новых кнопки со значениями Name=btnNew; Text=&New; Name=btnDelete; Text=&Delete
-
Выделите
в подвале формы поставщик данных odaCustomerList и
внизу панели Properties щелкните по ссылке Configure
Data Adapter..., вызвав мастер для установки режима обновления данных закрепленной таблицы базы данных,
как это мы делали ранее для поставщика данных odaCustomerIndividual.
-
Создайте
для новых кнопок обработчики и заполните их, используя окончательный
для данного этапа код C#
.........................................................
static void Main()
{
Application.Run(new Form5());
}
//*****************************************************************
// Переменная-член класса для контроля над тем,
// происходит ли добавление или редактирование записи
private bool mbAddNew;
//*****************************************************************
// Обработчик кнопки загрузки данных
// в список ListBox с именем lstCustomers
private void btnLoadList_Click(object sender, System.EventArgs e)
{
LoadList();
}
//*****************************************************************
// Загрузка данных в список ListBox с именем lstCustomers
private void LoadList()
{
// Присвоить параметру адаптера данных значение,
// введенное для ограничения объема списка
odaCustomerList.SelectCommand.Parameters[0].Value
= txtCustLimit.Text;
// Удалить текущие данные в наборе данных
dsCustomerList.Clear();
// Заполнить набор данных списком заказчиков
odaCustomerList.Fill(dsCustomerList);
// Заполнить отдельный набор данных для начальной записи
RefreshIndividual();
}
//*****************************************************************
// Обновление отдельного набора данных
private void RefreshIndividual()
{
// Очистить отдельный набор данных
dsCustomerIndividual.Clear();
// Определить, выбран ли текущий элемент
if(lstCustomers.SelectedIndex != -1)
{
// Присвоить параметру SQL адаптера данных отдельного
// набора выбранный идентификатор заказчика
// Заполнить набор данных
try
{
odaCustomerIndividual.SelectCommand.Parameters[0].Value
= lstCustomers.SelectedValue;
odaCustomerIndividual.Fill(dsCustomerIndividual);
}
catch(Exception e1)
{
MessageBox.Show(e1.Message);
}
}
}
//*****************************************************************
// Обработчик выбора элемента списка
private void lstCustomers_SelectedIndexChanged(object sender, System.EventArgs e)
{
// Заполнить отдельный набор данных значениями
// полей текущего элемента списка
RefreshIndividual();
}
//*****************************************************************
// Обработчик события Click кнопки Edit
private void btnEdit_Click(object sender, System.EventArgs e)
{
// Разрешить редактирование данных в кэше
ActivateEditing(true);
}
//*****************************************************************
// Функция изменения свойств текстовых полей
private void ActivateEditing(bool bEnable)
{
// Только для чтения
txtCustomerID.ReadOnly =
txtCompanyName.ReadOnly =
txtContactName.ReadOnly =
txtContactTitle.ReadOnly =
txtAddress.ReadOnly =
txtCity.ReadOnly =
txtRegion.ReadOnly =
txtPostalCode.ReadOnly =
txtCountry.ReadOnly =
txtPhone.ReadOnly =
txtFax.ReadOnly = !bEnable;
// Стиль текстовых полей
if(bEnable)
{
txtCustomerID.BorderStyle =
txtCompanyName.BorderStyle =
txtContactName.BorderStyle =
txtContactTitle.BorderStyle =
txtAddress.BorderStyle =
txtCity.BorderStyle =
txtRegion.BorderStyle =
txtPostalCode.BorderStyle =
txtCountry.BorderStyle =
txtPhone.BorderStyle =
txtFax.BorderStyle = BorderStyle.Fixed3D;
}
else
{
txtCustomerID.BorderStyle =
txtCompanyName.BorderStyle =
txtContactName.BorderStyle =
txtContactTitle.BorderStyle =
txtAddress.BorderStyle =
txtCity.BorderStyle =
txtRegion.BorderStyle =
txtPostalCode.BorderStyle =
txtCountry.BorderStyle =
txtPhone.BorderStyle =
txtFax.BorderStyle = BorderStyle.FixedSingle;
}
}
//*****************************************************************
// Обработчик события Click кнопки Save
private void btnSave_Click(object sender, System.EventArgs e)
{
SaveRecord();
ActivateEditing(false);
// Добавлен код для загруки новой записи
if(mbAddNew)
{
// Загрузка данных новой записи
LoadList(); // Наша функция
// Обновление отдельного набора данных
RefreshIndividual(); // Наша функция
mbAddNew = false;
}
}
//*****************************************************************
// Сохранить изменения в базе данных
private void SaveRecord()
{
// Применить класс BindingContext для завершения
// текущего сеанса редактирования, чтобы иметь
// возможность записать обновления в базу данных
this.BindingContext[dsCustomerIndividual, "Customers"].EndCurrentEdit();
// Обновить данные в кэше из набора данных dsCustomerIndividual
// в поставщик данных odaCustomerIndividual
odaCustomerIndividual.Update(dsCustomerIndividual, "Customers");
// Передать данные из кэша поставщика данных в базу
dsCustomerIndividual.AcceptChanges();
}
//*****************************************************************
// Обработчик события Click кнопки Cancel
private void btnCancel_Click(object sender, System.EventArgs e)
{
// Для отмены текущей операции
// применяется класс BindingContext
this.BindingContext[dsCustomerIndividual, "Customers"].CancelCurrentEdit();
ActivateEditing(false);
mbAddNew = false;
}
//*****************************************************************
private void btnNew_Click(object sender, System.EventArgs e)
{
mbAddNew = true;
// Добавить новую запись с использованием класса BindingContext
this.BindingContext[dsCustomerIndividual, "Customers"].AddNew();
ActivateEditing(true);
}
//*****************************************************************
private void btnDelete_Click(object sender, System.EventArgs e)
{
// Отменить строку для удаления с использованием
// метода RemoveAt() класса BindingContext
this.BindingContext[dsCustomerIndividual, "Customers"]
.RemoveAt(BindingContext[dsCustomerIndividual, "Customers"].Position);
// Обновить данные в кэше из набора данных dsCustomerIndividual
// в поставщик данных odaCustomerIndividual
odaCustomerIndividual.Update(dsCustomerIndividual, "Customers");
// Передать данные из кэша поставщика данных в базу
dsCustomerIndividual.AcceptChanges();
// Перезагрузить список
LoadList();
// Отобразить первую запись
RefreshIndividual();
// Отключить текстовые поля
ActivateEditing(false);
}
Листинг
5.9.
Весь код, введенный вручную на текущий момент
-
Постройте
проект и удостоверьтесь в правильной работе добавленных возможностей. При
проверке добавляйте строки, а затем удаляйте их, но не
трогайте существующие записи, чтобы база соответствовала
оригиналу для получения одинаковых со мной результатов. -
При
анализе кода в редакторе кода оболочки используйте его
возможность, показанную на рисунке (очень удобно!)
Приведенный код полность рабочий, снабжен подробными комментариями, поэтому попробуйте проанализировать его самостоятельно (при необходимости для удобства можете распечатать).
