Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 1348

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

/// </summary>

public class RoundButton : Button

{

ImageList imgList;

//Внешнее представление элемента управления меняется

//в зависимости от состояния элемента. Это состояние

//зависит от конкретных событий, происходящих с элементом

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

//Индекс, который используется при изменении внешнего

//представления элемента управления.

//Внешний вид элемента управления определяется значением

//переменной indexB, которая меняет значение в рамках

//переопределяемых обработчиков событий.

//Функциональность данного элемента управления задана

//в классе формы, в виде стандартных (непереопределяемых) обработчиков.

int indexB;

public RoundButton():base()

{

indexB = 0;

imgList = new ImageList(); imgList.Images.Add(Image.FromFile(@"jpg0.jpg")); imgList.Images.Add(Image.FromFile(@"jpg1.jpg")); imgList.Images.Add(Image.FromFile(@"jpg2.jpg")); imgList.Images.Add(Image.FromFile(@"jpg3.jpg")); this.ImageList=imgList;

}

//Код, управляющий изменением внешнего вида элемента.

//Сюда передаётся управление в результате выполнения метода

//Refresh().

protected override void OnPaint(PaintEventArgs e)

{

GraphicsPath gp = new GraphicsPath(); gp.AddEllipse(10,10,50,50);

Region reg = new Region(gp);

// Свойству Region присваивается новое значение - новый регион! this.Region = reg;

e.Graphics.DrawImage(ImageList.Images[indexB],10,10,50,50);

}

protected override void OnClick(EventArgs e)

{

indexB = 0; this.Refresh(); base.OnClick (e);

}

protected override void OnMouseDown(MouseEventArgs e)

{

indexB = 1; this.Refresh(); base.OnMouseDown (e);

}

protected override void OnGotFocus(EventArgs e)

{

indexB = 0; this.Refresh(); base.OnGotFocus (e);

}

protected override void OnLostFocus(EventArgs e)

{

indexB = 0; this.Refresh(); base.OnLostFocus(e);

}

202

protected override void OnMouseEnter(EventArgs e)

{

indexB = 2; this.Refresh(); base.OnMouseEnter (e);

}

protected override void OnMouseLeave(EventArgs e)

{

indexB = 3; this.Refresh(); base.OnMouseLeave (e);

}

private void InitializeComponent()

{

//

// RoundButton

//

}

}

}

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

private void InitializeComponent()

{

::::::::::::::::::::

//

// roundButton1

//

this.roundButton1.Cursor = System.Windows.Forms.Cursors.Cross; this.roundButton1.Location = new System.Drawing.Point(136, 8); this.roundButton1.Name = "roundButton1"; this.roundButton1.Size = new System.Drawing.Size(72, 72); this.roundButton1.TabIndex = 2;

this.roundButton1.Text = "roundButton1";

this.roundButton1.Click += new System.EventHandler(this.roundButton_Click);

::::::::::::::::::::

}

Сам обработчик события в форме объявлен следующим образом:

private void roundButton_Click(object sender, System.EventArgs e)

{

if (imgListindex < imgList.Images.Count-1) imgListindex++; else imgListindex = 0;

pictureBox1.Image = imgList.Images[imgListindex];

}

Следующий фрагмент кода посвящён разработке составного элемента управления, представляющего собой “батарею” из 16 одинаковых кнопочек, располагаемых на одной панели. Несмотря на внушительное количество составляющих элементов, перед нами один элемент управления с общим единым обработчиком события, связанного с нажатием на одну из 16 кнопочек. Естественно, что реализация единого обработчика требует дополнительных усилий: каждой кнопке назначается один и тот же стандартный обработчик с двумя параметрами. Один из которых используется для идентификации нажатой кнопки. При нажатии на кнопку происходит изменение состояния этой кнопки, которое кодируется посредством текстового значения (свойства Text), отображаемого на поверхности кнпки.

using System;

using System.Collections; using System.ComponentModel; using System.Drawing;

203


using System.Data;

using System.Windows.Forms;

namespace By2

