МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
ТЕХНІЧНИЙ КОЛЕДЖ НАЦІОНАЛЬНОГО УНІВЕРСИТЕТУ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
КАФЕДРА ІНФОРМАЦІЙНИХ
ТЕХНОЛОГІЙ ТА
КОМП’ЮТЕРНОЇ ТЕХНІКИ
Лабораторна робота №4
з Людино-машинний інтерфейс
на тему:
“ Проектування програм з використанням діалогових вікон принтера”
м. Львів – 2011
Мета: Засвоїти методику та виробити практичні навички у проектуванні та створенні програм з використанням ділових вікон принтера Visual C# 2010.
Теоретичні відомості.
Windows надає кілька основних діалогових вікон, що дозволяють забезпечити однаковість інтерфейсу користувача в додатках Windows. Класи PageSetupDialog, PrintPreviewDialog і PrintDialog відображають діалогові вікна, що дозволяють користувачеві керувати параметрами друку документів.
При друці формується одна або кілька сторінок, за які відповідає об'єкт PrintDocument. Елементи управління PageSetupDialog, PrintPreviewDialog і PrintDialog є діалогові вікна параметрів сторінок, перегляду та друку.
Властивості Document елементів управління PageSetupDialog і PrintPreviewDialog встановлюємо об’єкт/елемент PrintDocument .Тим самим ми пов'язуємо об'єкт printDocument за формування сторінок діалоговими вікнами.
pageSetupDialog1.Document = printDocument1;
printPreviewDialog1.Document = printDocument1;
printDialog1.Document = printDocument1;
Для роботи з друком в бібліотеці. NET Framework застосовується классD ystem.Drawing. Printing, тому його потрібно підключити на самому початку роботи:
using System.Drawing.Printing;
У класі форми потрібно оголосити допоміжні змінні змінні:
/ / Змінна для зберігання тексту для друку.
string stringPrintText;
/ / Змінна, яка визначає номер сторінки, з якої потрібно почати друк
int StartPage;
/ / Змінна, яка визначає кількість сторінок для друку:
int NumPages;
/ / Змінна, яка визначає номер поточної сторінки:
int PageNumber;
Елемент PageSetupDialog
Дозволяє користувачам змінювати параметри друку для сторінки, включаючи поля та тип паперу.
Головна властивість Document. Отримує або задає значення, що вказує об'єкт PrintDocument, з якого виходять параметри сторінки.
Метод ShowDialog() – показує діалог.
//Показываем диалог
pageSetupDialog1.ShowDialog();
Елемент PrintPreviewDialog
Являє собою форму ділового вікна для попереднього перегляду.
Головна властивість Document. Отримує або задає значення, що вказує об'єкт PrintDocument, з якого виходять параметри сторінки.
Метод ShowDialog() – показує діалог.
//ініціалізуємо змінні
printDocument1.DocumentName = Text;
stringPrintText =”Текст”;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage;
PageNumber = 1;
//Показываем діалог
printPreviewDialog1.ShowDialog();
Елемент PrintDialog
Являє собою стандартний діалогове вікно друку документу.
Головні властивості:
AllowSelection - Дозвіл на друк виділеного фрагмента документа.
AllowSomePages - Дозвіл на друк кількох сторінок.
PrintDocument - Зв'язування з об'єктом типу PrintDocument.
Код для друку за допомогою PrintDialog
printDialog1.AllowSelection = rtbText.SelectionLength >0;
if(printDialog1.ShowDialog()==DialogResult.OK) {
printDocument1.DocumentName =Text;
//Визначаємо діапазон сторінок
switch(printDialog1.PrinterSettings.PrintRange) {
//Вибираємо всі сторінки
case PrintRange.AllPages:
stringPrintText = rtbText.Text;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage; break;
//вибираємо виділену область
case PrintRange.Selection:
stringPrintText = rtbText.SelectedText;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage; break;
//вибираємо ряд сторінок
case PrintRange.SomePages:
stringPrintText = rtbText.Text;
StartPage = printDialog1.PrinterSettings.FromPage;
NumPages = printDialog1.PrinterSettings.ToPage - StartPage+1;
break; }
PageNumber = 1;
//Викликаємо встроєний метод для початку друку
printDocument1.Print();
Елемент PrintDocument
Описує спосіб друку документу.
Основною подією, в якому практично і буде здійснюватися весь друк, буде подія PrintPage елемента printDocument:
private void printDocument1_PrintPage (object sender,System.Drawing.Printing.PrintPageEventArgs e){
}
Далі всі описувані фрагменти коду будуть стосуватися до цього обробника.
Клас Graphics, що належить простору імен System.Drawing, - один з найважливіших класів, що відповідають за малювання графіки та виведення тексту на формі. При створенні нової форми простір імен System.Drawing за замовчуванням включається в шаблон. Для формування сторінки друку створюємо екземпляр цього класу:
Graphics graph = e.Graphics;
/ / Створюємо об'єкт font, якому встановлюємо шрифт
//Font font = rtbText.Font;
Font font = new Font(this.Font, FontStyle.Bold);
/ / Отримуємо значення міжрядкового інтервалу - висоту шрифту
float HeightFont = font.GetHeight (graph);
/ / Створюємо екземпляр strfmt класу StringFormat для визначення
/ / Додаткових параметрів форматування тексту.
StringFormat stringformat = new StringFormat ();
Сторінка представляє собою прямокутний об'єкт, параметри якого слід визначити. Для цього використовується клас RectangleF (літера F вказує на використання типу даних з плаваючою точкою float):
/ / Створюємо екземлярів rectanglefFull і rectfText класу RectangleF для
/ / Визначення областей друку і тексту.
RectangleF rectanglefFull, rectfText;
/ / Створюємо змінні для підрахунку числа символів і рядків.
int NumberSymbols, NumberLines;
Розбитий на рядки текст може вийти за межі призначеної для нього області rectanglefText. Щоб цього не сталося, ми створили примірник stringformat класу StringFormat, для якого тепер встановлюємо значення Trimming:
if(rtbText.WordWrap){stringformat.Trimming=StringTrimming.Word;}else{stringformat.Trimming = StringTrimming.EllipsisCharacter;
stringformat.FormatFlags | = StringFormatFlags.NoWrap;}
/ / При друку вибраних сторінок переходимо до першої стартовій сторінці
while((PageNumber<StartPage)&&(stringPrintText.Length>0)){if (rtbText.WordWrap)
/ / Вимірюємо текстові змінні,
/ / Формують друк, і повертаємо число символів NumberSymbols/ / І число рядків NumberLines
graph.MeasureString (stringPrintText, font, rectanglefText.Size, stringformat, out NumberSymbols, outNumberLines);else NumberSymbols = SymbolsInLines (stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring (NumberSymbols);/ / Збільшуємо кількість сторінок
PageNumber + +;
/ / Якщо довжина рядка stringPrintText дорівнює нулю (немає тексту для друку),
/ / Зупиняємо друк
if(stringPrintText.Length==0){e.Cancel = true;return;}/ / Виводимо (малюємо) текст для друку - stringPrintText, використовуємо для цього шрифт font,
/ / Кисть чорного кольору - Brushes.Black, район друку - rectanglefText,
/ / Передаємо рядок додаткового форматування stringformat
graph.DrawString (stringPrintText, font, Brushes.Black, rectanglefText, stringformat);
/ / Отримуємо текст для наступної сторінки
if (rtbText.WordWrap)
graph.MeasureString (stringPrintText, font, rectanglefText.Size, stringformat, out NumberSymbols, outNumberLines);elseNumberSymbols = SymbolsInLines (stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring (NumberSymbols);
/ / Очищаємо об'єкт stringformat, використаний для формування полів.
stringformat = new StringFormat ();
/ / Додаємо висновок на кожну сторінку її номера
stringformat.Alignment = StringAlignment.Far;
graph.DrawString ("Сторінка" + PageNumber, font, Brushes.Black, rectanglefFull, stringformat);PageNumber + +;
/ / перевіряємо, чи є текст для друку і номер сторінки, заданої для друку
e.HasMorePages = (stringPrintText.Length> 0) & & (PageNumber <StartPage + NumPages);
/ / Для друку з вікна попереднього перегляду знову инициализируем змінні
if(!e.HasMorePages){StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage;
PageNumber = 1};
Хід роботи
Завдання. Спроектувати та розробити програму на основі MDI інтерфейсів з використанням діалогових вікон та елементів керування для роботи з принтерами та друком даних з БД згідно варіанту. Програма має включати пошук по вибірці, друк отриманих даних з вибірки та впорядкування вікон.
Варіант 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;
using System.Drawing.Printing;
namespace laba2{
public partial class Viewmusa : Form {
//Стрічка підєднання до БД Access
string conString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=album.accdb;Persist Security Info=False;";
string stringPrintText = "";
internal PrintPreviewControl PrintPreviewDialog1;
PrintDialog printDlg = new PrintDialog();
PrintDocument printDoc = new PrintDocument();
//Змінна ,яка визначає номер сторінки,з якої потрібно почати друк
int startPage;
//Змінна,яка визначає кількість сторінок в документі
int numPages;
//Змінна ,яка визначає номер поточної сторінки
int Pagenumber;
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;
stringPrintText = "Перелік всіх альбомів \n\n";
foreach (DataRow dataRow in table.Rows) {
stringPrintText = stringPrintText + dataRow[0].ToString() + "\n" + dataRow[1] + "\n" + dataRow[2] + "\n" + dataRow[3] + "\n" + "\n" + dataRow[4] + "\n" + dataRow[5] + "\n\n"; }
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();
pageSetupDialog1.Document = printDocument1;
printPreviewDialog1.Document = printDocument1;
printDialog1.Document = printDocument1;
printDialog1.AllowSomePages = true;
printDialog1.AllowSelection = true; }
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()); }
private void переглядСторінкиToolStripMenuItem_Click(object sender, EventArgs e)
{ //Ініціалізація змінної
printDocument1.DocumentName = Text;
startPage = 1;
numPages = printDialog1.PrinterSettings.MaximumPage;
Pagenumber = 1;
//Показуємо діалог
printPreviewDialog1.ShowDialog(); }
private void друкToolStripMenuItem1_Click(object sender, EventArgs e) {
if (printDialog1.ShowDialog() == DialogResult.OK) {
printDocument1.DocumentName = Text;
startPage = 1;
numPages = printDialog1.PrinterSettings.MaximumPage;
Pagenumber = 1;
//Викликаємо вбудований метод початку друку
printDocument1.Print(); } }
private void параметриСторінкиToolStripMenuItem_Click(object sender, EventArgs e)
{ pageSetupDialog1.ShowDialog(); }
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{ // Створюємо екземпляр graph класу Graphics
Graphics graph = e.Graphics;
// Створюємо об'єкт font, якому встановлюємо
// Шрифт елемента rtbText
Font font = new Font (this.Font, FontStyle.Bold);
// Отримуємо значення міжрядкового інтервалу - висоту шрифту Т1, 134
float HeightFont = font.GetHeight (graph);
// Створюємо екземпляр stringformat класу StringFormat для визначення
// Додаткових параметрів форматування тексту.
StringFormat stringformat = new StringFormat ();
// Створюємо екземлярів rectanglefFull і rectanglefText класу RectangleF для
// Определния областей друку і тексту. Т1, 104
RectangleF rectanglefFull, rectanglefText;
// Створюємо змінні для підрахунку числа символів і рядків.
int NumberSymbols, NumberLines;
// В якості області друку встановлюємо об'єкт rectanglefFull
if (graph.VisibleClipBounds.X <0) rectanglefFull = e.MarginBounds;
else // Визначаємо об'єкт rectanglefFull
rectanglefFull = new RectangleF ( // Встановлюємо координату X
e.MarginBounds.Left - (e.PageBounds.Width - graph.VisibleClipBounds.Width) / 2, // Встановлюємо координату Y
e.MarginBounds.Top - (e.PageBounds.Height - graph.VisibleClipBounds.Height) / 2, // Встановлюємо ширину області
e.MarginBounds.Width, // Встановлюємо висоту області
e.MarginBounds.Height);
rectanglefText = RectangleF.Inflate (rectanglefFull, 0, -2 * HeightFont);
// Визначаємо кількість рядків
int NumDisplayLines = (int) Math.Floor (rectanglefText.Height / HeightFont);
// Встановлюємо висоту області
rectanglefText.Height = NumDisplayLines * HeightFont;
stringformat.Trimming = StringTrimming.EllipsisCharacter;
// stringformat.FormatFlags l =StringFormatFlags.NoWrap;
// При друку вибраних сторінок переходимо до першої стартовій сторінці
while ((Pagenumber <startPage) && (stringPrintText.Length> 0)) {
NumberSymbols = SymbolsInLines (stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring (NumberSymbols);
// Збільшуємо кількість сторінок
Pagenumber ++; }
// Якщо довжина рядка stringPrintText дорівнює нулю (немає тексту для друку),
// Зупиняємо друк
if (stringPrintText.Length == 0) {
e.Cancel = true; return; }
// Виводимо (малюємо) текст для друку - stringPrintText, використовуємо для цього шрифт font,
// Кисть чорного кольору - Brushes.Black, район друку - rectanglefText,
// Передаємо рядок додаткового форматування stringformat
graph.DrawString (stringPrintText, font, Brushes.Black, rectanglefText, stringformat);
// Отримуємо текст для наступної сторінки
// If (rtbText.WordWrap)
// Graph.MeasureString (stringPrintText, font, rectanglefText.Size, stringformat, out NumberSymbols, out NumberLines); // Else
NumberSymbols = SymbolsInLines (stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring (NumberSymbols);
// Очищаємо об'єкт stringformat, використаний для формування полів.
stringformat = new StringFormat ();
// Додаємо висновок на кожну сторінку її номер
stringformat.Alignment = StringAlignment.Far;
graph.DrawString ("Сторінка" + Pagenumber, font, Brushes.Black, rectanglefFull, stringformat); Pagenumber ++;
// Cнова перевіряємо, чи є текст для друку і номер сторінки, заданої для друку
e.HasMorePages = (stringPrintText.Length> 0) && (Pagenumber <startPage + numPages); // Для друку з вікна попереднього перегляду знову инициализируем змінні if (! e.HasMorePages) { startPage = 1;
numPages = printDialog1.PrinterSettings.MaximumPage;
Pagenumber = 1; } }
int SymbolsInLines (string stringPrintText, int NumLines) {
int index = 0;
for (int i = 0; i <NumLines; i ++) {
index = 1 + stringPrintText.IndexOf ('\n', index);
if (index == 0)
return stringPrintText.Length; } return index; } } }
Клас 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;
using System.Drawing.Printing;
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;";
string stringPrintText = "";
internal PrintPreviewControl PrintPreviewDialog1;
PrintDialog printDlg = new PrintDialog();
PrintDocument printDoc = new PrintDocument();
//Змінна ,яка визначає номер сторінки,з якої потрібно почати друк
int startPage;
//Змінна,яка визначає кількість сторінок в документі
int numPages;
//Змінна ,яка визначає номер поточної сторінки
int Pagenumber;
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();
stringPrintText = "Перегляд за id" + "\n \n";
foreach (DataRow dataRow in table.Rows) {
stringPrintText = stringPrintText + dataRow[0].ToString() + "\n" + dataRow[1] + "\n" + dataRow[2] + "\n" + dataRow[3] + "\n" + "\n" + dataRow[4] + "\n" + dataRow[5] + "\n\n"; } }
private void перегялдСторінкиToolStripMenuItem_Click(object sender, EventArgs e) {
printDocument1.DocumentName = Text; startPage = 1;
numPages = printDialog1.PrinterSettings.MaximumPage; Pagenumber = 1;
//Показуємо діалог
printPreviewDialog1.ShowDialog(); }
private void друкToolStripMenuItem1_Click(object sender, EventArgs e) {
if (printDialog1.ShowDialog() == DialogResult.OK) {
printDocument1.DocumentName = Text;
startPage = 1;
numPages = printDialog1.PrinterSettings.MaximumPage;
Pagenumber = 1;
//Викликаємо вбудований метод початку друку
printDocument1.Print(); }}
private void параметриСторінкиToolStripMenuItem_Click(object sender, EventArgs e)
{ pageSetupDialog1.ShowDialog(); }
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{ // Створюємо екземпляр graph класу Graphics
Graphics graph = e.Graphics;
// Створюємо об'єкт font, якому встановлюємо
// Шрифт елемента rtbText
Font font = new Font(this.Font, FontStyle.Bold);
// Отримуємо значення міжрядкового інтервалу - висоту шрифту Т1, 134
float HeightFont = font.GetHeight(graph);
// Створюємо екземпляр stringformat класу StringFormat для визначення
// Додаткових параметрів форматування тексту.
StringFormat stringformat = new StringFormat();
// Створюємо екземлярів rectanglefFull і rectanglefText класу RectangleF для
// Определния областей друку і тексту. Т1, 104
RectangleF rectanglefFull, rectanglefText;
// Створюємо змінні для підрахунку числа символів і рядків.
int NumberSymbols, NumberLines;
// В якості області друку встановлюємо об'єкт rectanglefFull
if (graph.VisibleClipBounds.X < 0) rectanglefFull = e.MarginBounds; else
// Визначаємо об'єкт rectanglefFull
rectanglefFull = new RectangleF(
// Встановлюємо координату X
e.MarginBounds.Left - (e.PageBounds.Width - graph.VisibleClipBounds.Width) / 2, // Встановлюємо координату Y
e.MarginBounds.Top - (e.PageBounds.Height - graph.VisibleClipBounds.Height) / 2, // Встановлюємо ширину області
e.MarginBounds.Width, // Встановлюємо висоту області
e.MarginBounds.Height);
rectanglefText = RectangleF.Inflate(rectanglefFull, 0, -2 * HeightFont);
// Визначаємо кількість рядків
int NumDisplayLines = (int)Math.Floor(rectanglefText.Height / HeightFont);
// Встановлюємо висоту області
rectanglefText.Height = NumDisplayLines * HeightFont;
stringformat.Trimming = StringTrimming.EllipsisCharacter;
// stringformat.FormatFlags l =StringFormatFlags.NoWrap;
// При друку вибраних сторінок переходимо до першої стартовій сторінці
while ((Pagenumber < startPage) && (stringPrintText.Length > 0))
{ NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines); stringPrintText = stringPrintText.Substring(NumberSymbols);
// Збільшуємо кількість сторінок Pagenumber++; }
// Якщо довжина рядка stringPrintText дорівнює нулю (немає тексту для друку),
// Зупиняємо друк if (stringPrintText.Length == 0) {
e.Cancel = true; return; }
// Виводимо (малюємо) текст для друку - stringPrintText, використовуємо для цього шрифт font,
// Кисть чорного кольору - Brushes.Black, район друку - rectanglefText,
// Передаємо рядок додаткового форматування stringformat
graph.DrawString(stringPrintText, font, Brushes.Black, rectanglefText, stringformat); // Отримуємо текст для наступної сторінки
// If (rtbText.WordWrap)
// Graph.MeasureString (stringPrintText, font, rectanglefText.Size, stringformat, out NumberSymbols, out NumberLines); // Else
NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring(NumberSymbols);
// Очищаємо об'єкт stringformat, використаний для формування полів.
stringformat = new StringFormat(); // Додаємо висновок на кожну сторінку її номер
stringformat.Alignment = StringAlignment.Far;
graph.DrawString("Сторінка" + Pagenumber, font, Brushes.Black, rectanglefFull, stringformat); Pagenumber++;
// Cнова перевіряємо, чи є текст для друку і номер сторінки, заданої для друку
e.HasMorePages = (stringPrintText.Length > 0) && (Pagenumber < startPage + numPages); // Для друку з вікна попереднього перегляду знову инициализируем змінні if (!e.HasMorePages) {
startPage = 1;
numPages = printDialog1.PrinterSettings.MaximumPage;
Pagenumber = 1; } }
int SymbolsInLines(string stringPrintText, int NumLines) {
int index = 0;
for (int i = 0; i < NumLines; i++) {
index = 1 + stringPrintText.IndexOf('\n', index);
if (index == 0)
return stringPrintText.Length; } return index; } }}
Клас 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;
using System.Drawing.Printing;
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;";
string stringPrintText = "";
internal PrintPreviewControl PrintPreviewDialog1;
PrintDialog printDlg = new PrintDialog();
PrintDocument printDoc = new PrintDocument();
//Змінна ,яка визначає номер сторінки,з якої потрібно почати друк
int startPage;
//Змінна,яка визначає кількість сторінок в документі
int numPages;
//Змінна ,яка визначає номер поточної сторінки
int Pagenumber;
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();
stringPrintText = "Перегляд за Виконавець" + "\n \n";
foreach (DataRow dataRow in table.Rows) {
stringPrintText = stringPrintText + dataRow[0].ToString() + "\n" + dataRow[1] + "\n" + dataRow[2] + "\n" + dataRow[3] + "\n" + "\n" + dataRow[4] + "\n" + dataRow[5] + "\n\n"; } }
private void переглядСторінкиToolStripMenuItem_Click(object sender, EventArgs e)
{ printDocument1.DocumentName = Text;
startPage = 1; numPages = printDialog1.PrinterSettings.MaximumPage;
Pagenumber = 1; //Показуємо діалог printPreviewDialog1.ShowDialog(); }
private void параметриСторінкиToolStripMenuItem_Click(object sender, EventArgs e)
{ pageSetupDialog1.ShowDialog(); }
private void друкToolStripMenuItem1_Click(object sender, EventArgs e)
{ if (printDialog1.ShowDialog() == DialogResult.OK) {
printDocument1.DocumentName = Text;
startPage = 1;
numPages = printDialog1.PrinterSettings.MaximumPage;
Pagenumber = 1;
//Викликаємо вбудований метод початку друку
printDocument1.Print(); } }
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) {
// Створюємо екземпляр graph класу Graphics
Graphics graph = e.Graphics;
// Створюємо об'єкт font, якому встановлюємо
// Шрифт елемента rtbText
Font font = new Font(this.Font, FontStyle.Bold);
// Отримуємо значення міжрядкового інтервалу - висоту шрифту Т1, 134
float HeightFont = font.GetHeight(graph);
// Створюємо екземпляр stringformat класу StringFormat для визначення
// Додаткових параметрів форматування тексту.
StringFormat stringformat = new StringFormat();
// Створюємо екземлярів rectanglefFull і rectanglefText класу RectangleF для
// Определния областей друку і тексту. Т1, 104
RectangleF rectanglefFull