| Украина, Киев |
Редактирование данных в среде ADO.NET
Добавление и удаление строк в наборе данных средствами среды ADO.NET
Здесь мы опять будем работать без использования элементов управления вкладки Data, а только с классами, соединяясь с элементами управления только на этапе выполнения. И будем реализовывать возможности классов для поддержки задачи редактирования данных.
В качестве основы загрузки данных в этом упражнении мы оставим код предыдущей формы Form1, создав ее копию, и разовьем возможности, добавив средства редактирования с помощью соответствующих функциональностей классов.
-
В
панели Solution Explorer проекта щелкните правой кнопкой
мыши на узле Form1.cs и выполните команду Copy контекстного
меню
-
Щелкните
правой кнопкой мыши на узле самого проекта в дереве панели
Solution Explorer и выполните команду Paste
-
Переименуйте
созданную копию формы Form1 в файл Form2.cs
-
Щелкните
правой кнопкой мыши на новом узле Form2.cs и выполните
команду меню View Cide
-
В
редакторе кода файла Form2.cs вызовите
комбинацией клавиш
Ctrl-F окно поиска и замены и выполните
в коде замену всех вхождений Form1 на Form2
-
Откройте
файл Form0.cs в режиме кода и раскомментируйте заблокированный
нами ранее код открытия формы Form2 в обработчике второй
кнопки
private void button2_Click(object sender, System.EventArgs e)
{
Form2 frm = new Form2();
frm.Show();
}
Листинг
9.10.
Разблокирование кода в обработчике кнопки формы Form0
-
Запустите
приложение, откройте форму Form2 и убедитесь,
что она работоспособна и ее функциональность соответствует
форме Form1 (эта ее
копия и мы пока еще ничего в ней не резали и не клеили
- ни селедку, ни Большого Билла).
Приступим к наращиванию кода в Form2 для добавления возможностей редактирования
-
Введите
в класс Form2 объявление булевой переменной mblnAdd с
начальной инициализацией false. Эта переменная будет играть
роль флага для включения и отключения режима добавления
новой записи в базу данных.
.......................................... // Windows Form Designer generated code // Переменные-члены класса Form2 System.Data.DataSet mdsCustIndiv = new System.Data.DataSet();// Объявили и создали набор данных System.Data.OleDb.OleDbDataAdapter modaCustIndiv;// Только объявили поставщика System.Data.DataRow mdrCustIndiv;// Ссылочная переменная bool mblnAdd = false;// Флаг режима добавления записи ..........................................Листинг 9.11. Объявление флага редактирования
-
Поместите
в форму две новых кнопки для добавления и удаления
записей со следующими значениями свойств
| Объект | Свойство | Значение |
|---|---|---|
| Button | Name | btnAdd |
| Text | Add | |
| Button | Name | btnDelete |
| Text | Delete |
Кнопка Add будет включать режим добавления новой записи, которая будет добавлена в базу данных по нажатию кнопки Save.
-
В
режиме Design выполните команду Format/Lock Controls так,
чтобы сначала разомкнуть все элементы формы, а затем вновь
замкнуть, дабы подсадить в эту компанию и новые кнопки. -
В
режиме Design добавьте в форму Form2 обработчик
события Load
-
Наполните
код обработчика так
private void Form2_Load(object sender, System.EventArgs e)
{
AccessButtons(false); // Закрыть кнопки управления
}
//*****************************************************************
// Наша функция!!!
// Регулирует доступность кнопок
// в соответствующие поля набора данных через ссылку на строку
private void AccessButtons(bool bEnable)
{
// Разрешить или запретить применение соответствующих кнопок
btnEdit.Enabled = bEnable;
btnAdd.Enabled = bEnable;
btnDelete.Enabled = bEnable;
btnCancel.Enabled = bEnable;
btnSave.Enabled = bEnable;
}
Листинг
9.12.
Обработчик события Load формы Form2, блокирующий кнопки
Этот обработчик нужен для отключения функциональности кнопок, пока данные еще не загружены.
-
Создайте
обработчик события Click для кнопки Add.
В этом обработчике прежде всего нужно поднять флаг режима
добавления новой записи в базу данных. Затем необходимо очистить
текстовые поля и снять с них режим ReadOnly.
Код обработчика приведен ниже
//*****************************************************************
//*****************************************************************
// Дополнение класса возможностями редактирования данных
//*****************************************************************
//*****************************************************************
// Обработчик кнопки Add
private void btnAdd_Click(object sender, System.EventArgs e)
{
mblnAdd = true; // Включен режим добавления записи
ClearEditing();
ActivateEditing(true);
}
//*****************************************************************
// Функция очистки текстовых полей
private void ClearEditing()
{
txtCustomerID.Text =
txtCompanyName.Text =
txtContactName.Text =
txtContactTitle.Text =
txtAddress.Text =
txtCity.Text =
txtRegion.Text =
txtPostalCode.Text =
txtCountry.Text =
txtPhone.Text =
txtFax.Text = "";
}
//*****************************************************************
// Функция изменения свойств текстовых полей
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;
}
// Разрешить или запретить применение соответствующих кнопок
btnEdit.Enabled = !bEnable;
btnDelete.Enabled = !bEnable;
btnCancel.Enabled = bEnable;
btnSave.Enabled = bEnable;
// Установить фокус ввода на первое текстовое поле CustomerID
if(bEnable)
txtCustomerID.Focus();
}
Листинг
9.13.
Код обработчика кнопки Add
Теперь нужно добавить обработчик события Click кнопки Save. В коде обработчика нужно проверить флаг режима добавления и принять решение, обновлять ли базу с добавлением новой записи или просто заменить значения текущих данных, считая, что проводилось просто редактирование.
-
Создайте
обработчик события Click кнопки Save,
которая у нас на форме присутствует, и заполните его следующим
кодом
//*****************************************************************
// Обработчик кнопки Save
private void btnSave_Click(object sender, System.EventArgs e)
{
ActivateEditing(false);
SaveRecord();
mblnAdd = false;
}
//*****************************************************************
// Сохранить изменения в базе данных
private void SaveRecord()
{
if(mblnAdd)
{
// Создать новую строку в наборе данных
// и сохранить ссылку на нее в ссылочной переменной
mdrCustIndiv = mdsCustIndiv.Tables["Customers"].NewRow();
}
// Перекачать значения текстовых полей в строку набора данных
mdrCustIndiv.BeginEdit(); // Открыть разрешение
TextBoxToDataSet(); // Перекачать - наша функция!!!
mdrCustIndiv.EndEdit(); // Закрыть разрешение
// Использовать защищенный режим
try
{
// Если режим добавления, то расширить набор
// данных, включив туда сформированную строку
if(mblnAdd)
mdsCustIndiv.Tables["Customers"].Rows.Add(mdrCustIndiv);
// Создать экземпляр построителя SQL-команды
System.Data.OleDb.OleDbCommandBuilder ocbCustIndiv =
new System.Data.OleDb.OleDbCommandBuilder(modaCustIndiv);
// Настроить поставщик данных на действия
// с помощью экземпляра построителя команды
if(mblnAdd)
{
// Обеспечить вставку новой записи
modaCustIndiv.InsertCommand = ocbCustIndiv.GetInsertCommand();
}
else
{
// Обеспечить обновление изменений существующей записи
modaCustIndiv.UpdateCommand = ocbCustIndiv.GetUpdateCommand();
}
// Выполнить автоматически сгенерированную команду SQL
modaCustIndiv.Update(mdsCustIndiv, "Customers");
mdsCustIndiv.Tables["Customers"].AcceptChanges();
// Отключиться от базы данных
if(mblnAdd)
{
modaCustIndiv.InsertCommand.Connection.Close();
LoadList();
}
else
modaCustIndiv.UpdateCommand.Connection.Close();
}
catch(System.Data.OleDb.OleDbException excData)
{
System.Windows.Forms.MessageBox.Show(
"Произошла ошибка: " + excData.Message);
}
}
//*****************************************************************
// Наша функция!!!
// перекачивает текстовые поля элементов TextBox
// в соответствующие поля набора данных через ссылку на строку
private void TextBoxToDataSet()
{
mdrCustIndiv["CustomerID"] = txtCustomerID.Text;
mdrCustIndiv["CompanyName"] = txtCompanyName.Text;
mdrCustIndiv["ContactName"] = txtContactName.Text;
mdrCustIndiv["ContactTitle"] = txtContactTitle.Text;
mdrCustIndiv["Address"] = txtAddress.Text;
mdrCustIndiv["City"] = txtCity.Text;
mdrCustIndiv["Region"] = txtRegion.Text;
mdrCustIndiv["PostalCode"] = txtPostalCode.Text;
mdrCustIndiv["Country"] = txtCountry.Text;
mdrCustIndiv["Phone"] = txtPhone.Text;
mdrCustIndiv["Fax"] = txtFax.Text;
}
Листинг
9.14.
Код, связанный с обработчиком кнопки Save
-
Создайте
обработчик события Click кнопки Cancel,
которая у нас на форме присутствует, и заполните его
следующим кодом
//*****************************************************************
private void btnCancel_Click(object sender, System.EventArgs e)
{
mblnAdd = false; // Сбросить флаг режима добавления
LoadIndividual(); // Повторить заполнение TextBox
ActivateEditing(false); // Перевести поля в режим "Только для чтения"
}
Листинг
9.15.
Обработчик события Click кнопки Cancel
-
Создайте
обработчик события Click кнопки Delete и наполните его
так
//*****************************************************************
private void btnDelete_Click(object sender, System.EventArgs e)
{
// Использовать защищенный режим
try
{
// Удалить запись из объекта строки данных
mdrCustIndiv.Delete();
// Создать экземпляр построителя SQL-команды
System.Data.OleDb.OleDbCommandBuilder ocbCustIndiv =
new System.Data.OleDb.OleDbCommandBuilder(modaCustIndiv);
// Настроить поставщик данных на автоматическое удаление
modaCustIndiv.DeleteCommand = ocbCustIndiv.GetDeleteCommand();
// Выполнить автоматически сгенерированную команду SQL
modaCustIndiv.Update(mdsCustIndiv, "Customers");
mdsCustIndiv.Tables["Customers"].AcceptChanges();
// Отключиться от базы данных
modaCustIndiv.DeleteCommand.Connection.Close();
}
catch(System.Data.OleDb.OleDbException excData)
{
System.Windows.Forms.MessageBox.Show(
"Произошла ошибка: " + excData.Message);
}
// Обновить экран свежими данными
LoadList();
// Установить режим текстовых полей "Только для чтения"
ActivateEditing(false);
}
Листинг
9.16.
Обработчик события Click кнопки Delete
-
Создайте
обработчик события Click кнопки Edit и
наполните его так
//*****************************************************************
// Обработчик события Click кнопки Edit
private void btnEdit_Click(object sender, System.EventArgs e)
{
// Разрешить редактирование данных в кэше
ActivateEditing(true);
}
Листинг
9.17.
Обработчик события Click кнопки Edit
-
Постройте
приложение и проверьте его работоспособность. Помните,
что максимальный размер поля CustomerID равен 5. Это поле
ключевое, поэтому его заполнение обязательно. Несоблюдение
этих условий при испытании формы приведет к генерации ошибки
базой данных.
Внешний вид формы Form2 будет примерно таким