{

///<summary>

///Summary description for ButtonsControl.

///</summary>

public class ButtonsControl : System.Windows.Forms.UserControl

{

///<summary>

///Required designer variable.

///</summary>

private Form1 f1;

private ArrayList bArrList;

private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Button button16; private System.Windows.Forms.Button button15; private System.Windows.Forms.Button button14; private System.Windows.Forms.Button button13; private System.Windows.Forms.Button button12; private System.Windows.Forms.Button button11; private System.Windows.Forms.Button button10; private System.Windows.Forms.Button button9; private System.Windows.Forms.Button button8; private System.Windows.Forms.Button button7; private System.Windows.Forms.Button button6; private System.Windows.Forms.Button button5; private System.Windows.Forms.Button button4; private System.Windows.Forms.Button button3; private System.Windows.Forms.Button button2; private System.Windows.Forms.Button button1; public ArrayList parameterList;

public void SetParent(Form1 fKey)

{

f1 = fKey;

}

private System.ComponentModel.Container components = null;

public ButtonsControl()

{

InitializeComponent(); bArrList = new ArrayList(); bArrList.Add(button16); bArrList.Add(button15); bArrList.Add(button14); bArrList.Add(button13); bArrList.Add(button12); bArrList.Add(button11); bArrList.Add(button10); bArrList.Add(button9); bArrList.Add(button8); bArrList.Add(button7); bArrList.Add(button6); bArrList.Add(button5); bArrList.Add(button4); bArrList.Add(button3); bArrList.Add(button2); bArrList.Add(button1);

parameterList = new ArrayList();

}

private void SetParameterList()

{

int i, I = bArrList.Count ; parameterList.Clear();

for (i = 0; i < I; i++)

{

204

parameterList.Add(int.Parse(((Button)bArrList[i]).Text));

}

f1.formDecimalValue(parameterList);

}

public void SetButtons(ArrayList lst)

{

int i, I = lst.Count, J = bArrList.Count;

for (i = 0; i < J; i++)

{

((Button)bArrList[i]).Text = "0";

}

for (i = 0; i < I; i++)

{

((Button)bArrList[i]).Text = ((int)lst[i]).ToString();

}

}

///<summary>

///Clean up any resources being used.

///</summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Component Designer generated code

///<summary>

///Required method for Designer support - do not modify

///the contents of this method with the code editor.

///</summary>

private void InitializeComponent()

{

this.panel1 = new System.Windows.Forms.Panel(); this.button16 = new System.Windows.Forms.Button(); this.button15 = new System.Windows.Forms.Button(); this.button14 = new System.Windows.Forms.Button(); this.button13 = new System.Windows.Forms.Button(); this.button12 = new System.Windows.Forms.Button(); this.button11 = new System.Windows.Forms.Button(); this.button10 = new System.Windows.Forms.Button(); this.button9 = new System.Windows.Forms.Button(); this.button8 = new System.Windows.Forms.Button(); this.button7 = new System.Windows.Forms.Button(); this.button6 = new System.Windows.Forms.Button(); this.button5 = new System.Windows.Forms.Button(); this.button4 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button1 = new System.Windows.Forms.Button(); this.panel1.SuspendLayout();

this.SuspendLayout();

//

// panel1

//

this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.panel1.Controls.Add(this.button16); this.panel1.Controls.Add(this.button15); this.panel1.Controls.Add(this.button14); this.panel1.Controls.Add(this.button13); this.panel1.Controls.Add(this.button12);

205


this.panel1.Controls.Add(this.button11);

this.panel1.Controls.Add(this.button10);

this.panel1.Controls.Add(this.button9);

this.panel1.Controls.Add(this.button8);

this.panel1.Controls.Add(this.button7);

this.panel1.Controls.Add(this.button6);

this.panel1.Controls.Add(this.button5);

this.panel1.Controls.Add(this.button4);

this.panel1.Controls.Add(this.button3);

this.panel1.Controls.Add(this.button2);

this.panel1.Controls.Add(this.button1); this.panel1.Location = new System.Drawing.Point(8, 8); this.panel1.Name = "panel1";

this.panel1.Size = new System.Drawing.Size(648, 48); this.panel1.TabIndex = 0;

//

//button16

this.button16.Location = new System.Drawing.Point(605, 12); this.button16.Name = "button16";

this.button16.Size = new System.Drawing.Size(32, 23); this.button16.TabIndex = 146;

this.button16.Text = "0";

this.button16.Click += new System.EventHandler(this.buttonX_Click);

//button15

//

this.button15.Location = new System.Drawing.Point(565, 12); this.button15.Name = "button15";

this.button15.Size = new System.Drawing.Size(32, 23); this.button15.TabIndex = 145;

this.button15.Text = "0";

this.button15.Click += new System.EventHandler(this.buttonX_Click);

//

//button14

this.button14.Location = new System.Drawing.Point(525, 12); this.button14.Name = "button14";

this.button14.Size = new System.Drawing.Size(32, 23); this.button14.TabIndex = 144;

this.button14.Text = "0";

this.button14.Click += new System.EventHandler(this.buttonX_Click);

//button13

//

this.button13.Location = new System.Drawing.Point(485, 12); this.button13.Name = "button13";

this.button13.Size = new System.Drawing.Size(32, 23); this.button13.TabIndex = 143;

this.button13.Text = "0";

this.button13.Click += new System.EventHandler(this.buttonX_Click);

//

//button12

this.button12.Location = new System.Drawing.Point(445, 12); this.button12.Name = "button12";

this.button12.Size = new System.Drawing.Size(32, 23); this.button12.TabIndex = 142;

this.button12.Text = "0";

this.button12.Click += new System.EventHandler(this.buttonX_Click);

//button11

//

this.button11.Location = new System.Drawing.Point(405, 12); this.button11.Name = "button11";

this.button11.Size = new System.Drawing.Size(32, 23); this.button11.TabIndex = 141;

this.button11.Text = "0";

this.button11.Click += new System.EventHandler(this.buttonX_Click);

//

// button10

206

//

this.button10.Location = new System.Drawing.Point(365, 12); this.button10.Name = "button10";

this.button10.Size = new System.Drawing.Size(32, 23); this.button10.TabIndex = 140;

this.button10.Text = "0";

this.button10.Click += new System.EventHandler(this.buttonX_Click);

//

//button9

this.button9.Location = new System.Drawing.Point(325, 12); this.button9.Name = "button9";

this.button9.Size = new System.Drawing.Size(32, 23); this.button9.TabIndex = 139;

this.button9.Text = "0";

this.button9.Click += new System.EventHandler(this.buttonX_Click);

//button8

//

this.button8.Location = new System.Drawing.Point(285, 12); this.button8.Name = "button8";

this.button8.Size = new System.Drawing.Size(32, 23); this.button8.TabIndex = 138;

this.button8.Text = "0";

this.button8.Click += new System.EventHandler(this.buttonX_Click);

//

//button7

this.button7.Location = new System.Drawing.Point(245, 12); this.button7.Name = "button7";

this.button7.Size = new System.Drawing.Size(32, 23); this.button7.TabIndex = 137;

this.button7.Text = "0";

this.button7.Click += new System.EventHandler(this.buttonX_Click);

//button6

//

this.button6.Location = new System.Drawing.Point(205, 12); this.button6.Name = "button6";

this.button6.Size = new System.Drawing.Size(32, 23); this.button6.TabIndex = 136;

this.button6.Text = "0";

this.button6.Click += new System.EventHandler(this.buttonX_Click);

//

//button5

this.button5.Location = new System.Drawing.Point(165, 12); this.button5.Name = "button5";

this.button5.Size = new System.Drawing.Size(32, 23); this.button5.TabIndex = 135;

this.button5.Text = "0";

this.button5.Click += new System.EventHandler(this.buttonX_Click);

//button4

//

this.button4.Location = new System.Drawing.Point(125, 12); this.button4.Name = "button4";

this.button4.Size = new System.Drawing.Size(32, 23); this.button4.TabIndex = 134;

this.button4.Text = "0";

this.button4.Click += new System.EventHandler(this.buttonX_Click);

//

// button3

//

this.button3.Location = new System.Drawing.Point(85, 12); this.button3.Name = "button3";

this.button3.Size = new System.Drawing.Size(32, 23); this.button3.TabIndex = 133;

this.button3.Text = "0";

this.button3.Click += new System.EventHandler(this.buttonX_Click);

//

207


//button2

this.button2.Location = new System.Drawing.Point(45, 12); this.button2.Name = "button2";

this.button2.Size = new System.Drawing.Size(32, 23); this.button2.TabIndex = 132;

this.button2.Text = "0";

this.button2.Click += new System.EventHandler(this.buttonX_Click);

//button1

//

this.button1.Location = new System.Drawing.Point(5, 12); this.button1.Name = "button1";

this.button1.Size = new System.Drawing.Size(32, 23); this.button1.TabIndex = 131;

this.button1.Text = "0";

this.button1.Click += new System.EventHandler(this.buttonX_Click);

//

// ButtonsControl

//

this.Controls.Add(this.panel1); this.Name = "ButtonsControl";

this.Size = new System.Drawing.Size(664, 64); this.panel1.ResumeLayout(false); this.ResumeLayout(false);

}

#endregion

private void buttonX_Click(object sender, System.EventArgs e)

{

if (((Button)sender).Text.Equals("0")) ((Button)sender).Text = "1"; else ((Button)sender).Text = "0";

SetParameterList();

}

}

}

