Читайте также:
|
|
Київський технікум електронних приладів
Лабораторна робота №9
з дисципліни «Інструментальні зазоби візуального програмування»
на тему
«Розширення можливостей таблиці»
Мета роботи
- додання можливості змінити дані абітурієнтів;
- додання контекстного меню;
- розширення можливостей авторизації;
- створення форми «Інформація про студента»;
- можливість видалення виділених абітурієнтів.
Матеріали для засвоєння
1) Робота з контекстним меню;
2) Зміна даних шляхом перезапису файлів;
3) Робота з tabControl;
4) Робота з бінарними файлами.
Виконання роботи
Створення проекту
Створюємо новий проект Lab5та замінюємо файли з попереднього проекту, як було показано раніше.
Створення форми «Інформація про студента»
Якщо при реєстрації абітурієнта була допущена помилка, то її необхідно виправити. Для цього необхідно створити форму, на якій би компактно розміщувалася уся інформація про абітурієнта з можливістю її редагування та збереження. Створимо форму 12:
Інформація про студента
Дана форма містить tabControl, який можна знайти в Toolbox/Containers. Це елемент, який містить вкладки та може компактно розмістити у собі багато інформації.
Щоб додати сторінки до tabControl необхідно використати властивість tabpages, де відбувається редагування сторінок. Поля сторінок такі самі, як і на формах з реєстрацією.
Дана форма буде визиватися з форми 8 при подвійному кліку на потрібному абітурієнті, тому необхідно додати до форми 8 обробник RowHeaderMouseDoubleClick:
privatevoid dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
DataTable dat = (DataTable)dataGridView1.DataSource; //get table
StreamWriter sr = File.CreateText("temp.av"); //create temp file
//copy index of current abiturient to file
sr.WriteLine(dat.Rows[e.RowIndex][0].ToString());
sr.Close();
Form12 f = newForm12();
f.Show(); //show abiturient information form
}
Нам необхідно, щоб індекс абітурієнта передався з 8-мої форми до 12-тої. Це можна зробити через тимчасовий файл “temp.av”. Тоді при загрузці форми 12 ми будемо знати, про якого абітурієнта йде мова:
privatevoid Form12_Load(object sender, EventArgs e)
{
StreamReader sr1; //file reader
string s; //temporary
Restore(); //restore information
if (File.Exists("Avt.txt") == true) //pin entered
{
sr1 = File.OpenText("Avt.txt"); //open file
s = sr1.ReadLine(); //read line
sr1.Close();
if (String.Compare(s, ReturnPin()) == 0) //pin entered correct
{
autor = true; //autorise
}
}
if (autor == false)
button1.Visible = false;
else
button1.Visible = true;
}
У функції Restore() буде відкриватися тимчасовий файл “temp.av”, зчитуватись індекс абітурієнта та видалятися. Потім інформацію про даного абітурієнта з головного файлу необхідно зчитати та заповнити поля форми.
Після відновлення інформації необхідно перевірити, чи є користувач авторизованим. Якщо ні, то він не зможе змінювати інформацію, а, отже, кнопка «Зберегти» йому буде недоступна.
Якщо користувач авторизований, то при натисненні на кнопку «Зберегти» необхідно замінити усі рядки головного файлу на поля форми. Це можна зробити переписавши головним файл зі зміненим абітурієнтом до тимчасового файлу, а потім їх замінити.
Зауваження: після початку операцій з файлами, що потребують багато часу, необхідно ховати натиснену кнопку для передбачення помилок. Після завершення операцій необхідно робити повідомлення та повертати кнопку на місце:
Також, як і в попередніх прикладах, необхідно заборонити допущення логічних помилок за допомогою обробників на відповідні checkbox(вибір денної та заочної форми навчання одночасно).
Розширення можливостей авторизації
У попередньому проекті ми видаляли файл "Avt.txt" з pin-кодом, тому авторизація зберігалася лише протягом перебування на формі 8. Якщо ми будемо видаляти цей файл в кінці роботи з програмою, то авторизуватися необхідно буде лише 1 раз.
Також, можна буде звертатися до цього файлу з інших форм, як це було зроблено в попередньому розділі.
Додання контекстного меню до таблиці
Контекстне меню можна знайти у Toolbox/Menus&Toolbars/ContextMenuStrip. При додання меню до форми, воно не буде зв’язуватись з таблицею, тому необхідно зробити це самим: у властивостях таблиці змінити поле contextMenuStrip. Тепер наше меню буде прив’язане до таблиці і виникати тільки в рамках таблиці.
Наше контекстне меню буде виглядати наступним чином:
Додати нові елементи до меню можна за допомогою властивості Collection,також прив’язати певну клавішу до того чи іншому підменю.
Тут «Delete» буде відповідати за видалення виділених абітурієнтів, а «Lookinformation» буде відкривати вікно «Інформація про студента» для 1 або декількох абітурієнтів.
Треба зазначити, що підпункт «Delete» не буде доступний без авторизації. Також обидва пункти не будуть доступні без виділення хоча б 1 строки. Щоб реалізувати ці ситуації необхідно додати обробник подій contextMenuStrip1_Opening:
privatevoid contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
bool flag = false; //no rows selected
for (int i = 0; i < dataGridView1.Rows.Count; i++) //for each row
if (dataGridView1.Rows[i].Selected == true) //row selected
{
flag = true; //some rows selected
break;
}
if (flag == false) //if no rows selected, so no menu available
{
DeleteToolStripMenuItem.Enabled = false;
lookInformationToolStripMenuItem.Enabled = false;
}
elseif (autor == false) //if no autorize
{
DeleteToolStripMenuItem.Enabled = false;
lookInformationToolStripMenuItem.Enabled = true;
}
elseif (autor==true) //if autorise complete
{
DeleteToolStripMenuItem.Enabled = true;
}
}
Тоді при відкриті меню, будуть перевірятися відповідні умови і активізуватися ті чи інші підпункти.
Залишилося прописати обробники подій для підпунктів. «Lookinformation» буде лише відкривати форму 12 методом Show() та передавати індекс абітурієнта за допомогою тимчасового файлу, а підпункт «Delete» повинен містити методи для видалення абітурієнта та обновлення таблиці:
privatevoid DeleteToolStripMenuItem_Click(object sender, EventArgs e)
{
DataTable dat = (DataTable)dataGridView1.DataSource; //get table
string str; //working string
bool flag = false; //none of rows
int del = 0; //number of abiturients was deleted
if (MessageBox.Show("Після видалення інформацію не можна буде повернути\nПродовжити
виконання операції?", "Info",
System.Windows.Forms.MessageBoxButtons.YesNo, //messageboxshow
System.Windows.Forms.MessageBoxIcon.Exclamation) == DialogResult.Yes)
flag = true;
if (flag == true) //action agreed
for (int i = 0; i < dataGridView1.Rows.Count; i++) //for each row
if (dataGridView1.Rows[i].Selected == true) //for all selected row
{
StreamReader sr = File.OpenText("Abiturient.txt"); //open main file
StreamWriter sw = File.CreateText("temp"); //temporary file
for (int j = 0; j <Convert.ToInt32(dat.Rows[i][0]) - 1 - del; j++)
//copy all until current abiturient found
{
while (true)
{
str = sr.ReadLine(); //read
if (String.Compare(str, "===================================================================") == 0)//end sign found
{
sw.WriteLine("===================================================================");
break;
}
sw.WriteLine(str); //write
}
}
if (Convert.ToInt32(dat.Rows[i][0]) - 1!= dataGridView1.Rows.Count) //abiturient wasn't the last one
{
while (true) //skip all fields about current abiturient
{
str = sr.ReadLine();
if (String.Compare(str, "===================================================================") == 0)//end sign found
break;
}
while (true) //copy all after current abiturient
{
str = sr.ReadLine();
if (str == null)
break;
sw.WriteLine(str);
}
}
sr.Close();
sw.Close();
File.Replace("temp", "Abiturient.txt", "t"); //replace files
//----delete temporary------
File.Delete("temp");
File.Delete("t");
del++; //increase number of deleted
}
if (flag == true)
{
MessageBox.Show("Виділеністрокивидалені", "Info",
System.Windows.Forms.MessageBoxButtons.OK, //messagebox show
System.Windows.Forms.MessageBoxIcon.Information);
Form8_Load(sender, e);
}
}
Для усіх виділених рядків відбувається видалення відповідного абітурієнта шляхом заміни файлів. Після видалення таблиця обновлюється методом Form8_Load(sender,e).
Висновок
У даній роботі ми додали можливості видалення та зміни інформації про абітурієнтів. Також познайомилися з контекстним меню та листами з вкладками.
Дата добавления: 2015-11-26; просмотров: 129 | Нарушение авторских прав