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

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

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

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

Добавлен: 11.12.2025

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

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

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

}

:::::

// Проверка результатов. if (findIndex == -1)

{

this.findTtextBox.Text = "Row not found: " + this.findTtextBox.Text;

}

else

{

this.findTtextBox.Text =

"Yes :" + rd.view[findIndex]["nRoll"].ToString() +

","

+

rd.view[findIndex]["X"].ToString() +

","

+

rd.view[findIndex]["Y"].ToString();

}

 

 

:::::

 

 

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

:::::

// Массив для получения результатов поиска

DataRowView[] rows;

:::::

//Поиск в строке по полю "nRoll" (целочисленный столбец) rd.view.Sort = "nRoll";

try

{

//Проверка на соответствие типа. int.Parse(this.findTtextBox.Text);

//Сам поиск. Возвращается массив rows.

rows = rd.view.FindRows(this.findTtextBox.Text);

}

catch (Exception e1)

{

this.findTtextBox.Text = "Integer value expected...";

}

}

:::::

// Проверка результатов. if (rows.Length == 0)

{

this.findTtextBox.Text = "No rows found: " + this.findTtextBox.Text;

}

else

{

foreach (DataRowView row in rows)

{

this.findTtextBox.Text = row["nRoll"].ToString() +

","

+

row["X"].ToString() +

","

+

row["Y"].ToString();

}

 

 

}

 

 

:::::

 

 

В примере демонстрируется взаимодействие таблицы и заточенного под неё вьюера. Таблица автономна, не включена с DataSet и не связана с базой данных. Записи в таблицу можно добавлять как непосредственно, так и через вьюер. При этом необходимо совершать некоторое количество дополнительных действий. Через него же организуется поиск записей. Также просматриваются мотивы организации сортировок.

using System; using System.Data;

using System.Drawing; using System.Collections;

using System.ComponentModel; using System.Windows.Forms;

221


namespace Lights01