208

Основы ADO.NET

Реляционные базы данных. Основные понятия

Столбец (поле, атрибут):

характеризуется определённым типом (данных),

множество значений столбца являются значениями одного типа. Строка (запись, кортеж):

характеризуется кортежем атрибутов,

состоит из упорядоченного множества значений (кортежа) атрибутов. Таблица:

набор данных, представляющих объекты определённого типа,

состоит из множества столбцов*строк,

каждая строка таблицы УНИКАЛЬНА.

Первичный ключ таблицы:

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

Дополнительный ключ таблицы:

а Бог его знает, зачем ещё одна гарантия уникальности строки в таблице. Внешний ключ таблицы:

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

обеспечивает логическую связь между таблицами.

Разъединённый доступ к данным (Доступ к отсоединенным данным)

Вклиент-серверных приложениях обычно применяется доступ к данным через постоянное соединение с источником данных. Таким образом, приложение открывает соединение с базой данных и не закрывает его, по крайней мере, до завершения работы с источником данных. В это время соединение с источником поддерживается постоянно.

Недостатки такого подхода стали выявляться после распространения приложений, ориентированных на Интернет.

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

Плохое масштабирование приложений с постоянным соединением известно давно. Соединение с парой клиентов обслуживается приложением хорошо, 10 клиентов обслуживаются хуже, 100 – намного хуже…

