2.1 Цель работы
Приобретение опыта при использовании динамических запросов с задаваемыми параметрами, освоение запросов языка SQL для модификации данных.
2.2 Методические указания по организации самостоятельной работы студентов
Необходимо повторить следующий теоретический материал: элемент TableAdapter и его свойства, запросы на модификацию данных.
2.3 Порядок выполнения работы и методические указания к её выполнению
Добавьте к программе ещё одну форму (EditForm), на которой разместите объекты для добавления и изменения данных (рис. 2.1) и дайте им соответственно названия textBox_Name, dateTimePicker_ColonizeDate, comboBox_Gender, textBox_Address, textBox_Group, comBox_Benefit, textBox_Passport, comboBox_Room, button_OK, button_Cancel.
Рисунок 2.1 – Форма ввода данных
Выберите элемент comboBox_Gender. Существует 2 способа получения доступа к элементам коллекции, которая будет представлять возможные значения в элементе ComboBox. Первый способ - выбрать свойство Items, в окне Properties, и нажать на кнопку с троеточием (рисунок 2.2).
Рисунок 2.2 – Окно свойств компонента ComboBox
Второй способ – нажать на стрелку в правом верхнем углу элемента, в появившемся меню выбрать пункт Edit Items. В появившемся окне напишите возможные значения элемента: мужской, женский (рис. 2.3).
Рисунок 2.3 – Редактирование списка элементов в компоненте ComboBox
Для задания типа льготы, следует сделать привязку данных к таблице Benefits. Для этого добавьте на форму элемент bindingSource1 и задайте для него источник данных HostelDataSet. Выберите элемент comboBox_Benefits и в меню, которое появляется при нажатии на стрелку в правом верхнем углу элемента, выберите Use data bound items. Указать значения, как показано на рисунке 2.4. Сделайте аналогичные действия для comboBox_Room, указав значения как на рисунке 2.5.
Рисунок 2.4 – Привязка данных о льготе к таблице Benefits
Рисунок 2.5 - Привязка данных для comboBox_Room
С панели инструментов (ToolBox) добавьте на форму компонент StudentsTableAdapter и дайте ему имя studentsTableAdapter (как аналог: добавьте на форму элемент BindingSource и перетащите его на форму. Откройте свойства bindingSource1 и щелкните по полю DataSource. Выберите Other Data Sources/ Project Data Sources/ HostelDataSet. В свойстве Data Member выбрать таблицу Students ).
Создайте запросы для добавления и модификации данных.
Для этого следует в окне Solution Explorer щелкнуть дважды источник данных HostelDataSet. В открывшемся дизайнере источника данных выбрать StudentsTableAdapter, нажать правой кнопкой мыши и в появившемся меню выбрать AddQuery, затем Use SQL Statament, затем Next. В окне выбора типа запроса выбрать UPDATE и нажать Next.
Заменить текст предлагаемого запроса на приведенный ниже (рис. 2.6) и в следующем окне задать имя запроса UpdateQuery.
Рисунок 2.6 – Добавление запроса Update к StudentsTableAdapter
Опять щелкнуть правой кнопкой мыши по StudentsTableAdapter и, аналогично выполнив действия Add Query → Use SQL Statament → DELETE, добавить запрос на удаление (рис 2.7).
Рисунок 2.7 – Добавление запроса Delete к StudentsTableAdapter
Сохранить запрос, дав ему имя DeleteQuery.
Далее щелкнуть правой кнопкой мыши по StudentsTableAdapter и выполнить действия AddQuery → Use SQL Statament → SELECT which returns rows и добавить следующий запрос:
SELECT Id, Name, Gender, Address, [Group], Passport, BenefitCode, RoomNumber, ColonizeDate FROM Students WHERE ([Id] = @Id)
Запрос на добавление данных можно не добавлять, так как требуемый текст совпадает со стандартной командой INSERT, прописанной в адаптере таблицы. Посмотреть (и исправить при необходимости) стандартные команды, прописанные в адаптере таблицы можно, выбрав нужный адаптер таблицы (например, StudentsTableAdapter) в дизайнере источника данных, и открыв в окне Properties нужные запросы (рис. 4.8)
Рисунок 2.8 – Просмотр запросов для добавления и модификации данных
Теперь можно перейти к коду для работы с формой. Данная форма будет иметь два конструктора. Первый – без параметров, для добавления новой записи, второй будет принимать информацию о значениях полей выбранной строки, для редактирования информации. Напишите их, предварительно объявив переменные (замените код EditForm.cs на следующий).
using System;
using System.Windows.Forms;
namespace Hostel
{
public partial class EditForm : Form
{
/// <summary>
/// Id студента
/// </summary>
private readonly int id;
/// <summary>
/// true - если запись модифицируется, false - если создаётся новая
/// </summary>
readonly bool edit;
/// <summary>
/// конструктор формы, для создания новой записи
/// </summary>
public EditForm()
{
InitializeComponent();
roomsTableAdapter.Fill(hostelDataSet.Rooms);
benefitsTableAdapter.Fill(hostelDataSet.Benefits);
edit = false;
}
/// <summary>
/// конструктор формы, для модификации уже существующей записи
/// </summary>
/// <param name="name">ФИО</param>
/// <param name="colonizeDate">Дата заселения</param>
/// <param name="gender">Пол</param>
/// <param name="address">Адрес</param>
/// <param name="group">Группа</param>
/// <param name="benefitCode">Тип льготы</param>
/// <param name="passport">Паспорт</param>
/// <param name="roomNumber">Номер комнаты</param>
/// <param name="id">ID студента</param>
public EditForm(int id, String name, string gender, string address, string group, string passport, int benefitCode, int roomNumber, DateTime colonizeDate)
: this()
{
roomsTableAdapter.Fill(hostelDataSet.Rooms);
benefitsTableAdapter.Fill(hostelDataSet.Benefits);
edit = true;
this.id = id;
textBox_Name.Text = name;
dateTimePicker_ColonizeDate.Value = colonizeDate;
switch (gender.ToUpper())
{
case "мужской":
comboBox_Gender.SelectedIndex = 0;
break;
case "женский":
comboBox_Gender.SelectedIndex = 1;
break;
default:
comboBox_Gender.SelectedIndex = 0;
break;
}
textBox_Address.Text = address;
textBox_Group.Text = group;
comboBox_Benefit.SelectedValue = benefitCode;
textBox_Passport.Text = passport;
comboBox_Room.SelectedValue = roomNumber;
}
private void button_OK_Click(object sender, EventArgs e)
{
string gender = "";
if (comboBox_Gender.SelectedIndex == 0)
{
gender = "мужской";
}
else if (comboBox_Gender.SelectedIndex == 1)
{
gender = "женский";
}
if (edit)
{
studentsTableAdapter.UpdateQuery(textBox_Name.Text, gender, textBox_Address.Text, textBox_Group.Text, textBox_Passport.Text, Convert.ToInt32(comboBox_Benefit.SelectedValue), Convert.ToInt32(comboBox_Room.SelectedValue), dateTimePicker_ColonizeDate.Value.ToString(), id);
}
else
{
studentsTableAdapter.Insert(textBox_Name.Text, gender, textBox_Address.Text, textBox_Group.Text, textBox_Passport.Text, Convert.ToInt32(comboBox_Benefit.SelectedValue), Convert.ToInt32(comboBox_Room.SelectedValue), dateTimePicker_ColonizeDate.Value);
}
Close();
}
private void button_Cancel_Click(object sender, EventArgs e)
{
Close();
}
}
}
К главной форме следует добавить пункт меню EditForm и подпункты в него: Add, Delete и Update (рисунок 2.9). Измените у элемента DataGridView1 в свойстве SelectionMode значение на FullRowSelect.
Рисунок 2.9 – Изменение главной формы
Создайте обработчики событий нажатия пунктов меню, добавив соответствующий код.
private bool edit;
private void addToolStripMenuItem_Click(object sender, EventArgs e)
{
if(!edit) return;
var edt = new EditForm();
edt.ShowDialog();
studentsTableAdapter.Fill(hostelDataSet.Students);
hostelDataSet.AcceptChanges();
}
private void updateToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!edit) return;
var st = new HostelDataSet.StudentsDataTable();
studentsTableAdapter.FillBy(st,
Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[0].Value));
object[] row = st.Rows[0].ItemArray;
var edt = new EditForm(
Convert.ToInt32(row[0]),
row[1].ToString(),
row[2].ToString(),
row[3].ToString(),
row[4].ToString(),
row[5].ToString(),
Convert.ToInt32(row[6]),
Convert.ToInt32(row[7]),
Convert.ToDateTime(row[8])
);
edt.ShowDialog();
studentsTableAdapter.Fill(hostelDataSet.Students);
hostelDataSet.AcceptChanges();
}
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!edit) return;
studentsTableAdapter.DeleteQuery(
Convert.ToInt32(dataGridView1.SelectedRows[0].Cells[0].Value)
);
studentsTableAdapter.Fill(hostelDataSet.Students);
hostelDataSet.AcceptChanges();
}
Протестируйте приложение.
2.4 Содержание отчета
Отчет должен содержать: цель, задания полученные от преподавателя и результат их выполнения, выводы по работе.
4.5 Контрольные задания и вопросы
1 Расскажите про элемент TableAdapter и его свойства.
2 Какая команда добавляет строки в таблицу?
3 Какая команда изменяет строки в таблице?
4 Какая команда удаляет строки из таблицы?
5 Как изменить или удалить данные в одной таблице, основываясь на сведения из другой таблицы?
6 Можно ли изменять данные в несколькиз таблицах одной командой?