{

public class DataViewForm : System.Windows.Forms.Form

{

private System.ComponentModel.Container components = null;

DataTable dt;

// Таблица.

DataColumn c1, c2;

// Столбцы таблцы.

DataRow dr;

// Строка таблицы.

DataView dv;

// Вьюер таблицы.

DataRowView rv;

// Вьюер строки таблицы.

int currentCounter;

// Счётчик текущей строки для вьюера таблицы.

private System.Windows.Forms.DataGrid dG;

private System.Windows.Forms.DataGrid dGforTable; private System.Windows.Forms.Button buttPrev; private System.Windows.Forms.Button buttFirst; private System.Windows.Forms.Button buttLast; private System.Windows.Forms.Button buttonFind; private System.Windows.Forms.TextBox demoTextBox; private System.Windows.Forms.TextBox findTextBox; private System.Windows.Forms.Button buttonAdd; private System.Windows.Forms.Button buttonAcc; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.Button buttNext;

public DataViewForm()

{

InitializeComponent();

CreateTable(); dG.DataSource = dv; dGforTable.DataSource = dt; currentCounter = 0;

rv = dv[currentCounter]; demoTextBox.Text = rv["Item"].ToString();

}

protected override void Dispose( bool disposing )

{

if( disposing )

{

if(components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}

#region Windows Form 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.dG = new System.Windows.Forms.DataGrid(); this.demoTextBox = new System.Windows.Forms.TextBox(); this.buttPrev = new System.Windows.Forms.Button(); this.buttNext = new System.Windows.Forms.Button(); this.buttFirst = new System.Windows.Forms.Button(); this.buttLast = new System.Windows.Forms.Button(); this.findTextBox = new System.Windows.Forms.TextBox(); this.buttonFind = new System.Windows.Forms.Button(); this.buttonAdd = new System.Windows.Forms.Button(); this.dGforTable = new System.Windows.Forms.DataGrid(); this.buttonAcc = new System.Windows.Forms.Button();

222

this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox2 = new System.Windows.Forms.GroupBox(); ((System.ComponentModel.ISupportInitialize)(this.dG)).BeginInit();

((System.ComponentModel.ISupportInitialize)(this.dGforTable)).BeginInit(); this.groupBox1.SuspendLayout();

this.groupBox2.SuspendLayout();

this.SuspendLayout();

//

//dG

this.dG.DataMember = "";

this.dG.HeaderForeColor = System.Drawing.SystemColors.ControlText; this.dG.Location = new System.Drawing.Point(8, 80);

this.dG.Name = "dG";

this.dG.Size = new System.Drawing.Size(280, 128); this.dG.TabIndex = 0;

this.dG.MouseDown += new System.Windows.Forms.MouseEventHandler(this.dG_MouseDown);

//demoTextBox

//

this.demoTextBox.Location = new System.Drawing.Point(152, 48); this.demoTextBox.Name = "demoTextBox";

this.demoTextBox.Size = new System.Drawing.Size(128, 20); this.demoTextBox.TabIndex = 1;

this.demoTextBox.Text = "";

//

//buttPrev

this.buttPrev.Location = new System.Drawing.Point(189, 16); this.buttPrev.Name = "buttPrev";

this.buttPrev.Size = new System.Drawing.Size(25, 23); this.buttPrev.TabIndex = 2;

this.buttPrev.Text = "<-";

this.buttPrev.Click += new System.EventHandler(this.buttPrev_Click);

//buttNext

//

this.buttNext.Location = new System.Drawing.Point(221, 16); this.buttNext.Name = "buttNext";

this.buttNext.Size = new System.Drawing.Size(25, 23); this.buttNext.TabIndex = 3;

this.buttNext.Text = "->";

this.buttNext.Click += new System.EventHandler(this.buttNext_Click);

//

//buttFirst

this.buttFirst.Location = new System.Drawing.Point(157, 16); this.buttFirst.Name = "buttFirst";

this.buttFirst.Size = new System.Drawing.Size(25, 23); this.buttFirst.TabIndex = 4;

this.buttFirst.Text = "<<";

this.buttFirst.Click += new System.EventHandler(this.buttFirst_Click);

//buttLast

//

this.buttLast.Location = new System.Drawing.Point(253, 16); this.buttLast.Name = "buttLast";

this.buttLast.Size = new System.Drawing.Size(25, 23); this.buttLast.TabIndex = 5;

this.buttLast.Text = ">>";

this.buttLast.Click += new System.EventHandler(this.buttLast_Click);

//

//findTextBox

this.findTextBox.Location = new System.Drawing.Point(8, 48); this.findTextBox.Name = "findTextBox";

this.findTextBox.Size = new System.Drawing.Size(128, 20); this.findTextBox.TabIndex = 6;

this.findTextBox.Text = "";

//buttonFind

223


//

this.buttonFind.Location = new System.Drawing.Point(88, 16); this.buttonFind.Name = "buttonFind";

this.buttonFind.Size = new System.Drawing.Size(48, 23); this.buttonFind.TabIndex = 7;

this.buttonFind.Text = "Find";

this.buttonFind.Click += new System.EventHandler(this.buttonFind_Click);

//

//buttonAdd

this.buttonAdd.Location = new System.Drawing.Point(8, 16); this.buttonAdd.Name = "buttonAdd";

this.buttonAdd.Size = new System.Drawing.Size(40, 23); this.buttonAdd.TabIndex = 8;

this.buttonAdd.Text = "Add";

this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click);

//dGforTable

//

this.dGforTable.DataMember = "";

this.dGforTable.HeaderForeColor = System.Drawing.SystemColors.ControlText; this.dGforTable.Location = new System.Drawing.Point(8, 24); this.dGforTable.Name = "dGforTable";

this.dGforTable.Size = new System.Drawing.Size(272, 120); this.dGforTable.TabIndex = 9;

//

//buttonAcc

this.buttonAcc.Location = new System.Drawing.Point(8, 152); this.buttonAcc.Name = "buttonAcc";

this.buttonAcc.Size = new System.Drawing.Size(40, 23); this.buttonAcc.TabIndex = 10;

this.buttonAcc.Text = "Acc";

this.buttonAcc.Click += new System.EventHandler(this.buttonAcc_Click);

//groupBox1

//

this.groupBox1.Controls.Add(this.buttonAcc);

this.groupBox1.Controls.Add(this.dGforTable); this.groupBox1.Location = new System.Drawing.Point(6, 8); this.groupBox1.Name = "groupBox1";

this.groupBox1.Size = new System.Drawing.Size(298, 184); this.groupBox1.TabIndex = 11;

this.groupBox1.TabStop = false; this.groupBox1.Text = "Таблица как она есть ";

//

//groupBox2

this.groupBox2.Controls.Add(this.buttPrev);

this.groupBox2.Controls.Add(this.buttonFind);

this.groupBox2.Controls.Add(this.buttFirst);

this.groupBox2.Controls.Add(this.buttLast);

this.groupBox2.Controls.Add(this.demoTextBox);

this.groupBox2.Controls.Add(this.buttNext);

this.groupBox2.Controls.Add(this.dG);

this.groupBox2.Controls.Add(this.buttonAdd);

this.groupBox2.Controls.Add(this.findTextBox); this.groupBox2.Location = new System.Drawing.Point(8, 200);

this.groupBox2.Name = "groupBox2";

this.groupBox2.Size = new System.Drawing.Size(296, 216); this.groupBox2.TabIndex = 12;

this.groupBox2.TabStop = false; this.groupBox2.Text = "Вид через вьюер";

//DataViewForm

//

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(312, 421); this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1);

this.Name = "DataViewForm";

224

this.Text = "DataViewForm"; ((System.ComponentModel.ISupportInitialize)(this.dG)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.dGforTable)).EndInit(); this.groupBox1.ResumeLayout(false);

this.groupBox2.ResumeLayout(false);

this.ResumeLayout(false);

}

