МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
ТЕХНІЧНИЙ КОЛЕДЖ НАЦІОНАЛЬНОГО УНІВЕРСИТЕТУ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
КАФЕДРА ІНФОРМАЦІЙНИХ
ТЕХНОЛОГІЙ ТА
КОМП’ЮТЕРНОЇ ТЕХНІКИ
Лабораторна робота №3
з Людино-машинний інтерфейс
на тему:
“ Проектування програм з елементами керування TreeView, GridView, DataGridView”
м. Львів – 2011
Мета: Засвоїти методику та виробити практичні навички у проектуванні та створенні форм з елементами керування TreeView, GridView, DataGridView за допомогою Visual C# 2010.
Теоретичні відомості.
За допомогою елемента управління TreeView можна розробити програму, що нагадує Windows Explorer. По замовчуванні використовується подія AfterSelect, яка виконується після вибору вузла дерева. Приклад додавання елементів:
private void Form1_Load(object sender, EventArgs e)
{
//Додаэмо всы елементи в treeView1
treeView1.BeginUpdate();
treeView1.Nodes.Add("Parent");
treeView1.Nodes[0].Nodes.Add("Child 1");
treeView1.Nodes[0].Nodes.Add("Child 2");
treeView1.Nodes[0].Nodes[1].Nodes.Add("Grandchild");
treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("Great Grandchild");
treeView1.EndUpdate();
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
//виводим повідомлення з текстом вибору елементів
if (e.Action == TreeViewAction.ByMouse)
{
MessageBox.Show(e.Node.FullPath);
MessageBox.Show(e.Node.Text);
}
}
Елемент керування DataGrid, доступний починаючи з ранніх випусків. NET, був цілком функціональним, але мав безліч недоробок, які робили його невідповідним для застосування в комерційних додатках, наприклад, була відсутня можливість виведення графічних зображень і розкривних елементів тощо. Цей елемент управління був не цілком повноцінним, тому багато незалежні постачальники пропонували власні сіткові компоненти, які компенсували ці недоліки і представляли набагато більш широку функціональність.
В NET 2.0 з'явився додатковий сітковий елемент управління - DataGridView. Він заповнив багато недоліків свого попередника і додав важливу функціонального, яка до цього була реалізована лише в продуктах незалежних постачальників
Цей елемент оснащений такими ж засобами прив'язки даних, як і старий DataGrid, а тому може працювати спільно з класами Array, DataTable, DataView або DataSet або компонентами, що реалізують інтерфейс IListSource або IList. Елемент управління DataGridView забезпечує можливості різноманітного представлення одних і тих же даних.
Для того щоб відобразити дані з масиву потрібно створити масив, наповнити його деякими даними і встановити властивістьDataSource елемента керування DataGridView. Ось приклад коду:
string[] stuff = new string[] {"One", "Two", "Three"};
dataGridView.DataSource = stuff;
Елемент керування DataGridView може відображати дані в трьох різних режимах: у зв'язаному, незв'язаному і віртуальному. При виборі прийнятного методу слід виходити з конкретних потреб.
Незв'язаний режим підходить для відображення відносно невеликих обсягів даних, керованих програмним чином. Елемент керування DataGridView не приєднується безпосередньо до джерела даних в незв'язаному режимі. Натомість елемент управління необхідно заповнити самостійно, що зазвичай робиться за допомогоюметоду DataGridViewRowCollection.Add. Незв'язаний режим може виявитися особливо корисним для статичних даних,призначених тільки для читання, або коли для взаємодії з зовнішньому сховищем даних потрібно власний код.
Зв'язаний режим підходить для управління даними за допомогою автоматичної взаємодії зі сховищем даних. Елемент керування DataGridView можна приєднати безпосередньо до його джерела даних за допомогою настроювання властивості DataSource. Коли елемент керування прив'язаний до даних, рядки з даними передаються і приймаються без необхідності явного управління з боку користувача.
Віртуальний режим дозволить реалізувати власні операцій з управління даними. Цей режим необхідний для збереження значень незв'язаних стовпців у зв'язаному режимі при сортуванні елемента управління по зв'язаних стовпцях. Однак віртуальний режим в більшості випадків використовується для оптимізації продуктивності при взаємодії з великими обсягами даних.
DataTable table = new DataTable();
UseDB uDB = new UseDB(conString);
uDB.OpenCon();
table = uDB.AllBooks();
dataGridView1.DataSource = table;
Елемент керування DataGridView приєднується до керованого кешу, і код управляє відправкою та отриманням рядків даних. Щоб підтримувати невеликий обсяг пам'яті, розмір кеша повинен відповідати кількості відображуваних рядків. Коли користувач прокручує на екрані нові рядки, код запитує нові дані з кешу і може очистити пам'ять від старих даних.
Є два способи форматування в DataGridView:
За допомогою події DataGridView.CellFormatting, що змінює спосіб відображення в залежності від їх стовпців і значень. Подія DataGridViewCellFormattingEventArgs, передане обробникові властивість Value яке спочатку містить значення клітинки. Зазвичай це значення автоматично
перетвориться до типу відображення.
Якщо елемент керування DataGridView налаштований на автоматичну генераціюсвоїх стовпців з джерела даних, визначені стовпці можна знищити. Це можна зробити, викликавши метод Remove в колекції Columns. Крім того, стовпці можна приховати, присвоївши властивості Visible значення false. Цей спосіб допомагає, коли за певних умов потрібно відобразити приховані стовпці або коли необхідний доступ до даних у стовпцях без їх відображення.
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = customersDataSet;
dataGridView1.Columns.Remove("Fax");
dataGridView1.Columns["CustomerID"].Visible = false;
Порядок відображення стовпців можна змінити за допомогою властивості DisplayIndex классу DataGridViewColumn.
customersDataGridView.Columns["CustomerID"].Visible = false;
customersDataGridView.Columns["ContactName"].DisplayIndex = 0;
customersDataGridView.Columns["ContactTitle"].DisplayIndex = 1;
customersDataGridView.Columns["City"].DisplayIndex = 2;
customersDataGridView.Columns["Country"].DisplayIndex = 3;
customersDataGridView.Columns["CompanyName"].DisplayIndex = 4;
Дані, які відображаються в елементі керування DataGridView зазвичай беруться з будь-якого джерела даних, однак може знадобитися відобразити стовпець, для заповнення якого не використовується джерело даних. Такий стовпець називається непов'язаним. Незв'язані стовпці можуть мати різні форми.
DataGridViewButtonColumn buttonColumn =
new DataGridViewButtonColumn();
buttonColumn.Name = "Details";
buttonColumn.HeaderText = "Details";
buttonColumn.Text = "View Details";
//Використання властивості Текст для тексту кнопки для всіх стовпців buttonColumn.UseColumnTextForButtonValue = true;
// додати кнопку в колонку
dataGridView1.Columns.Insert(0, buttonColumn);}
Хід роботи
Завдання. Спроектувати та розробити програму на основі MDI інтерфейсів з використанням елементів керування TreeView, та DataGridView. Програма має включати пошук по вибірці, та впорядкування вікон.
Варіант 5
5
Музичний альбом
Id, виконавець, назва альбому, жанр, кількість пісень, тривалість
Код програми:
Клас Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Form1 : Form {
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
public Form1() {
InitializeComponent(); }
//Процедура викликається при запуску програми
private void вихідToolStripMenuItem_Click(object sender, EventArgs e) {
this.Close(); }
private void пошукПоIdToolStripMenuItem_Click(object sender, EventArgs e) {
SearchbyID sbID = new SearchbyID();
sbID.MdiParent = this;
sbID.Show(); }
private void пошукПоВиробникуToolStripMenuItem_Click(object sender, EventArgs e)
{
Searchbyartist sbbr = new Searchbyartist();
sbbr.MdiParent = this;
sbbr.Show(); }
private void пошукЗаПлКондиціонуванняToolStripMenuItem_Click(object sender, EventArgs e) {
Searchbyname sbsq = new Searchbyname();
sbsq.MdiParent = this; sbsq.Show(); }
private void пошукЗаПлОбігрівуToolStripMenuItem_Click(object sender, EventArgs e)
{
Searchbytitle sbgr = new Searchbytitle();
sbgr.MdiParent = this;
sbgr.Show(); }
private void пошукЗаПлОхолодженняToolStripMenuItem_Click(object sender, EventArgs e)
{ Searchbykilk sbhd = new Searchbykilk();
sbhd.MdiParent = this;
sbhd.Show(); }
private void пошукЗаКольоромToolStripMenuItem_Click(object sender, EventArgs e) {
Searchbydur sbco = new Searchbydur();
sbco.MdiParent = this;
sbco.Show(); }
private void відобразитиToolStripMenuItem_Click(object sender, EventArgs e) {
Viewmusa vCond = new Viewmusa();
vCond.MdiParent = this;
//використовуємо Ado.net клас для того що б взнати кількість записів
useDB uDB = new useDB(conString);
uDB.OpenCon(); //Підєднання до БД
//Міняємо назву дочірньої MDI-форми яка відображає всі записи в БД
vCond.Text = "В БД " + uDB.Cout().ToString() + " записів!";
vCond.Show();
uDB.CloseCon(); // Відєднання від БД }
private void додатиToolStripMenuItem_Click(object sender, EventArgs e) {
Insertmusa iCond = new Insertmusa();
iCond.MdiParent = this;
iCond.Show(); }
private void знищитиToolStripMenuItem_Click(object sender, EventArgs e) {
Deletemusa dCond = new Deletemusa();
dCond.MdiParent = this;
dCond.Show(); }
private void Form1_Load(object sender, EventArgs e) {
IsMdiContainer = true;
//задає довжину і ширину батьківської MDI-форми
this.Width = 800;
this.Height = 600; // StartPosition = CenterToScreen; } }}
Клас viewmusa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Viewmusa : Form {
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
public Viewmusa() {
InitializeComponent(); }
private void ViewCond_Load(object sender, EventArgs e) {
// String str = "";
DataTable table = new DataTable();
DataTable tableGenre = new DataTable(); // this.textBox1.Clear();
useDB uDB = new useDB(conString); uDB.OpenCon();
table = uDB.Allmus(); dataGridView1.DataSource = table;
tableGenre = uDB.GetGenre();
treeView1.BeginUpdate();
treeView1.Nodes.Add("Музичний альбом");
for (int i = 0; i < tableGenre.Rows.Count; i++) {
DataRow row = tableGenre.Rows[i];
treeView1.Nodes[0].Nodes.Add(row["title"].ToString()); }
treeView1.EndUpdate();
dataGridView1.Columns[0].HeaderText = "№";
dataGridView1.Columns[1].HeaderText = "Виконавець";
dataGridView1.Columns[2].HeaderText = "Назва альбому";
dataGridView1.Columns[3].HeaderText = "Жанр";
dataGridView1.Columns[4].HeaderText = "К-сть пісень";
dataGridView1.Columns[5].HeaderText = "Тривалість";
uDB.CloseCon(); }
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
DataTable table = new DataTable();
useDB uDB = new useDB(conString);
if (e.Action == TreeViewAction.ByMouse) {
uDB.OpenCon();
if (e.Node.Text == "Музичний альбом") {
table = uDB.Allmus();
dataGridView1.DataSource = table; } else {
table = uDB.Searchbytitle(e.Node.Text);
dataGridView1.DataSource = table; } } uDB.CloseCon(); }
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { int id;
DataTable table = new DataTable();
useDB uDB = new useDB(conString);
uDB.OpenCon();
MessageBox.Show("Column:" + e.ColumnIndex + " Row:" + e.RowIndex);
id = Convert.ToInt16(dataGridView1[0, e.RowIndex].Value);
table = uDB.SearchbyID(id);
MessageBox.Show(table.Rows[0]["id"].ToString() + table.Rows[0]["artist"].ToString()); } }}
Клас Insertmusa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Insertmusa : Form {
public Insertmusa() {
InitializeComponent(); }
//Викликається коли користувач нажме на кнопку очистити
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
private void button2_Click(object sender, EventArgs e) {
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear(); }
private void button1_Click(object sender, EventArgs e) {
useDB uDB = new useDB(conString);
musa myCond = new musa();
int row;
myCond.artist = textBox1.Text;
myCond.name = textBox2.Text;
myCond.title = textBox3.Text;
myCond.kilk = Convert.ToInt16(textBox4.Text);
myCond.dur = Convert.ToInt16(textBox5.Text);
uDB.OpenCon();
row = uDB.Insertmusa(myCond);
if (row != 0) MessageBox.Show("Запит було добавлено!");
else MessageBox.Show("Запит не було добавлено!");
uDB.CloseCon(); } }}
Клас Deletemusa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Deletemusa : Form {
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
public Deletemusa() {
InitializeComponent(); }
//Викликається коли користувач нажме на кнопку очистити
private void button1_Click(object sender, EventArgs e) {
useDB uDB = new useDB(conString);
int id;
uDB.OpenCon();
id = Convert.ToInt16(textBox1.Text);
uDB.Deletemusa(id); }
private void button2_Click(object sender, EventArgs e) {
textBox1.Clear(); }
private void textBox1_MouseClick(object sender, MouseEventArgs e) {
textBox1.Clear(); }}
Клас SearchbyID.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class SearchbyID : Form {
public SearchbyID() {
InitializeComponent(); }
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
private void button1_Click(object sender, EventArgs e) {
useDB uDB = new useDB(conString); string str = "";
int id = Convert.ToInt16(textBox1.Text); uDB.OpenCon();
DataTable table = uDB.SearchbyID(id);
dataGridView1.DataSource = table;
uDB.CloseCon(); } }}
Клас Searchbyartist.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Searchbyartist : Form {
public Searchbyartist() {
InitializeComponent(); }
//Стрічка підєднання до БД Access
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
private void button1_Click(object sender, EventArgs e) {
useDB uDB = new useDB(conString);
string str = "";
string artist = textBox1.Text;
uDB.OpenCon();
DataTable table = uDB.Searchbyartist(artist);
dataGridView1.DataSource = table;
uDB.CloseCon(); } }}
Клас Searchbyname.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Searchbyname : Form {
public Searchbyname() {
InitializeComponent(); }
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
private void button1_Click(object sender, EventArgs e) {
useDB uDB = new useDB(conString);
string str = "";
string name = textBox1.Text;
uDB.OpenCon();
DataTable table = uDB.Searchbyname(name);
dataGridView1.DataSource = table;
uDB.CloseCon(); } }}
КласSearchbytitle.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Searchbytitle : Form {
public Searchbytitle() {
InitializeComponent(); }
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
private void button1_Click(object sender, EventArgs e) {
useDB uDB = new useDB(conString);
string str = "";
string title = textBox1.Text;
uDB.OpenCon();
DataTable table = uDB.Searchbytitle(title);
dataGridView1.DataSource = table;
uDB.CloseCon(); }}}
Клас Searchbykilk.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Searchbykilk : Form {
public Searchbykilk() {
InitializeComponent(); }
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
private void button1_Click(object sender, EventArgs e) {
useDB uDB = new useDB(conString);
string str = "";
int kilk = Convert.ToInt16(textBox1.Text);
uDB.OpenCon();
DataTable table = uDB.Searchbykilk(kilk);
dataGridView1.DataSource = table;
uDB.CloseCon(); }}}
Клас Search by dur.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba2{
public partial class Searchbydur : Form {
public Searchbydur() {
InitializeComponent(); }
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
private void button1_Click(object sender, EventArgs e) {
useDB uDB = new useDB(conString);
string str = "";
int dur = Convert.ToInt16(textBox1.Text);
uDB.OpenCon();
DataTable table = uDB.Searchbydur(dur);
dataGridView1.DataSource = table;
uDB.CloseCon(); }}}
Клас useDB.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;
using System.Data.Common;
namespace laba2{
class useDB {
OleDbConnection conn;
DataSet ds = new DataSet();
DbCommand comm;
public useDB(string conString) {
conn = new OleDbConnection(conString); }
//методпідєднаннядоБД
public void OpenCon() {
conn.Open(); }
//Метод визначеннякількостізаписів в БД
public int Cout() {
int count;
comm = conn.CreateCommand();
comm.CommandText = "Select count(*) from mus";
count = (int)comm.ExecuteScalar(); return count; }
//Метод якийвибираєвсіелементи з БД
public DataTable Allmus() {
DbDataReader dr;
DataTable temp = new DataTable();
comm = conn.CreateCommand();
comm.CommandText = "Select * from mus";
dr = comm.ExecuteReader();
temp.Load(dr); return temp; }
//метод пошукуелементів по ІД
public DataTable SearchbyID(int id) {
DbDataReader dr;
DataTable temp = new DataTable();
comm = conn.CreateCommand();
comm.CommandText = "Select * from mus where id=" + id;
dr = comm.ExecuteReader();
temp.Load(dr); return temp; }
public DataTable Searchbyartist(String artist) {
DbDataReader dr;
DataTable temp = new DataTable();
comm = conn.CreateCommand();
comm.CommandText = "Select * from mus where artist like '" + artist + "%'";
dr = comm.ExecuteReader();
temp.Load(dr); return temp; }
public DataTable Searchbyname(String name) {
DbDataReader dr;
DataTable temp = new DataTable();
comm = conn.CreateCommand();
comm.CommandText = "Select * from mus where name like '" + name + "%'";
dr = comm.ExecuteReader();
temp.Load(dr); return temp; }
public DataTable Searchbytitle(String title) {
DbDataReader dr;
DataTable temp = new DataTable();
comm = conn.CreateCommand();
comm.CommandText = "Select * from mus where title like '" + title + "%'";
dr = comm.ExecuteReader();
temp.Load(dr); return temp; }
public DataTable Searchbykilk(int kilk) {
DbDataReader dr;
DataTable temp = new DataTable();
comm = conn.CreateCommand();
comm.CommandText = "Select * from mus where kilk=" + kilk;
dr = comm.ExecuteReader();
temp.Load(dr); return temp; }
public DataTable Searchbydur(int dur) {
DbDataReader dr;
DataTable temp = new DataTable();
comm = conn.CreateCommand();
comm.CommandText = "Select * from mus where dur=" + dur;
dr = comm.ExecuteReader();
temp.Load(dr); return temp; }
public int Insertmusa(musa tempmusa) {
comm = conn.CreateCommand();
//INSERT IN TO DATABASE
comm.CommandText = "INSERT INTO mus (artist, name, title, kilk, dur)VALUES ('" + tempmusa.artist + "','" + tempmusa.name + "','" + tempmusa.title + "'," + tempmusa.kilk + "," + tempmusa.dur + ");";
int rows = comm.ExecuteNonQuery(); return rows; }
//методзнищенняелементупоІД
public int Deletemusa(int id) {
comm = conn.CreateCommand();
//Delete IN TO DATABASE
comm.CommandText = "DELETE FROM mus WHERE id=" + id;
int rows = comm.ExecuteNonQuery(); return rows; }
public DataTable GetGenre() {
DbDataReader dr;
DataTable temp = new DataTable();
comm = conn.CreateCommand();
comm.CommandText = "Select DISTINCT title from mus";
dr = comm.ExecuteReader();
temp.Load(dr); return temp; }
//методВідєднаннявідБД
public void CloseCon() {
conn.Close(); } }}
Клас Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace laba2{
static class Program {
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); } }}
UML-діаграма
Результат виконання програми:
Висновок: засвоїти методику та виробив практичні навички роботи та створення Windows форм за допомогою Visual C# 2010.