csharp examples

71
Некоторые полезные классы из пространства имен System.Windows.Forms Ниже приведены примеры классов элементов управления, которые можно размещать на формах. Label (Метка) Button (Кнопка) ListBox (Список) CheckBox (Флажок) RadioButton (Переключатель) MessageBox (Окно сообщений) Menu (Меню) TabControl (Управление вкладками) Toolbar (Панель инструментов) TreeView (Дерево) DataGrid (Сетка данных) PictureBox (Изображение) RichTextBox (Текстовое поле с поддержкой формата RTF) Пример программы 7 Обратите внимание, что для того чтобы использовать элементы управления PictureBox и DataGridView особым образом, потребуются пространства имен System.Drawing, System.Data и System.Xml. Код про гра ммы 7 1

Upload: dinutsa-cibotari

Post on 28-Nov-2014

206 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: CSharp Examples

Некоторые полезные классы из пространства имен System.Windows.Forms

Ниже приведены примеры классов элементов управления, которые можно размещать на формах.

Label (Метка) Button (Кнопка)

ListBox (Список)

CheckBox (Флажок)

RadioButton (Переключатель)

MessageBox (Окно сообщений)

Menu (Меню)

TabControl (Управление вкладками)

Toolbar (Панель инструментов)

TreeView (Дерево)

DataGrid (Сетка данных)

PictureBox (Изображение)

RichTextBox (Текстовое поле с поддержкой формата RTF)

Пример программы 7

Обратите внимание, что для того чтобы использовать элементы управления PictureBox и DataGridView особым образом, потребуются пространства имен System.Drawing, System.Data и System.Xml.

Код программы 7

using System;

using System.Windows.Forms;

1

Page 2: CSharp Examples

using System.Drawing;

using System.Data;

using System.Xml;

class FormWithManyControls :

Form