ВADO.NET используется другая модель доступа – доступ к отсоединённым данным. При этом соединение устанавливается лишь на то время, которое необходимо для проведения определённой операции над базой данных.

Модель доступа – модель компромиссная. В ряде случаев она проигрывает по производительности традиционной модели. И для этих случаев рекомендуется вместо ADO.NET использовать ADO.

Предварительные замечания

Работа с БД на уровне приложения – это работа:

с множеством объектов-представителей классов,

с множествами объявлений унаследованных методов и свойств, предназначенных для решения поставленных задач,

с множеством объявлений данных-членов, отражающих специфику структуры конкретной базы данных.

Функциональные особенности этой сложной системы взаимодействующих классов

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

данных в основе своей ничем не отличается от того, что было раньше. Те же объявления классов и интерфейсов. И, конечно же, всё можно сделать своими

209


руками. Правда, в силу сложности задачи (много всяких деталек придётся вытачивать) времени на разработку может потребоваться многовато.

Апотому, желательно:

понимать принципы функционирования системы,

представлять структуру, назначение и принципы функционирования компонентов,

знать, для чего и как применять различные детали при решении поставленных задач,

уметь создавать компоненты ADO.NET с использованием вспомогательных средств (волшебников),

 

помнить, что все компоненты ADO.NET суть объекты-представители классов

 

(пусть даже и не самой простой структуры),

 

понимать закономерности их конструкции и быть готовым к модификации классов.

ADO.NET. Доступ к данным

Объектная модель ADO.NET реализует доступ к данным. При этом в Visual Studio.NET существует множество ВСТРОЕННЫХ мастеров и дизайнеров, которые позволяют реализовать механизмы доступа к БД ещё на этапе разработки программного кода.

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

Команда – некий объект, который, естественно, является представителем одного из двух классов - либо класса OleDbCommand, либо класса SqlCommand. Основное назначение объекта Команда - выполнение различных действий над Базой Данных (ИСТОЧНИКЕ ДАННЫХ) при использовании ОТКРЫТОГО СОЕДИНЕНИЯ. Сами же действия обычно кодируются оператором SQL или хранимой процедурой. Закодированная информация фиксируется с использованием объектовпредставителей класса Parameter, специально разработанных для “записи” кодируемой в команде информации.

То есть, после установления соединения с БД для изменения состояния этой базы может быть создан, соответствующим образом настроен и применён объектпредставитель класса …Command.

ADO.NET. Архитектура

Доступ к данным в ADO.NET основан на использовании двух компонентов: НАБОРА ДАННЫХ (представляется объектом класса DataSet) со стороны клиента.

Это хранилище данных на локальном компе.

ПРОВАЙДЕРА ДАННЫХ (представляется объектом класса DataProvider) со стороны сервера. Это посредник, обеспечивающий взаимодействие приложения и базы данных.

210