Редактирование данных в среде 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 будет примерно таким