{

TreeView treeView1;

Panel panel1;

CheckBox checkBox1, checkBox2;

RadioButton radiobutton1,

radioButton2;

ListBox listBox1;

//

Метод-конструктор нашего класса

public FormWithManyControls()

{

//

Указываем размеры и заголовок

окна

this.Text = "A form dealing with

many types of controls";

this.Width = 700;

this.Height = 500;

//

Добавляем элемент TreeView в

качестве своеобразного меню

treeView1 = new TreeView();

2

Page 3: CSharp Examples

treeView1.BackColor =

Color.BurlyWood;

treeView1.Dock = DockStyle.Left;

treeView1.AfterSelect +=

new

System.Windows.Forms.TreeViewEve

ntHandler(treeView1_AfterSelect)

;

TreeNode tn = new

TreeNode("Элементы");

tn.Expand();

tn.Nodes.Add(new

TreeNode("[Очистить]"));

tn.Nodes.Add(new

TreeNode("Label"));

tn.Nodes.Add(new

TreeNode("Button"));

tn.Nodes.Add(new

TreeNode("CheckBox"));

tn.Nodes.Add(new

TreeNode("RadioButton"));

tn.Nodes.Add(new

TreeNode("ListBox"));

tn.Nodes.Add(new

TreeNode("TextBox"));

tn.Nodes.Add(new

TreeNode("TabControl"));

tn.Nodes.Add(new

TreeNode("DataGridView"));

tn.Nodes.Add(new

TreeNode("MainMenu"));

3

Page 4: CSharp Examples

tn.Nodes.Add(new

TreeNode("ToolBar"));

tn.Nodes.Add(new

TreeNode("PictureBox"));

tn.Nodes.Add(new

TreeNode("RichTextBox"));

treeView1.Nodes.Add(tn);

this.Controls.Add(treeView1);

//

Добавляем панель для размещения

остальных элементов управления

panel1 = new Panel();

panel1.Dock = DockStyle.Right;

panel1.BorderStyle =

BorderStyle.Fixed3D;

panel1.Width = this.Width -

treeView1.Width;

this.Controls.Add(panel1);

}

//

Обработчик событий,

срабатывающий при выборе одного

из узлов дерева TreeView

private void

treeView1_AfterSelect

(object sender,

System.Windows.Forms.TreeViewEve

ntArgs e)

{

4

Page 5: CSharp Examples

//

Выполнение соответствующего

действия при выборе любого из

узлов

if

(e.Node.Text == "[Wipe clean]")

{

//

Удаляем с панели все элементы

управления

panel1.Controls.Clear();

}

else

if (e.Node.Text == "Button")

{

//

Добавляем на панель кнопку

Button button1 = new Button();

button1.Text = "I'm a button";

button1.Location = new

Point(150, 80);

button1.Click += new

EventHandler(button1_Click);

panel1.Controls.Add(button1);

}

else

if (e.Node.Text == "Label")

{

//

Добавляем на панель метку

Label label1 = new Label();

label1.Text =

"This is a label. Labels are

simply used " +

5

Page 6: CSharp Examples

"to

write text at a point on the

screen";

label1.Location = new Point(150,

10);

label1.Width = 400;

label1.Click += new

EventHandler(label1_Click);

panel1.Controls.Add(label1);

}

else

if (e.Node.Text == "CheckBox")

{

//

Добавляем на панель несколько

флажков

checkBox1 = new CheckBox();

checkBox1.Text = "I am sharp";

checkBox1.Location = new

Point(10, 50);

checkBox1.CheckedChanged +=

new

EventHandler(CheckBox_CheckedCha

nged);

panel1.Controls.Add(checkBox1);

checkBox2 = new CheckBox();

checkBox2.Text = "I am modest";

checkBox2.Location = new

Point(10, 70);

checkBox2.CheckedChanged +=

new

6

Page 7: CSharp Examples

EventHandler(CheckBox_CheckedCha

nged);

panel1.Controls.Add(checkBox2);

}

else

if (e.Node.Text ==

"RadioButton")

{

//

Добавляем на панель несколько

переключателей

radiobutton1 = new

RadioButton();

radiobutton1.Text = "I am

sharp";

radiobutton1.Location = new

Point(370, 210);

radiobutton1.CheckedChanged +=

new

EventHandler(RadioButton_Checked

Changed);

panel1.Controls.Add(radiobutton1

);

radioButton2 = new

RadioButton();

radioButton2.Text = "I am dim-

witted";

radioButton2.Location = new

Point(370, 230);

radiobutton1.CheckedChanged +=

new

EventHandler(RadioButton_Checked

Changed);

7

Page 8: CSharp Examples

panel1.Controls.Add(radioButton2

);

}

else

if (e.Node.Text == "ListBox")

{

//

Добавляем на панель список

listBox1 = new ListBox();

listBox1.Items.Add("Green");

listBox1.Items.Add("Beige");

listBox1.Items.Add("White");

listBox1.Location = new

Point(200, 180);

listBox1.SelectedIndexChanged +=

new

EventHandler(listBox1_SelectedIn

dexChanged);

panel1.Controls.Add(listBox1);

}

else

if (e.Node.Text == "TextBox")

{

//

Добавляем на панель текстовое

поле

TextBox TextBox1 = new

TextBox();

TextBox1.Text = "You can type

here";

TextBox1.Location = new

Point(10, 110);

8

Page 9: CSharp Examples

panel1.Controls.Add(TextBox1);

}

else

if (e.Node.Text ==

"DataGridView")

{

//

Добавляем на панель таблицу,

заполненную данными из файла xml

DataSet dataSet1 = new

DataSet("A sample DataSet");

dataSet1.ReadXml("../../data/gra

des.xml");

DataGridView dataGridView1 = new

DataGridView();

dataGridView1.Width =

(panel1.Width / 2) - 10;

dataGridView1.Height = 150;

dataGridView1.Location =

new

Point(2, panel1.Height -

dataGridView1.Height - 5);

dataGridView1.DataSource =

dataSet1;

dataGridView1.DataMember =

"subject";

panel1.Controls.Add(dataGridView

1);

}

else

if (e.Node.Text == "TabControl")

{

//

9

Page 10: CSharp Examples

Добавляем на панель элемент

управления вкладками

// и

наполняем каждую вкладку

содержимым

TabControl tabControl1 = new

TabControl();

tabControl1.Location = new

Point(10, 150);

tabControl1.Size = new Size(165,

146);

TabPage tabPage1 = new

TabPage("Robynne");

PictureBox pictureBox1 = new

PictureBox();

pictureBox1.Image = new

Bitmap("../../images/robynne.jpg

");

pictureBox1.Size = new Size(160,

120);

tabPage1.Controls.Add(pictureBox

1);

tabControl1.TabPages.Add(tabPage

1);

TabPage tabPage2 = new

TabPage("Her Dog");

PictureBox pictureBox2 = new

PictureBox();

pictureBox2.Image = new

Bitmap("../../images/chocolate.j

pg");

10

Page 11: CSharp Examples

pictureBox2.Size = new Size(160,

120);

tabPage2.Controls.Add(pictureBox

2);

tabControl1.TabPages.Add(tabPage

2);

TabPage tabPage3 = new

TabPage("Info");

tabPage3.BackColor =

Color.White;

Label label1 = new Label();

label1.Text =

"Robynne lives in Cape Town,

South Africa.\n\n" +

"She

has a dog named Chocolate, from

the planet Woof," +

"

rapidly growing into her

oversized ears.";

label1.Dock = DockStyle.Fill;

tabPage3.Controls.Add(label1);

tabControl1.TabPages.Add(tabPage

3);

panel1.Controls.Add(tabControl1)

;

}

else

if (e.Node.Text == "PictureBox")

{

//

Добавляем на панель изображение

11

Page 12: CSharp Examples

PictureBox pictureBox1 = new

PictureBox();

pictureBox1.Image = new

Bitmap("../../images/ocean.jpg")

;

pictureBox1.BorderStyle =

BorderStyle.Fixed3D;

pictureBox1.Location = new

Point(250, 25);

pictureBox1.Size = new Size(300,

130);

panel1.Controls.Add(pictureBox1)

;

}

else

if (e.Node.Text ==

"RichTextBox")

{

//

Добавляем поле для ввода текста

с форматированием

//

Загружаем в него данные из файла

XML

RichTextBox richTextBox1 = new

RichTextBox();

richTextBox1.LoadFile("../../dat

a/grades.xml",

RichTextBoxStreamType.PlainText)

;

richTextBox1.WordWrap = false;

richTextBox1.BorderStyle =

BorderStyle.Fixed3D;

richTextBox1.BackColor =

12

Page 13: CSharp Examples

Color.Beige;

richTextBox1.Size = new

Size((panel1.Width / 2) - 10,

150);

richTextBox1.Location =

new

Point((panel1.Width / 2) + 10,

panel1.Height -

richTextBox1.Height - 5);

panel1.Controls.Add(richTextBox1

);

}

else

if (e.Node.Text == "MainMenu")

{

//

Добавляем классическое «меню»

(появляется в верхней части

окна)

MainMenu mainMenu1 = new

MainMenu();

MenuItem menuItem1 = new

MenuItem("File");

menuItem1.MenuItems.Add("Exit",

new

EventHandler(mainMenu1_Exit_Sele

ct));

mainMenu1.MenuItems.Add(menuItem

1);

MenuItem menuItem2 = new

MenuItem("Background");

menuItem2.MenuItems.Add("Choose"

,

new

13

Page 14: CSharp Examples

EventHandler(mainMenu1_ColorOwn_

Select));

menuItem2.MenuItems.Add("White",

new

EventHandler(mainMenu1_ColorWhit

e_Select));

mainMenu1.MenuItems.Add(menuItem

2);

this.Menu = mainMenu1;

MessageBox.Show("A main menu has

been added at the top " +

"left of the window. Try it out

after clicking OK.");

}

else

if (e.Node.Text == "ToolBar")

{

//

Добавляем на панель элемент

"панель управления" с кнопками

быстрого вызова

ToolBar toolBar1 = new

ToolBar();

ImageList imageList1 = new

ImageList();

imageList1.Images.Add(new

Bitmap("../../images/open.gif"))

;

imageList1.Images.Add(new

Bitmap("../../images/close.gif")

);

imageList1.Images.Add(new

Bitmap("../../images/undo.gif"))

14

Page 15: CSharp Examples

;

toolBar1.ImageList = imageList1;

ToolBarButton toolBarbutton1 =

new ToolBarButton("Open");

toolBarbutton1.ImageIndex = 0;

toolBar1.Buttons.Add(toolBarbutt

on1);

ToolBarButton toolBarbutton2 =

new ToolBarButton("Close");

toolBarbutton2.ImageIndex = 1;

toolBar1.Buttons.Add(toolBarbutt

on2);

ToolBarButton toolBarButton3 =

new ToolBarButton("Huh");

toolBarButton3.ImageIndex = 3;

toolBar1.Buttons.Add(toolBarButt

on3);

toolBar1.ButtonClick +=

new

ToolBarButtonClickEventHandler(t

oolBar1_Click);

panel1.Controls.Add(toolBar1);

}

}

/*

Обработчики событий для

добавленных выше элементов

управления */

15

Page 16: CSharp Examples

//

Обработчик события,

срабатывающий при щелчке мышью

на метке

void

label1_Click(object sender,

System.EventArgs e)

{

MessageBox.Show

("Yes, labels can be clicked,

although it's not normal to do

so.");

}

//

Обработчик события,

срабатывающий при нажатии кнопки

void

button1_Click(object sender,

System.EventArgs e)

{

MessageBox.Show("Yup, you were

supposed to click me");

}

//

Обработчик события,

срабатывающий при установке или

снятии флажка

void

CheckBox_CheckedChanged(object

sender, System.EventArgs e)

{

if

(checkBox1.Checked &&

checkBox2.Checked)

{

MessageBox.Show("Good for you");

}

else

if (checkBox1.Checked)

{

16

Page 17: CSharp Examples

MessageBox.Show("It's not good

to be sharp without being

modest");

}

else

if (checkBox2.Checked)

{

MessageBox.Show("Modesty is

good. Pity you're not sharp

too.");

}

else

{

MessageBox.Show("Oh dear,

neither sharp nor modest eh?");

}

}

//

Обработчик события,

срабатывающий при нажатии

переключателя

void

RadioButton_CheckedChanged(objec

t sender, System.EventArgs e)

{

if

(radiobutton1.Checked)

{

MessageBox.Show("Glad to hear

it");

}

else

if (radioButton2.Checked)

{

MessageBox.Show("What a shame");

}

}

//

Обработчик события,

срабатывающий при выборе одного

17

Page 18: CSharp Examples

из пунктов списка

void

listBox1_SelectedIndexChanged(ob

ject sender, System.EventArgs e)

{

if

(listBox1.SelectedItem.ToString(

) == "Green")

{

treeView1.BackColor =

Color.LightSeaGreen;

}

else

if

(listBox1.SelectedItem.ToString(

) == "Beige")

{

treeView1.BackColor =

Color.Beige;

}

else

if

(listBox1.SelectedItem.ToString(

) == "White")

{

treeView1.BackColor =

Color.White;

}

}

//

Обработчик события,

срабатывающий при выборе в меню

пункта "White"

void

mainMenu1_ColorWhite_Select(obje

ct sender, System.EventArgs e)

{

treeView1.BackColor =

Color.White;

}

//

18

Page 19: CSharp Examples

Обработчик события,

срабатывающий при выборе в меню

цвета

void

mainMenu1_ColorOwn_Select(object

sender, System.EventArgs e)

{

ColorDialog colorDialog1 = new

ColorDialog();

colorDialog1.Color =

treeView1.BackColor;

colorDialog1.ShowDialog();

treeView1.BackColor =

colorDialog1.Color;

}

//

Обработчик события,

срабатывающий при выборе в меню

пункта "exit"

void

mainMenu1_Exit_Select(object

sender, System.EventArgs e)

{

if (

MessageBox.Show("Are you sure

you want to exit?",

"Exit confirmation",

MessageBoxButtons.YesNo)

==

DialogResult.Yes

)

{

this.Dispose();

}

}

//

Обработчик события,

срабатывающий при нажатии кнопки

19

Page 20: CSharp Examples

на панели инструментов

void

toolBar1_Click

(object sender,

System.Windows.Forms.ToolBarButt

onClickEventArgs e)

{

if

(e.Button.Text == "Open")

{

MessageBox.Show("This could have

opened a file, for example");

}

else

if (e.Button.Text == "Close")

{

MessageBox.Show("This could have

closed a file, for example");

}

else

if (e.Button.Text == "Huh")

{

MessageBox.Show("Huh?");

}

}

static void Main()

{

//

Запускаем новый экземпляр

приложения Windows Forms при

помощи вышеописанного класса

Application.Run(new

FormWithManyControls());

}

}

20

Page 21: CSharp Examples

Введение

Классы, объединенные в пространство имен Drawing, позволяют работать с различными изображениями. Существует два основных типа компьютерных изображений:

Точечные или растровые;

Векторные.

Растровые изображения представляют собой набор точек. Примером их могут

Векторная графика — это изображения, составленные из определенных геометрических

21

Page 22: CSharp Examples

служить фотографии и значки.

фигур: линий, окружностей, прямоугольников и т.д. Например, план дома удобно представлять в виде векторного изображения.

Для начала продемонстрируем работу с растровой графикой. На компьютере часто приходится выполнять обработку изображений, например, работать с фотографиями. В библиотеке классов .NET Framework имеется для этого немало полезных средств.

Пример программы 8

Эта программа находит изображение (в данном случае файл JPEG) на диске и отображает его на форме.

Для этого нам понадобится какой-либо элемент управления, позволяющий отображать изображения. PictureBox прекрасно подходит для этой цели.

Код программы 8

using System;

using System.Windows.Forms;

using System.Drawing;

class PictureDisplayer :

Form

{

Bitmap image1;

PictureBox pictureBox1;

// Метод-конструктор нашего

класса

22

Page 23: CSharp Examples

public PictureDisplayer()

{

// Указываем размеры и

заголовок окна

this.Text = "Picture

Displayer";

this.Size = new Size(302,

240);

// Подготавливаем поле для

размещения изображения

pictureBox1 = new

PictureBox();

pictureBox1.SizeMode =

PictureBoxSizeMode.StretchIm

age;

pictureBox1.BorderStyle =

BorderStyle.Fixed3D;

pictureBox1.ClientSize = new

Size(300, 196);

// Добавляем изображение в

элемент PictureBox

image1 = new

Bitmap(@"../../images/lama.j

pg");

pictureBox1.Image =

(Image)image1;

// Добавляем PictureBox (с

изображением) на форму

23

Page 24: CSharp Examples

this.Controls.Add(pictureBox

1);

}

static void Main()

{

// Запускаем новый экземпляр

приложения Windows Forms при

помощи вышеописанного класса

Application.Run(new

PictureDisplayer());

}

}

Пример программы 9

Следующая программа загружает фотографию с диска и после нажатия кнопки «flip» (Перевернуть) позволяет получить ее зеркальное отражение по горизонтали.

Код программы

24

Page 25: CSharp Examples

9

using System;

using System.Windows.Forms;

using System.Drawing;

class PictureFlipper : Form

{

Button button1;

Bitmap image1;

PictureBox pictureBox1;

//

Метод-конструктор нашего

класса

public PictureFlipper()

{

//

Указываем размеры и заголовок

окна

this.Text = "Picture Flipper";

this.Size = new Size(302,

240);

//

Добавляем на форму кнопку

button1 = new Button();

button1.Text = "Flip";

button1.Location = new

Point(100, 150);

button1.Click += new

25

Page 26: CSharp Examples

System.EventHandler(button1_Cl

ick);

this.Controls.Add(button1);

//

Добавляем элемент PictureBox

на форму

pictureBox1 = new

PictureBox();

pictureBox1.SizeMode =

PictureBoxSizeMode.StretchImag

e;

pictureBox1.BorderStyle =

BorderStyle.Fixed3D;

pictureBox1.ClientSize = new

Size(300, 196);

//

Добавляем изображение в

элемент PictureBox

image1 = new

Bitmap(@"../../images/elephant

s.jpg");

pictureBox1.Image =

(Image)image1;

//

Добавляем элемент PictureBox

(с изображением) на форму

this.Controls.Add(pictureBox1)

;

}

static void Main()

26

Page 27: CSharp Examples

{

//

Запускаем новый экземпляр

приложения Windows Forms при

помощи вышеописанного класса

Application.Run(new

PictureFlipper());

}

//

Обработчик события,

срабатывающий при нажатии

кнопки

void button1_Click(object

sender, EventArgs e)

{

//

Flip the image along the X

axis (horizontally)

image1.RotateFlip(RotateFlipTy

pe.RotateNoneFlipX);

//

Повторно вставляем изображение

в элемент PictureBox

pictureBox1.Image =

(Image)image1;

//

Обновляем заголовок окна

this.Text = "Picture was

flipped";

}

}

27

Page 28: CSharp Examples

Теперь перейдем к примерам работы с векторной графикой — изображениям, составленным из отдельных геометрических фигур.

Во всех этих примерах будет создаваться кнопка и обработчик событий, перехватывающий ее нажатие. Работа с графикой будет начинаться только после нажатия кнопки.

Необходимо усвоить несколько важных принципов. Они вполне логичны, но не зная их, можно испытать некоторые затруднения.

1. В обычном мире чтобы нарисовать линию, окружность, прямоугольник или иную фигуру, необходимо сначала выбрать карандаш нужного цвета и толщины.

Аналогично, для отрисовки на компьютере простейших фигур требуется предварительно создать объект Pen (Перо). Например, с помощью данного фрагмента кода создается объект Pen, рисующий зеленую линию толщиной 3 пикселя:

Pen myGreenPen = new Pen( Color.Green, 3 );

2. Для рисования фигур с заливкой потребуется нечто вроде кисти с красками.

Для создания фигур с заливкой на компьютере требуется предварительно создать объект Brush (Кисть) и выбрать цвет заливки. Имеются различные типы кисти. В следующем фрагменте кода создается объект SolidBrush (Сплошная кисть) голубого цвета:

SolidBrush myBlueBrush = new SolidBrush( Color.Blue );

Пример программы 10

В этой программе с помощью метода DrawSomeShapes рисуется линия, прямоугольник и эллипс («сплюснутая» окружность).

28

Page 29: CSharp Examples

Код программы 10

using System;

using System.Windows.Forms;

using System.Drawing;

class SimpleShapeMaker :

Form

{

// Метод-конструктор нашего

класса

public SimpleShapeMaker()

{

// Меняем цвет фона формы на

белый

this.BackColor =

Color.White;

// Добавляем на форму кнопку

и привязываем ее к

обработчику событий

Button button1 = new

Button();

button1.Text = "click me";

button1.Location = new

Point(110, 10);

button1.BackColor =

Color.SteelBlue;

29

Page 30: CSharp Examples

button1.Click += new

System.EventHandler(button1_

Click);

this.Controls.Add(button1);

}

// Обработчик события,

срабатывающий при нажатии

кнопки

void button1_Click(object o,

System.EventArgs e)

{

// Выполнение описанного

нами метода

DrawSomeShapes();

}

// Метод для отрисовки на

поверхности формы нескольких

фигур

void DrawSomeShapes()

{

// Подготовка области

рисования на форме

Graphics g =

this.CreateGraphics();

// Подготавливаем перо,

рисующее красную линию

толщиной 3 пикселя

Pen redPen = new

30

Page 31: CSharp Examples

Pen(Color.Red, 3);

// С помощью пера рисуем

прямую линию, прямоугольник

и овал

g.DrawLine(redPen, 140, 170,

140, 230);

g.DrawRectangle(redPen, 50,

60, 50, 60);

g.DrawEllipse(redPen, 150,

100, 100, 60);

// Очистка

g.Dispose();

}

static void Main()

{

// Запускаем новый экземпляр

приложения Windows Forms при

помощи вышеописанного класса

Application.Run( new

SimpleShapeMaker() );

}

}

31

Page 32: CSharp Examples

Пример программы 11

Попробуем теперь поиграть с мышкой. Работать с графикой обычно удобнее при помощи мыши, а не клавиатуры. В этом примере мы будем работать как с растровыми, так и с векторными изображениями, используя некоторые события мыши.

Постараемся освоить некоторые новые действия с графикой, а именно с точечными рисунками. Мы не станем писать об этом целый очерк, но небольшое вступление просто необходимо, чтобы понять принципы работы приведенного ниже кода.

Компьютерные программы формируют изображение на экране монитора, управляя цветом и яркостью маленьких точек, называемых пикселями.

Цвет пикселя определяется тремя цветовыми компонентами: красной (red), зеленой (green) и синей (blue) (в языках программирования часто используется сокращение RGB). Цвет и яркость пикселя управляется путем изменения интенсивности компонент RGB, обычно в пределах от 0 до 255. Например:

если red=255, green=0, blue=0, цвет пикселя будет ярко-красным;

если red=255, green=255, blue=0, цвет пикселя будет желтым.

Компьютер может отслеживать положение курсора мыши, определяемое координатами X и Y (горизонтальная и вертикальная координаты). Так, верхний левый угол экрана имеет координаты X=0 и Y=0.

Код программы 11

32

Page 33: CSharp Examples

using System;

using System.Windows.Forms;

using System.Drawing;

class FunWithTheMouse : Form

{

/

/ Объявляем объекты, к

которым будем обращаться из

разных методов

PictureBox pictureBox1;

Label label1;

Point spotClicked;

/

/ Метод-конструктор нашего

класса

public FunWithTheMouse()

{

/

/ Задаем размеры окна

this.Size = new Size(640,

480);

/

/ Загружаем фотографию в

элемент PictureBox и

добавляем его на форму

pictureBox1 = new

PictureBox();

pictureBox1.Image =

(Image)new

Bitmap(@"../../images/foal.jp

33

Page 34: CSharp Examples

g");

pictureBox1.SizeMode =

PictureBoxSizeMode.Normal;

pictureBox1.Dock =

DockStyle.Fill;

this.Controls.Add(pictureBox1

);

/

/ Добавляем метку с

инструкциями в нижнюю часть

экрана

label1 = new Label();

label1.BackColor =

Color.Wheat;

label1.Dock =

DockStyle.Bottom;

label1.Text =

"Drag rectangle with left

mouse button (draw) or

another " +

"mouse button (lighten). To

scribble, hold SHIFT and move

mouse.";

label1.TextAlign =

ContentAlignment.MiddleCenter

;

this.Controls.Add(label1);

/

/ Привязываем PictureBox к

обработчикам событий мыши

this.pictureBox1.MouseDown +=

34

Page 35: CSharp Examples

new

MouseEventHandler(MouseButton

IsDown);

this.pictureBox1.MouseUp +=

new

MouseEventHandler(MouseButton

IsUp);

this.pictureBox1.MouseMove +=

new

MouseEventHandler(TheMouseMov

ed);

}

/

/ Обработчик событий,

срабатывающий при ПЕРЕМЕЩЕНИИ

мыши

public void

TheMouseMoved(object sender,

MouseEventArgs e)

{

/

/ Если на клавиатуре нажата

клавиша SHIFT

if ((Control.ModifierKeys &

Keys.Shift) == Keys.Shift)

{

/

/ Подготовка области

рисования на изображении

System.Drawing.Graphics g =

this.pictureBox1.CreateGraphi

cs();

/

/ Используем желтое перо

System.Drawing.Pen yellowPen

= new

System.Drawing.Pen(Color.Yell

ow, 3);

35

Page 36: CSharp Examples

/

/ Рисуем окружность (эллипс,

вписанный в квадрат)

/

/ Верхний левый угол квадрата

имеет координаты X и Y

текущего положения мыши

g.DrawEllipse(yellowPen, e.X,

e.Y, 40, 40);

/

/ Очистка

g.Dispose();

}

}

/

/ Обработчик событий,

срабатывающий при НАЖАТИИ

кнопки мыши

public void

MouseButtonIsDown(object

sender, MouseEventArgs e)

{

/

/ Запоминаем точку, в которой

произошло нажатие кнопки

мыши. Когда

/

/ кнопка будет отпущена, нам

понадобятся ее координаты

spotClicked.X = e.X; //

горизонтальная координата

spotClicked.Y = e.Y; //

вертикальная координата

}

/

/ Обработчик событий,

срабатывающий при ОТЖАТИИ

кнопки мыши

36

Page 37: CSharp Examples

public void

MouseButtonIsUp(object

sender, MouseEventArgs e)

{

/

* Пользователь отпустил

кнопку мыши! */

/

/ Создаем прямоугольник (пока

он еще не виден),

ограничивающий

/

/ область изображения, с

которой пользователь будет

работать

Rectangle r = new

Rectangle();

/

/ Левый верхний угол

соответствует точке, в

которой была нажата кнопка

мыши

/

/ Мы сохранили ее координаты

с помощью описанного выше

метода

r.X = spotClicked.X;

r.Y = spotClicked.Y;

/

/ Ширина и высота

прямоугольника вычисляется

/

/ путем вычитания начальных

координат мыши (в точке

нажатия)

/

/ из текущих координат (в

точке отжатия кнопки)

37

Page 38: CSharp Examples

r.Width = e.X -

spotClicked.X;

r.Height = e.Y -

spotClicked.Y;

if (e.Button ==

MouseButtons.Left)

{

/

* Если была нажата и отпущена

левая кнопка мыши

рисуем видимый контур

прямоугольника */

/

/ Подготовка области

рисования на изображении

Graphics g =

this.pictureBox1.CreateGraphi

cs();

/

/ Рисуем красный контур

прямоугольника

Pen redPen = new

Pen(Color.Red, 2);

g.DrawRectangle(redPen, r);

}

else

{

/

/ Если была нажата другая

кнопка, вызываем более

сложный

/

/ метод, подсвечивающий

38

Page 39: CSharp Examples

область изображения

ChangeLightness(r);

}

}

/

/ Метод, увеличивающий

яркость выбранного участка

изображения

/

/ путем увеличения яркости

каждого пикселя этого участка

public void

ChangeLightness(Rectangle

rect)

{

int newRed, newGreen,

newBlue;

Color pixel;

/

/ Копируем изображение,

загруженное в PictureBox

System.Drawing.Bitmap picture

= new

Bitmap(this.pictureBox1.Image

);

/

/ Поскольку операция

увеличения яркости может

занять много времени,

/

/ необходимо предупредить об

этом пользователя, если

выбран большой участок

if ( (rect.Width>150) ||

(rect.Height>150 ) )

39

Page 40: CSharp Examples

{

DialogResult result =

MessageBox.Show

(

"The area you selected is

large and may take a long

time to lighten",

"Warning",

MessageBoxButtons.OKCancel

)

;

/

/ При нажатии кнопки Cancel

(Отмена) выходим из метода

/

/ и возвращаемся к месту его

вызова

if ( result ==

DialogResult.Cancel ) return;

}

/

* Перебираем последовательно

все пиксели данного участка

и

удваиваем значение яркости

компонент RGB пикселей */

/

/ Перебор по горизонтали

слева направо ...

for (int x = rect.X; x <

rect.X + rect.Width; x++)

{

/

/ и по вертикали сверху

вниз ...

40

Page 41: CSharp Examples

for (int y = rect.Y; y <

(rect.Y + rect.Height); y++)

{

/

/ Считываем текущий пиксель

pixel = picture.GetPixel(x,

y);

/

/ Увеличиваем яркость

цветовых компонент пикселя

newRed =

(int)Math.Round(pixel.R *

2.0, 0);

if (newRed > 255) newRed =

255;

newGreen =

(int)Math.Round(pixel.G *

2.0, 0);

if (newGreen > 255) newGreen

= 255;

newBlue =

(int)Math.Round(pixel.B *

2.0, 0);

if (newBlue > 255) newBlue =

255;

/

/ Присваиваем пикселю новые

цветовые значения

picture.SetPixel

(

x,

41

Page 42: CSharp Examples

y,

Color.FromArgb((byte)newRed,

(byte)newGreen,

(byte)newBlue)

)

;

}

}

/

/ Помещаем измененную копию

изображения в PictureBox

/

/ чтобы изменения

отобразились на экране

this.pictureBox1.Image =

picture;

}

static void Main()

{

/

/ Создаем экземпляр класса

формы

Application.Run(new

FunWithTheMouse());

}

}

42

Page 43: CSharp Examples

Введение

На практике большинство приложений должны работать с базами данных. Любой программист из крупной компании, подтвердит вам, насколько велика роль баз данных в мире вычислительных технологий. Программист, умеющий оперировать с базами данных, способен создавать самые разнообразные и действительно полезные приложения.

Возможно, у вас на компьютере уже установлена система управления базами данных, например Microsoft Access. В качестве альтернативы можно установить Microsoft SQL Server Express Edition. С его помощью можно научиться работать с базами данных SQL Server, используемыми во многих крупнейших компаниях по всему миру. SQL Server Express включен в пакет установки Visual C# Express, так что возможно вы уже установили его.

Для работы с базами данных в библиотеке .NET Framework предусмотрены классы пространства имен System.Data. База данных в корне отличается от таких объектов, как изображения или документы текстовых редакторов, которые часто называют неструктурированными. Информация в базе данных более структурирована. Обычно она содержит строки, содержащие данные одинакового типа и объединяемые в блоки, называемые таблицами. Таблица состоит из одного или нескольких столбцов , содержащих определенную информацию для каждой строки.

Строки иногда называют записями, а

43

Page 44: CSharp Examples

столбцы — полями.

Ниже представлена таблица базы данных, содержащая информацию о планетах. Она имеет следующие столбцы: PlanetName (название планеты), DistanceFromSun (расстояние до Солнца) и Inhabitants (обитатели).

PLANET

PlanetName DistanceFromSun Inhabitants

Mercury 57909 Mercurians

Venus 108200 Venusians

Earth 149600 Earthlings

Mars 227940 Martians

Jupiter 778400 Jupiterians

Znock 7208100 Znockers

Saturn 1423600 Saturnians

Uranus 2867000 Uranians

Neptune 4488400 Neptunians

Pluto 5909600 Plutonians

Из приведенной таблицы видно, например, что Венера находится на расстоянии 108 200 тысяч километров от Солнца, а существа, ее населяющие, именуются венерианцами.

Вот еще одна таблица, в которой содержатся сведения о ежегодной численности обитателей разных планет.

Это совершенно секретная информация, нигде ранее не обнародованная. Она была получена с инопланетного звездолета, потерпевшего крушение в самой глубине пустыни Гоби. Это большая честь — иметь возможность ознакомиться с ней. Очевидно, представители инопланетной цивилизации тоже используют базы данных SQL Server Express, что и дало нам возможность привести здесь эти сведения в качестве примера.

POPULATION

44

Page 45: CSharp Examples

PlanetName Year Population

Mercury 2000 40000

Venus 2000 25

Earth 2000 6000000000

Mars 2000 325000

Jupiter 2000 8426300200

Znock 2000 550000

Saturn 2000 1000000

Uranus 2000 753425370

Neptune 2000 <NULL>

Pluto 2000 <NULL>

Mercury 2001 35000

Venus 2001 3

Earth 2001 6500000000

Mars 2001 326000

Jupiter 2001 8426300202

Znock 2001 8700

Saturn 2001 75000

Uranus 2001 844360002

Neptune 2001 <NULL>

Pluto 2001 <NULL>

Вы можете видеть, что в таблице есть две строки, касающиеся Венеры. Обратите внимание, что в 2000 году на Венере обитало 25 венерианцев, а в 2001 году их численность сократилось до трех. Вероятно, это произошло в результате извержений вулканов.

45

Page 46: CSharp Examples

Не следует путать базы данных с электронными таблицами. Хотя способ представления данных в электронных таблицах внешне похож на тот, что использовался в приведенных выше примерах, обработка данных происходит в них совершенно иначе.

Язык SQL

Существует множество разнообразных систем управления базами данных: Microsoft Access, Oracle, DB2, Microsoft SQL Server, Informix, mySQL, и это далеко не полный список. Итак, как же происходит обращение к базе данных из программы на языке C#? Как «объяснить» базе данных, что нам требуется?

Самым простым решением является включение в код C# фрагмента на «языке базы данных», с помощью которого и осуществляется запрос к базе данных на получение нужных столбцов и строк.

(По правде говоря, существует еще промежуточный уровень, называемый ADO.NET, но мы не станем сейчас заострять на нем внимание)

Много лет назад специалисты по базам данных собрались и договорились об использовании «единого языка баз данных», который понимали бы большинство существующих баз данных. Этот язык называется SQL (от англ. Structured Query Language — язык структурированных запросов). Не следует путать язык SQL c системой управления базами данных SQL Server, разработанной корпорацией Microsoft. Язык SQL поддерживается СУБД от самых разных производителей.

Прежде чем начинать разговор о работе с базами данных с использованием C#, давайте познакомимся с основами языка SQL. Ниже приведены примеры операторов на языке SQL и описывается результат их выполнения.

Три основных команды SQL это: SELECT для просмотра некоторых данных, INSERT для добавления новых данных и UPDATE для изменения существующих данных. Приведем примеры каждой из них.

46

Page 47: CSharp Examples

Как правило, оператор SELECT записывается следующим образом:

SELECT <имена извлекаемых столбцов>

FROM <соответствующие таблицы базы данных>

WHERE <условие, которое должно выполняться>

SELECT * FROM PLANET

Он возвращает все строки и все столбцы из базы данных PLANET (звездочка * означает выбор всех столбцов таблицы).

PlanetName

 DistanceFromSun  

Inhabitants

Mercury 57909 Mercurians

Venus 108200 Venusians

Earth 149600 Earthlings

Mars 227940 Martians

Jupiter 778400 Jupiterians

Znock 7208100 Znockers

Saturn 1423600 Saturnians

Uranus 2867000 Uranians

Neptune 4488400 Neptunians

Pluto 5909600 Plutonians

SELECT PlanetName, Inhabitants FROM PLANET

Этот запрос возвращает столбцы «PlanetName» и «Inhabitants» со всеми строками из таблицы PLANET.

47

Page 48: CSharp Examples

PlanetName Inhabitants

Mercury Mercurians

Venus Venusians

Earth Earthlings

Mars Martians

Jupiter Jupiterians

Znock Znockers

Saturn Saturnians

Uranus Uranians

Neptune Neptunians

Pluto Plutonians

SELECT PlanetName, Inhabitants FROM PLANET WHERE PlanetName='Venus'

Такой запрос возвращает столбцы «PlanetName» и «Inhabitants» из таблицы PLANET. В результат его выполнения будут включены только те строки, которые содержат значение «Venus» в столбце PlanetName.

PlanetName Inhabitants

Venus Venusians

SELECT PlanetName, Population FROM POPULATION WHERE Population<100000

Данный запрос возвращает строки столбцов PlanetName и Population из таблицы POPULATION, для которых значение столбца Population меньше 100000.

48

Page 49: CSharp Examples

PlanetName Population

Mercury 40000

Venus 25

Neptune <NULL>

Pluto <NULL>

Mercury 35000

Venus 3

Saturn 75000

Neptune <NULL>

Pluto <NULL>

Как правило, оператор INSERT записывается следующим образом:

INSERT INTO <таблица базы данных, к которой добавляются строки>

(<столбцы, в которые будут добавляться значения>)

INSERT INTO PLANET (PlanetName, DistanceFromSun, Inhabitants) VALUES ('Fluff', 23500000, 'Fluffies')

Оператор INSERT добавляет в таблицу PLANET новую строку. Он не возвращает какого-либо результата в программу, но ради наглядности мы покажем, какой вид примет таблица после его выполнения.

PLANET    

PlanetName DistanceFromSun Inhabitants

Mercury 57909 Mercurians

Venus 108200 Venusians

Earth 149600 Earthlings

Mars 227940 Martians

49

Page 50: CSharp Examples

Jupiter 778400 Jupiterians

Znock 7208100 Znockers

Saturn 1423600 Saturnians

Uranus 2867000 Uranians

Neptune 4488400 Neptunians

Pluto 5909600 Plutonians

Fluff 23500000 Fluffies

Как правило, оператор UPDATE записывается следующим образом:

UPDATE < таблица базы данных, в которую вносятся изменения>

SET <столбцы, в которые необходимо внести изменения> = <новые значения>

UPDATE PLANET SET PlanetName='Stuff', Inhabitants='Stuffies' WHERE PlanetName='Fluff'

Оператор изменяет некоторые значения в строке, в которой столбец PlanetName имеет значение «Fluff» и тоже не возвращает какой-либо результат в программу. Далее показано, какой вид примет таблица после его выполнения.

PLANET    

PlanetName DistanceFromSun   Inhabitants

Mercury 57909 Mercurians

Venus 108200 Venusians

Earth 149600 Earthlings

Mars 227940 Martians

Jupiter 778400 Jupiterians

Znock 7208100 Znockers

Saturn 1423600 Saturnians

50

Page 51: CSharp Examples

Uranus 2867000 Uranians

Neptune 4488400 Neptunians

Pluto 5909600 Plutonians

Stuff 23500000 Stuffies

Связи и объединение

Если вы обратите внимание, то заметите, что между таблицами PLANET и POPULATION существует связь. В обеих таблицах есть столбец с именем «PlanetName». Мы говорим, что эти таблицы связаны по столбцу «PlanetName». Благодаря этой связи можно собрать всю информацию об определенной планете.

Например, можно выбрать из обеих таблиц все строки, касающиеся Венеры ...

PLANET

PlanetName

 DistanceFromSun  

Inhabitants

Venus

108200

Venusians

POPULATION

PlanetName

Year

Population

Venus

2000

25

Venu

20

3

51

Page 52: CSharp Examples

s 01

и объединить их в одну большую таблицу ...

SELECT * FROM PLANET INNER JOIN POPULATION ON PLANET.PlanetName=POPULATION.planetName WHERE PlanetName='Venus'

PLANETS_AND_POPULATION

PlanetName

 DistanceFromSun  

Inhabitants

PlanetName

Year

Population

Venus 108200

Venusians

Venus

2000

25

Venus 108200

Venusi

Venus

2001

3

52

Page 53: CSharp Examples

ans

Используемая СУБД

Существуют причины, по которым в некоторых ситуациях для работы с определенной СУБД требуются особые программные решения. Так, в среде .NET существуют разные способы работы с данными. Например, если используется база данных Microsoft SQL Server, можно использовать специальные объекты, позволяющие значительно ускорить выполнение SQL-запросов. Однако для обращения к базе данных Microsoft Access эти объекты использовать нельзя.

Поэтому код программ будет немного различаться в зависимости от того, используете ли вы SQL Server. Поэтому мы поступили следующим образом.

Три примера программ, работающих с базами данных, в этом разделе (12a, 13a и 14a) предполагают использование SQL Server Express (или иной версии SQL Server).

В противном случае вы можете найти на диске примеры соответствующих программ, рассчитанных на работу с Microsoft Access (12b, 13b и 14b). Для их запуска вообще не требуется установка какой-либо СУБД.

Тем не менее, мы бы рекомендовали вам рано или поздно установить SQL Server Express, обеспечивающий более широкие возможности программирования. Кроме того, умение работать с SQL Server гораздо выше ценится в деловой сфере, и чем скорее вы освоите SQL Server, тем лучше. Загрузить его можно бесплатно по адресу: http://www.microsoft.com/express/ru/sql/download/default.aspx.

Если у вас установлен и готов к работе Microsoft SQL Server Express, используйте примеры 12a, 13a и 14a. В противном случае, если у вас возникают проблемы с запуском этих программ, можно воспользоваться примерами 12b, 13b и 14b, аналогичными по сути, но не требующими установки СУБД.

Обращение к базе данных из программы на языке C#

В следующих образцах программ на C# будут применены классы SqlConnection и SqlCommand, обеспечивающие взаимодействие с базой данных SQL Server Express под названием «Planets». Эти классы предназначены специально для работы с базами данных Microsoft SQL Server любой версии. Далее мы будем работать с данными двумя различными способами:

53

Page 54: CSharp Examples

1. С использованием класса SqlDataReader, который обеспечивает разнообразные возможности программного управления базой данных, позволяя построчно перебирать данные и выполнять различные действия над выбранными значениями.

2. С использованием классов SqlDataAdapter и DataSet (набор данных) для организации автоматического отображения строк данных с помощью таких элементов управления, как DataGrid. При таком подходе для извлечения информации из базы данных потребуется приличный объем кода, но ее вывод можно реализовать без особых усилий, поскольку такие «умные» элементы управления, как DataGridView легко привязываются к набору данных.

Пример программы 12

Следующая программа подключается к базе данных SQL Server Express и посылает ей SQL-запрос. После получения результата запроса производится перебор строк и вывод каждого значения из столбца PlanetName в элемент управления Label с новой строки.

Код программы 12a (для работы с SQL Express; для работы с Microsoft Access требуется версия 12b, имеющаяся на

54

Page 55: CSharp Examples

диске)

using System.Windows.Forms;

using System.Data;

using

System.Data.SqlClient; //

Пространство имен для работы с

базами данных SQL Server

class SimpleDataAccess : Form

{

public SimpleDataAccess()

{

//

Указываем заголовок окна

this.Text = "A simple databasing

program";

//

Указываем физический путь к базе

данных PLANETS

string dbLocation =

System.IO.Path.GetFullPath("../.

./../database/SqlServer/planets.

mdf");

//

Добавляем метку и растягиваем ее

на всю поверхность формы

Label label1 = new Label();

label1.Dock = DockStyle.Fill;

this.Controls.Add(label1);

//

55

Page 56: CSharp Examples

Подключаемся к базе данных SQL

Server

SqlConnection connection1 = new

SqlConnection

(

@"data source=.\SQLEXPRESS;" +

"User Instance=true;Integrated

Security=SSPI;AttachDBFilename="

+

@dbLocation

);

connection1.Open();

//

Формируем запрос к базе данных -

запрашиваем информацию о

планетах

string sql = "SELECT * FROM

PLANET";

SqlCommand command1 = new

SqlCommand(sql, connection1);

SqlDataReader dataReader1 =

command1.ExecuteReader();

//

Организуем циклический перебор

полученных записей и выводим

название каждой планеты на метку

while (dataReader1.Read())

{

label1.Text = label1.Text +

dataReader1["PlanetName"] + "\

n";

}

56

Page 57: CSharp Examples

//

Очистка

dataReader1.Close();

connection1.Close();

}

static void Main()

{

//

Запускаем новый экземпляр

приложения Windows Forms при

помощи вышеописанного класса

Application.Run(new

SimpleDataAccess());

}

}

Пример программы 13

В следующей программе нужно вывести на экран несколько столбцов данных. Элемент управления Label слишком неудобен для этого, поэтому воспользуемся элементом DataGridView.

Программа выполняет тот же запрос, что и в предыдущем примере, но помещает результат в объект DataSet, который подключается к элементу управления DataGridView и в результате тот автоматически отображает все данные.

Подключение какого-либо скрытого источника данных к визуальному элементу управления называется привязкой данных.

Код

57

Page 58: CSharp Examples

программы 13a (для работы с SQL Express; для работы с Microsoft Access требуется версия 13b, имеющаяся на диске)

using System.Windows.Forms;

using System.Data;

using

System.Data.SqlClient; //

Пространство имен для работы с

базами данных SQL Server

class DataInGrid : Form

{

58

Page 59: CSharp Examples

public DataInGrid()

{

//

Указываем заголовок окна

this.Text = "One-Way Database

Grid Binding";

//

Указываем физический путь к базе

данных PLANETS

string dbLocation =

System.IO.Path.GetFullPath("../.

./../database/SqlServer/planets.

mdf");

//

Добавляем элемент DataGridView

на форму

DataGridView DataGridView1 = new

DataGridView();

DataGridView1.Width =

this.Width;

DataGridView1.Height = 250;

DataGridView1.DataMember =

"Table";

DataGridView1.Dock =

DockStyle.Fill;

this.Controls.Add(DataGridView1)

;

//

Подключаемся к базе данных SQL

Server

SqlConnection connection1 = new

SqlConnection

59

Page 60: CSharp Examples

(

@"data source=.\SQLEXPRESS; +

"User Instance=true;Integrated

Security=SSPI;AttachDBFilename="

+

@dbLocation

);

connection1.Open();

//

DataSet сохраняет данные в

памяти с помощью таблиц данных

DataTable

DataSet dataSet1 = new

DataSet();

//

Объект DataAdapter является

посредником при взаимодействии

базы данных и объекта DataSet

SqlDataAdapter sqlDataAdapter1 =

new SqlDataAdapter();

//

Указываем объекту DataAdapter,

какие данные он должен получить

и откуда

sqlDataAdapter1.SelectCommand =

new

SqlCommand("SELECT * FROM

PLANET", connection1);

//

Теперь заполняем находящийся в

памяти объект DataSet данными

sqlDataAdapter1.Fill(dataSet1);

//

Привязываем элемент DataGridView

(визуальную таблицу) к

60

Page 61: CSharp Examples

хранящимся в памяти данным

DataGridView1.DataSource =

dataSet1;

//

Закрываем подключение к базе

данных

connection1.Close();

}

static void Main()

{

//

Запускаем новый экземпляр

приложения Windows Forms при

помощи вышеописанного класса

Application.Run(new

DataInGrid());

}

}

Пример программы 14

То, что мы научились отображать данные с помощью элемента управления DataGridView, уже хорошо, но вы, наверное, обратили внимание, что при

61

Page 62: CSharp Examples

изменении данных они не сохраняются в базе данных. Поэтому изменим подход и произведем «двухстороннюю привязку данных».

Здесь мы пустимся на маленькую хитрость (это называется «повысить производительность своего труда») и не станем сами прописывать операторы UPDATE и INSERT. Пространство имен System.Data содержит «маленький, да удаленький» класс CommandBuilder, который умеет самостоятельно создавать команды SQL и автоматически их выполнять.

Код программы 14a (для работы с SQL Express; для работы с Microsoft Access требуется версия 14b, имеющаяся на диске)

using System.Windows.Forms;

using System.Data;

62

Page 63: CSharp Examples

using

System.Data.SqlClient; //

Пространство имен для работы с

базами данных SQL Server

class PlanetsForm : Form

{

//

Объявляем объекты, к которым

будем обращаться из разных

методов

DataGridView dg;

SqlDataAdapter da;

public PlanetsForm()

//

Метод-конструктор класса

PlanetsForm

{

//

Указываем заголовок окна

this.Text = "Two-way Database

Grid Binding";

//

Указываем физический путь к базе

данных PLANETS

string dbLocation =

System.IO.Path.GetFullPath("../.

./../database/SqlServer/planets.

mdf");

//

Подготавливаем подключение к

базе данных SQL Server

string connectionString =

@"data source=.\SQLEXPRESS;" +

63

Page 64: CSharp Examples

"User Instance=true;Integrated

Security=SSPI;AttachDBFilename="

+

@dbLocation;

/*

Добавляем на форму кнопку "Save"

(Сохранить) */

Button btnSave = new Button();

btnSave.Text = "Save";

btnSave.Click += new

System.EventHandler(BtnSave_Clic

k);

btnSave.Dock = DockStyle.Top;

this.Controls.Add(btnSave);

/*

Добавляем элемент DataGridView

на форму */

dg =

new DataGridView();

dg.Width = this.Width;

dg.Height = 250;

dg.Dock = DockStyle.Fill;

this.Controls.Add(dg);

/*

Создаем экземпляры объектов для

"умной" работы с данными и

используем их

вместе для привязки элемента

DataGridView к требуемому

источнику данных */

64

Page 65: CSharp Examples

//

Объект DataAdapter выступает в

роли посредника при

взаимодействии базы данных и

хранящегося в памяти объекта

DataTable

da =

new SqlDataAdapter("SELECT *

FROM PLANET", connectionString);

//

Объект CommandBuilder

автоматически выполняет команды

UPDATE и INSERT

SqlCommandBuilder cb = new

SqlCommandBuilder(da);

//

Объект DataTable отслеживает и

сохраняет в памяти изменения

DataTable dt = new DataTable();

//

Теперь заполняем объект

DataTable данными

da.Fill(dt);

//

Привязываем элемент управления

DataGridView к объекту DataTable

dg.DataSource = dt;

}

static void Main()

{

//

Запускаем новый экземпляр

приложения Windows Forms при

помощи вышеописанного класса

Application.Run(new

65

Page 66: CSharp Examples

PlanetsForm());

}

private void

BtnSave_Click(object sender,

System.EventArgs e)

{

//

При нажатии кнопки "Save" в базе

данных сохраняются любые

изменения,

//

внесенные в источник данных,

связанный с DataGridView,

которым

// в

данном случае является объект

DataTable

da.Update((DataTable)dg.DataSour

ce);

MessageBox.Show

("Data has been saved", "For

your information",

MessageBoxButtons.OK);

}

}

66

Page 67: CSharp Examples

Поэкспериментируйте с изменением существующих и вводом новых значений. Нажмите кнопку «Save» и закройте форму. Перезапустив программу, можно убедиться, что измененные и добавленные значения были сохранены в базе данных.

Что делать, если SQL Server Express не установлен?

Если у вас не установлен Microsoft SQL Server и вы пользуетесь другой СУБД, вам потребуется внести в код небольшие поправки.

Во-первых, необходимо изменить строку подключения с описанием расположения базы данных, ее типа и т.д.

Строка подключения для базы данных SQL Server Express выглядит примерно так:

string connectionString = "Integrated Security=SSPI;Persist Security Info=False; Initial Catalog=Northwind;Data Source=localhost";

или так, если подключение производится непосредственно к файлу базы данных (как в примерах из этой книги):

string connectionString = @"data source=.\SQLEXPRESS;Integrated Security=SSPI; AttachDBFilename=c:\C#4#KIDS\examples\database\SqlServer\planets.mdf; User Instance=true”;

(Ввиду нехватки места строка подключения разорвана здесь на несколько строк, но в действительности выражение, заключенное в кавычки, должно записываться в одну строку.)

67

Page 68: CSharp Examples

Строка подключения для базы данных Microsoft Access будет выглядеть примерно так:

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source c:\C#4#KIDS\examples\database\Access\planets.mdb;";

(Как объяснялось ранее, выражение, стоящее в кавычках, должно записываться в одну строку.)

Для других баз данных приняты свои особые форматы строки подключения. Примеры можно найти в справочной документации по Visual C# Express или в документации по используемой вами СУБД.

Помимо изменения строки подключения потребуется заменить классы «SQL» на классы «OleDb».

Для начала необходимо включить пространство имен System.Data.OleDb вместо пространства имен System.Data. SqlClient. Оно содержит классы, предназначенные для работы с разнообразными базами данных.

using System.Data.OleDb;

Затем произведите замену классов для работы с данными, как указано ниже:

SQL Server General Databases

SqlCommand OleDbCommand

SqlCommandBuilder

OleDbCommandBuilder

SqlDataAdapter OleDbDataAdapter

SqlConnection OleDbConnection

68