#endregion

private void CreateTable()

{

// Создаётся таблица.

dt = new DataTable("Items");

//Столбцы таблицы...

//Имя первого столбца - id, тип значения - System.Int32. c1 = new DataColumn("id", Type.GetType("System.Int32")); c1.AutoIncrement=true;

//Имя второго столбца - Item, тип значения - System.Int32. c2 = new DataColumn("Item", Type.GetType("System.Int32"));

//К таблице добавляются объекты-столбцы...

dt.Columns.Add(c1);

dt.Columns.Add(c2);

//А вот массив столбцов (здесь он из одного элемента)

//для организации первичного ключа (множества первичных ключей). DataColumn[] keyCol= new DataColumn[1];

//И вот, собственно, как в таблице задаётся множество первичных ключей. keyCol[0]= c1;

//Свойству объекта t передаётся массив, содержащий столбцы, которые

//формируемая таблица t будет воспринимать как первичные ключи. dt.PrimaryKey=keyCol;

//В таблицу добавляется 10 rows.

for(int i = 0; i <10;i++)

{

dr=dt.NewRow(); dr["Item"]= i; dt.Rows.Add(dr);

}

//Принять изменения.

//Так производится обновление таблицы.

//Сведения о новых изменениях и добавлениях будут фиксироваться

//вплоть до нового обновления.

dt.AcceptChanges();

//Здесь мы применим специализированный конструктор, который

//задаст значения свойств Table, RowFilter, Sort, RowStateFilter

//объекта DataView в двух операторах кода...

//dv = new DataView(dt); // Вместо этого...

//Определение того, что доступно через объект-представитель DataView.

//Задавать можно в виде битовой суммы значений. И не все значения сразу!

//Сумма всех значений - противоречивое сочетание!

//А можно ли делать это по отдельности?

DataViewRowState dvrs = DataViewRowState.Added | DataViewRowState.CurrentRows | DataViewRowState.Deleted | DataViewRowState.ModifiedCurrent |

//DataViewRowState.ModifiedOriginal | //DataViewRowState.OriginalRows | //DataViewRowState.None |

// Записи не отображаются.

DataViewRowState.Unchanged;

225


// Вот такое хитрое объявление...

//Таблица

//

|

Значение, относительно которого будет вестись сортировка

//

|

|

Имя столбца, по значениям которого производится сортировка

//

|

|

|

составленное значение DataViewRowState.

//

|

|

|

|

dv = new DataView(dt, "", "Item", dvrs);

}

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

