View
165
Download
10
Category
Preview:
Citation preview
Некоторые полезные классы из пространства имен 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
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
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
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
//
Выполнение соответствующего
действия при выборе любого из
узлов
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
"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
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
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
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
Добавляем на панель элемент
управления вкладками
// и
наполняем каждую вкладку
содержимым
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
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
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
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
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
;
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
//
Обработчик события,
срабатывающий при щелчке мышью
на метке
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
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
из пунктов списка
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
Обработчик события,
срабатывающий при выборе в меню
цвета
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
на панели инструментов
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
Введение
Классы, объединенные в пространство имен Drawing, позволяют работать с различными изображениями. Существует два основных типа компьютерных изображений:
Точечные или растровые;
Векторные.
Растровые изображения представляют собой набор точек. Примером их могут
Векторная графика — это изображения, составленные из определенных геометрических
21
служить фотографии и значки.
фигур: линий, окружностей, прямоугольников и т.д. Например, план дома удобно представлять в виде векторного изображения.
Для начала продемонстрируем работу с растровой графикой. На компьютере часто приходится выполнять обработку изображений, например, работать с фотографиями. В библиотеке классов .NET Framework имеется для этого немало полезных средств.
Пример программы 8
Эта программа находит изображение (в данном случае файл JPEG) на диске и отображает его на форме.
Для этого нам понадобится какой-либо элемент управления, позволяющий отображать изображения. PictureBox прекрасно подходит для этой цели.
Код программы 8
using System;
using System.Windows.Forms;
using System.Drawing;
class PictureDisplayer :
Form
{
Bitmap image1;
PictureBox pictureBox1;
// Метод-конструктор нашего
класса
22
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
this.Controls.Add(pictureBox
1);
}
static void Main()
{
// Запускаем новый экземпляр
приложения Windows Forms при
помощи вышеописанного класса
Application.Run(new
PictureDisplayer());
}
}
Пример программы 9
Следующая программа загружает фотографию с диска и после нажатия кнопки «flip» (Перевернуть) позволяет получить ее зеркальное отражение по горизонтали.
Код программы
24
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
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
{
//
Запускаем новый экземпляр
приложения 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
Теперь перейдем к примерам работы с векторной графикой — изображениям, составленным из отдельных геометрических фигур.
Во всех этих примерах будет создаваться кнопка и обработчик событий, перехватывающий ее нажатие. Работа с графикой будет начинаться только после нажатия кнопки.
Необходимо усвоить несколько важных принципов. Они вполне логичны, но не зная их, можно испытать некоторые затруднения.
1. В обычном мире чтобы нарисовать линию, окружность, прямоугольник или иную фигуру, необходимо сначала выбрать карандаш нужного цвета и толщины.
Аналогично, для отрисовки на компьютере простейших фигур требуется предварительно создать объект Pen (Перо). Например, с помощью данного фрагмента кода создается объект Pen, рисующий зеленую линию толщиной 3 пикселя:
Pen myGreenPen = new Pen( Color.Green, 3 );
2. Для рисования фигур с заливкой потребуется нечто вроде кисти с красками.
Для создания фигур с заливкой на компьютере требуется предварительно создать объект Brush (Кисть) и выбрать цвет заливки. Имеются различные типы кисти. В следующем фрагменте кода создается объект SolidBrush (Сплошная кисть) голубого цвета:
SolidBrush myBlueBrush = new SolidBrush( Color.Blue );
Пример программы 10
В этой программе с помощью метода DrawSomeShapes рисуется линия, прямоугольник и эллипс («сплюснутая» окружность).
28
Код программы 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
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
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
Пример программы 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
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
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
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
/
/ Рисуем окружность (эллипс,
вписанный в квадрат)
/
/ Верхний левый угол квадрата
имеет координаты 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
public void
MouseButtonIsUp(object
sender, MouseEventArgs e)
{
/
* Пользователь отпустил
кнопку мыши! */
/
/ Создаем прямоугольник (пока
он еще не виден),
ограничивающий
/
/ область изображения, с
которой пользователь будет
работать
Rectangle r = new
Rectangle();
/
/ Левый верхний угол
соответствует точке, в
которой была нажата кнопка
мыши
/
/ Мы сохранили ее координаты
с помощью описанного выше
метода
r.X = spotClicked.X;
r.Y = spotClicked.Y;
/
/ Ширина и высота
прямоугольника вычисляется
/
/ путем вычитания начальных
координат мыши (в точке
нажатия)
/
/ из текущих координат (в
точке отжатия кнопки)
37
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
область изображения
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
{
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
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
y,
Color.FromArgb((byte)newRed,
(byte)newGreen,
(byte)newBlue)
)
;
}
}
/
/ Помещаем измененную копию
изображения в PictureBox
/
/ чтобы изменения
отобразились на экране
this.pictureBox1.Image =
picture;
}
static void Main()
{
/
/ Создаем экземпляр класса
формы
Application.Run(new
FunWithTheMouse());
}
}
42
Введение
На практике большинство приложений должны работать с базами данных. Любой программист из крупной компании, подтвердит вам, насколько велика роль баз данных в мире вычислительных технологий. Программист, умеющий оперировать с базами данных, способен создавать самые разнообразные и действительно полезные приложения.
Возможно, у вас на компьютере уже установлена система управления базами данных, например Microsoft Access. В качестве альтернативы можно установить Microsoft SQL Server Express Edition. С его помощью можно научиться работать с базами данных SQL Server, используемыми во многих крупнейших компаниях по всему миру. SQL Server Express включен в пакет установки Visual C# Express, так что возможно вы уже установили его.
Для работы с базами данных в библиотеке .NET Framework предусмотрены классы пространства имен System.Data. База данных в корне отличается от таких объектов, как изображения или документы текстовых редакторов, которые часто называют неструктурированными. Информация в базе данных более структурирована. Обычно она содержит строки, содержащие данные одинакового типа и объединяемые в блоки, называемые таблицами. Таблица состоит из одного или нескольких столбцов , содержащих определенную информацию для каждой строки.
Строки иногда называют записями, а
43
столбцы — полями.
Ниже представлена таблица базы данных, содержащая информацию о планетах. Она имеет следующие столбцы: 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
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
Не следует путать базы данных с электронными таблицами. Хотя способ представления данных в электронных таблицах внешне похож на тот, что использовался в приведенных выше примерах, обработка данных происходит в них совершенно иначе.
Язык 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
Как правило, оператор 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
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
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
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
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
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
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
1. С использованием класса SqlDataReader, который обеспечивает разнообразные возможности программного управления базой данных, позволяя построчно перебирать данные и выполнять различные действия над выбранными значениями.
2. С использованием классов SqlDataAdapter и DataSet (набор данных) для организации автоматического отображения строк данных с помощью таких элементов управления, как DataGrid. При таком подходе для извлечения информации из базы данных потребуется приличный объем кода, но ее вывод можно реализовать без особых усилий, поскольку такие «умные» элементы управления, как DataGridView легко привязываются к набору данных.
Пример программы 12
Следующая программа подключается к базе данных SQL Server Express и посылает ей SQL-запрос. После получения результата запроса производится перебор строк и вывод каждого значения из столбца PlanetName в элемент управления Label с новой строки.
Код программы 12a (для работы с SQL Express; для работы с Microsoft Access требуется версия 12b, имеющаяся на
54
диске)
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
Подключаемся к базе данных 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
//
Очистка
dataReader1.Close();
connection1.Close();
}
static void Main()
{
//
Запускаем новый экземпляр
приложения Windows Forms при
помощи вышеописанного класса
Application.Run(new
SimpleDataAccess());
}
}
Пример программы 13
В следующей программе нужно вывести на экран несколько столбцов данных. Элемент управления Label слишком неудобен для этого, поэтому воспользуемся элементом DataGridView.
Программа выполняет тот же запрос, что и в предыдущем примере, но помещает результат в объект DataSet, который подключается к элементу управления DataGridView и в результате тот автоматически отображает все данные.
Подключение какого-либо скрытого источника данных к визуальному элементу управления называется привязкой данных.
Код
57
программы 13a (для работы с SQL Express; для работы с Microsoft Access требуется версия 13b, имеющаяся на диске)
using System.Windows.Forms;
using System.Data;
using
System.Data.SqlClient; //
Пространство имен для работы с
базами данных SQL Server
class DataInGrid : Form
{
58
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
(
@"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
хранящимся в памяти данным
DataGridView1.DataSource =
dataSet1;
//
Закрываем подключение к базе
данных
connection1.Close();
}
static void Main()
{
//
Запускаем новый экземпляр
приложения Windows Forms при
помощи вышеописанного класса
Application.Run(new
DataInGrid());
}
}
Пример программы 14
То, что мы научились отображать данные с помощью элемента управления DataGridView, уже хорошо, но вы, наверное, обратили внимание, что при
61
изменении данных они не сохраняются в базе данных. Поэтому изменим подход и произведем «двухстороннюю привязку данных».
Здесь мы пустимся на маленькую хитрость (это называется «повысить производительность своего труда») и не станем сами прописывать операторы UPDATE и INSERT. Пространство имен System.Data содержит «маленький, да удаленький» класс CommandBuilder, который умеет самостоятельно создавать команды SQL и автоматически их выполнять.
Код программы 14a (для работы с SQL Express; для работы с Microsoft Access требуется версия 14b, имеющаяся на диске)
using System.Windows.Forms;
using System.Data;
62
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
"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
//
Объект 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
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
Поэкспериментируйте с изменением существующих и вводом новых значений. Нажмите кнопку «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
Строка подключения для базы данных 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
Recommended