История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Топ:
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Интересное:
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Дисциплины:
2019-11-19 | 191 |
5.00
из
|
Заказать работу |
Для этого необходимо запустить среду Visual Studio.NET, открыть созданный в предыдущей лабораторной работе проект. Понадобится использовать все созданные таблицы базы данных.
Таблица 5.5 - Пример транзакции при редактировании ведомостей
// Создать соединение с базой данных using (SqlConnection cs = new SqlConnection(Properties.Settings.Default.EDUConnectionString)) { // Открыть соединение с базой данных cs.Open(); // Начать транзакцию SqlTransaction t = cs.BeginTransaction(); // Создать команду к базе SqlCommand cmd = cs.CreateCommand(); cmd.Transaction = t; // Составить команду удаления оценки по студенту и предмете cmd.CommandText = @" delete from VED where PredId = @PredId and StudId = @StudId"; // Добавить параметр идентификации студента cmd.Parameters.AddWithValue("@StudId", StudId); // Добавть параметр индентификатора периода cmd.Parameters.AddWithValue("@PredId", int.Parse(cmbPred.SelectedValue.ToString())); try { // Выполнить запрос cmd.ExecuteNonQuery(); // Подтвердить транзакцию t.Commit(); } catch(Exception ex) { // Откатить транзакцию t.Rollback(); throw ex; } } |
Поэтому требуется объединить все таблицы БД в один DataSet, аналогично операции добавления одной таблицы STUD.
После чего на главной форме у объекта BindingSource, требуется задать свойство DataMemeber = STUD.В главное меню приложения добавим три пункта: «Предметы», «Ведомость», «Выход» (рис. 5.1). Добавим на главную форму ещё один список (DataGridView) для отображения оценок студентов по предметам (рис. 5.2).
Рисунок 5.1 - Доработанное меню приложения
Рассмотрим события, возникающие на форме.
· По нажатию пункта «Предметы» реализуем открытие новой формы с редактором таблицы PRED, по аналогии с предыдущей лабораторной работой (рис. 5.3).
· По нажатию пункта «Ведомость» реализуем открытие новой формы (FormVed) с редактором ведомости одного студента. Идентификатор студента передаётся по выбранной строке списка студентов.
· По выбору строки в списке студентов будем изменять содержание списка с оценками, методом присоединённых объектов.
· По событию нажатия пункта «Выход» реализуем завершение работы приложения.
Рисунок 5.2 - Доработанная главная форма приложения
Рисунок 5.3 - Диалог редактирования списка предметов
Добавим через форму редактирования свойств и событий таблицы студентов следующие свойства (листинг 5.6):
1) событие изменения выделенной ячейки;
2) свойство отображения строк – полная строка;
3) запретить выделение нескольких строк.
Листинг 5.6 -. Дополнительные свойства DataGridView списка студентов
this.dataGridView1.CurrentCellChanged += new System.EventHandler(this.dataGridView1_CurrentCellChanged); // 1 this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; // 2 this.dataGridView1.MultiSelect = false; // 3 |
Таблица ведомости должна обладать следующими свойствами (Листинг 5.7):
1) запрет добавления новых строк через интерфейс элемента управления;
2) запрет удаления строк через интерфейс элемента управления;
3) запретить выделение нескольких строк;
4) запретить редактирование записей через интерфейс элемента управления;
Листинг 5.7 - Дополнительные свойства DataGridView ведомости студента
this.dataGridVed.AllowUserToAddRows = false; // 1 this.dataGridVed.AllowUserToDeleteRows = false; // 2 this.dataGridVed.MultiSelect = false; // 3 this.dataGridVed.ReadOnly = true; // 4 |
Структура изменённого проекта представлена на рис. 5.4. Код реализующий все события формы и вызов соответствующих диалоговых окон представлен в табл. 5.8.
Рисунок 5.4 - Структура проекта
Таблица 5.8 - Код главной формы приложения
using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace WindowsFormsApplication1 { /// <summary> /// Форма редактирования списка студентов и их ведомости /// </summary> public partial class FormStud: Form { /// <summary> /// Переменная для хранения идентификатора выбранного студента /// </summary> int studId = -1; /// <summary> /// Конструктор формы со спиком студентов /// </summary> public FormStud() { InitializeComponent(); } |
Продолжение таблицы 5.8 |
/// <summary> /// Событие загрузки формы студентов /// </summary> /// <param name="sender">Форма</param> /// <param name="e">Аргумент</param> private void Form1_Load(object sender, EventArgs e) { // Связать данные базы и источник данных на форме this.sTUDTableAdapter.Fill(this.eDUDataSet.STUD); } /// <summary> /// Событие выбора пункта меню на сохранение данных /// </summary> /// <param name="sender">Меню</param> /// <param name="e">Аргумент</param> private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e) { // Обновить данные в базе this.sTUDTableAdapter.Update(this.eDUDataSet.STUD); } /// <summary> /// Событие выбора пункта меню на выход /// </summary> /// <param name="sender">Меню</param> /// <param name="e">Аргумент</param> private void выходToolStripMenuItem_Click(object sender, EventArgs e) { // Закрыть приложение Application.Exit(); } /// <summary> /// Событие выбора пункта меню на редактирование справочника предметов /// </summary> /// <param name="sender">Меню</param> /// <param name="e">Аргумент</param> private void предметыToolStripMenuItem_Click(object sender, EventArgs e) { // Создать форму редактирования предметов FormPred frmPred = new FormPred(); // Показать диалог для редактирования предметов frmPred.ShowDialog(); } /// <summary> |
Продолжение таблицы 5.8 |
/// Событие смены курсора в списке студентов /// </summary> /// <param name="sender">Список студентов</param> /// <param name="e">Аргумент</param> private void dataGridView1_CurrentCellChanged(object sender, EventArgs e) { // Проверить выбран ли хотя бы один элемент из списка if (dataGridView1.SelectedCells.Count > 0) { // Получить индентификатор студента studId = int.Parse( dataGridView1.Rows[ dataGridView1.SelectedCells[0].RowIndex].Cells[0].Value.ToString() ); // Обновить ведомость после выбора студента LoadStudData(); } } /// <summary> /// Событие выбора пункта меню для редактирования вдеомости студента /// </summary> /// <param name="sender">Меню</param> /// <param name="e">Аргумент</param> private void ведомостьToolStripMenuItem_Click(object sender, EventArgs e) { // Проверить выбран ли студент if (studId > 0) { // Создать форму редактирования ведомости для студента FormVed frm = new FormVed(studId); // Показать форму frm.ShowDialog(); // Обновить ведомость после закрытия диалога редактирования ведомости LoadStudData(); } } /// <summary> /// Метод обновления ведомости по выбранному студенту /// </summary> public void LoadStudData() |
Продолжение таблицы 5.8 |
{ // Проверить выбран ли студент if (studId > 0) { // Создать таблицу в ОП для хранения данных ведомости DataTable dtVed = new DataTable(); // Создать соединение с базой данных using(SqlConnection cs = new SqlConnection (Properties.Settings.Default.EDUConnectionString)) { // Открыть соединение с базой данных cs.Open(); // Создать команду к базе данных SqlCommand cmd = cs.CreateCommand(); // Создать запрос на выборку наименования предмета и оценки студента cmd.CommandText = "select p.Name, v.Value from VED v inner join PRED p on p.Id = v.PredId where v.StudId = @StudId"; // Создать параметер для индектификатора студента в запросе cmd.Parameters.Add(new SqlParameter("@StudId", SqlDbType.Int)); // Задать значение параметра идентификатора студента cmd.Parameters["@StudId"].Value = studId; // Создать адаптер для заполнения таблицы в ОП SqlDataAdapter ad = new SqlDataAdapter(cmd); // Заполнить таблицу значениями из базы ad.Fill(dtVed); } // Связать таблицу с элементов управления для отображения ведомости dataGridVed.DataSource = dtVed; } } } } |
Диалог редактирования ведомости одного студента (FormVed) представлена на рис.5.5.
Рисунок 5.5 - Диалог редактирования ведомости студента
Форма диалога редактирования ведомости студента включает в себя следующие элементы управления, код формы приведён в табл. 5.9:
1) ComboBox для списка предметов, его свойства представлены на рис.5.6. Этот элемент управления необходимо связать с таблицей DataSet – PRED по аналогии с таблицей студентов;
Рисунок 5.6 - Свойства элемента управления для списка предметов
2) текстовое поле (TextBox) для ввода оценки студента по выбранному предмету;
3) кнопку для сохранения;
4) кнопку для закрытия диалога.
Таблица 5.9 - Листинг формы диалога редактирования ведомости
using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace WindowsFormsApplication1 { /// <summary> /// Форма ведомости /// </summary> public partial class FormVed: Form { /// <summary> /// Переменная для идентификатора студента /// </summary> int StudId = -1; /// <summary> |
Продолжение таблицы 5.9 |
/// Конструктор формы ведомости студента /// </summary> /// <param name="studId">Идентификатор студента</param> public FormVed(int studId) { StudId = studId; InitializeComponent(); } /// <summary> /// Событие загрузки формы ведомости /// </summary> /// <param name="sender">Форма</param> /// <param name="e">Аргумент</param> private void FormVed_Load(object sender, EventArgs e) { this.pREDTableAdapter.Fill(this.eDUDataSet.PRED); } /// <summary> /// Событие закрытия формы /// </summary> /// <param name="sender">Форма</param> /// <param name="e">Аргумент</param> private void btnClose_Click(object sender, EventArgs e) { Close(); } /// <summary> /// Событие сохранения формы /// </summary> /// <param name="sender">Форма</param> /// <param name="e">Аргумент</param> private void btnSave_Click(object sender, EventArgs e) { // Если выбран студент if (StudId > 0) { // Создать соединение с базой данных using (SqlConnection cs = new SqlConnection(Properties.Settings.Default.EDUConnectionString)) { // Открыть соединение с базой данных cs.Open(); |
Продолжение таблицы 5.9 |
// Начать транзакцию SqlTransaction t = cs.BeginTransaction(); // Создать команду к базе SqlCommand cmd = cs.CreateCommand(); cmd.Transaction = t; // Если оценка не введена if (string.IsNullOrEmpty(textBox1.Text)) { // Составить команду удаления оценки по студенту и предмете cmd.CommandText = @" delete from VED where PredId = @PredId and StudId = @StudId"; } else { // Если оценка введена то составить команду // обновления или добавления записи в ведомость cmd.CommandText = @" if exists(select * from VED where PredId = @PredId and StudId = @StudId) update VED set Value = @Value where PredId = @PredId and StudId = @StudId else insert into VED (PredId, StudId, Value) values (@PredId, @StudId, @Value) "; } // Добавить параметр идентификации студента cmd.Parameters.AddWithValue("@StudId", StudId); // Добавть параметр оценки int value = 0; int.TryParse(textBox1.Text, out value); cmd.Parameters.AddWithValue("@Value", value); // Добавть параметр индентификатора периода cmd.Parameters.AddWithValue("@PredId", int.Parse(cmbPred.SelectedValue.ToString())); try { // Выполнить запрос cmd.ExecuteNonQuery(); |
Продолжение таблицы 5.9 |
// Подтвердить транзакцию t.Commit(); } catch(Exception ex) {// Откатить транзакцию t.Rollback(); throw ex; } } } } /// <summary> /// Событие изменения предмета /// </summary> /// <param name="sender">Элмент со списоком предметов</param> /// <param name="e">Аргумент</param> private void cmbPred_SelectedValueChanged(object sender, EventArgs e) {// Значение утанавливаемое в качестве оценки string strValue = string.Empty; // Проверить выбран ли студент и предмет if (StudId > 0 && cmbPred.SelectedValue!= null) {// Создать соединение с базой данных using (SqlConnection cs = new SqlConnection(Properties.Settings.Default.EDUConnectionString)) {// Открыть соединение с базой данных cs.Open(); // Создать команду к базе данных SqlCommand cmd = cs.CreateCommand(); // Создать запрос на выборку оценки по заданному предмету и студенту cmd.CommandText = @" select Value from VED where PredId = @PredId and StudId = @StudId"; // Добавить идентификатор студента cmd.Parameters.AddWithValue("@StudId", StudId); // Добавить идентификатор предмета cmd.Parameters.AddWithValue("@PredId", int.Parse(cmbPred.SelectedValue.ToString())); // Выполнить запрос object o = cmd.ExecuteScalar(); if (o!= null) if (o!= DBNull.Value) strValue = o.ToString(); } } // Установить текущую оценку студента textBox1.Text = strValue; } } } |
Пример списка студентов с заполненной ведомостью представлен на рис.5.7.
Рисунок 5.7 - Пример списка студентов с заполненной ведомостью
Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!