{

if (currentCounter+1 < dv.Count) currentCounter++; rv = dv[currentCounter];

demoTextBox.Text = rv["Item"].ToString();

}

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

{

if (currentCounter-1 >= 0) currentCounter--; rv = dv[currentCounter];

demoTextBox.Text = rv["Item"].ToString();

}

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

{

currentCounter = 0;

rv = dv[currentCounter]; demoTextBox.Text = rv["Item"].ToString();

}

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

{

currentCounter =dv.Count - 1; rv = dv[currentCounter];

demoTextBox.Text = rv["Item"].ToString();

}

private void dG_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

currentCounter = dG.CurrentRowIndex; rv = dv[currentCounter];

demoTextBox.Text = rv["Item"].ToString();

}

//Реализация поиска требует специального опеделения порядка

//сортировки строк, который должен задаваться в конструкторе. private void buttonFind_Click(object sender, System.EventArgs e)

{

int findIndex = -1;

//Сначала проверяем строку на соответствие формату отыскиваемого значения.

//В нашем случае строка должна преобразовываться в целочисленное значение.

try

{

int.Parse(findTextBox.Text);

}

catch

{

findTextBox.Text = "Неправильно задан номер..."; return;

}

findIndex = dv.Find(findTextBox.Text);

if (findIndex >= 0)

{

currentCounter = findIndex; rv = dv[currentCounter];

demoTextBox.Text = rv["Item"].ToString();

}

226


else

{

findTextBox.Text = "Не нашли.";

}

}

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

{

//При создании новой записи средствами Вьюера таблицы,

//связанный с ним Вьюер строки переходит в состояние rv.IsNew.

//При этом в действиях этих объектов есть своя логика.

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

//предыдущая запись считается принятой и включается в таблицу автоматически.

//Контролируя состояния Вьюера строки (rv.IsEdit || rv.IsNew),

//мы можем предотвратить процесс поаледовательного автоматического

//обновления таблицы. Всё под контролем.

if (rv.IsEdit || rv.IsNew) return; rv = dv.AddNew();

rv["Item"] = dv.Count-1;

}

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

{

//И вот мы вмешались в процесс.

//Добавление новой записи в таблицу становится возможным лишь

//после явного завершения редактирования прпредыдущей записи.

//Без этого попытки создания новой записи блокируются.

//Завершить редактирование.

rv.EndEdit();

//Принять изменения.

//Так производится обновление таблицы.

//Сведения о новых изменениях и добавлениях будут фиксироваться

//вплоть до нового обновления.

dt.AcceptChanges();

}

}

}

DataSet

DataSet - это находящийся в памяти объект ADO.NET, используемый для представления данных; он определяет согласованную реляционную модель программирования, не зависящую от источника содержащихся в нем данных. Объект DataSet представляет полный набор данных, включая таблицы, содержащие данные в определенном порядке с учетом установленных ограничений, а также отношения между таблицами.

В рамках отсоединённой модели ADO.NET объект DataSet становится важным элементом при поддержке разъединенных, распределенных сценариев данных с ADO.NET. Его большие функциональные возможности позволяют загрузить в хранилище данные из любого допустимого для ADO.NET источника: SQL Server, Microsoft Access, XML-файл. Содержащуюся в нём информацию можно изменять независимо от источника данных (от самой БД). Соответствующие значения формируются непосредственно в программе и добавляются в таблицы, связанные с хранилищем.

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

Любой объект-представитель класса DataSet позволяет организовать чтение и запись содержимого (теоретически – информации из базы) в файл или область памяти. При этом можно читать и сохранять:

только содержимое объекта (собственно информацию из базы),

только структуру объекта-представителя класса DataSet,

полный образ DataSet (содержимое и структуру).

227