Объекты DBConnection и DBCommand

Объект DBConnection осуществляет связь с источником данных. Эта связь может быть одновременно использована несколькими командными объектами. Объект DBCommand позволяет послать базе данных команду (как правило, команду SQL или хранимую процедуру). Объекты DBConnection и DBCommand иногда создаются неявно в момент создания объекта DataSet, но их также можно создавать явным образом.

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

DataGridView

Элемент управление DataGridView представляет собой настраиваемую таблицу для отображения данных. Класс DataGridView поддерживает настройку ячеек, строк, столбцов и платформы с помощью свойства DefaultCellStyle,как ColumnHeadersDefaultCellStyle, CellBorderStyle и GridColor. Элемент управления DataGridView можно использовать для отображения данных как с базовым источником данных, так и без. Без определения источника данных можно создать столбцы и строки, которые содержат данные и добавьте их непосредственно в DataGridView с помощью свойства Rows и Columns. Можно также использовать коллекцию Rows для доступа к объектам DataGridViewRow, а свойство DataGridViewRow.Cells для чтения или записи значения ячеек напрямую.Индексатор Item также предоставляет прямой доступ к ячейкам.В качестве альтернативы заполнения элемента управления вручную можно задать свойства DataSource и DataMember для привязки DataGridView к источнику данных и автоматически заполнить ее данными.

При работе с очень большими объемами данных можно задать свойство VirtualMode к true, чтобы отобразить подмножество доступных данных. Виртуальный режим требует реализации кэша данных, из которого элемент управления DataGridView будет заполнен.

 

 

OleDbCommandBuilder Автоматически генерирует однотабличные команды, которые позволяют согласовать изменения, вносимые в объект DataSet, со связанной базой данных. Этот класс не наследуется.
OleDbConnection Представляет открытое подключение к источнику данных.
OleDbConnectionStringBuilder Обеспечивает удобный способ создания и управления содержимым строк подключения с помощью классаOleDbConnection.
OleDbDataAdapter Представляет набор команд данных и подключение базы данных, которые используются для заполнения DataSet и обновления источника данных.
OleDbDataReader Предоставляет способ чтения потока строк данных из источника только в прямом порядке. Этот класс не наследуется.
OleDbEnumerator Предоставляет механизм для перечисления всех доступных поставщиков OLE DB в локальной сети.
OleDbError Собирает сведения, имеющие отношение к предупреждению или ошибке, возвращенной источником данных.
OleDbErrorCollection Собирает все ошибки, сгенерированные поставщиком данных .NET Framework для OLE DB. Этот класс не наследуется.
OleDbException Исключение, которое генерируется, когда соответствующий поставщик возвращает предупреждение или ошибку для источника данных OLE DB. Этот класс не наследуется.
OleDbFactory Представляет набор методов для создания экземпляров классов поставщиков OLEDB, реализующих источник данных.
OleDbInfoMessageEventArgs Предоставляет данные для события InfoMessage. Этот класс не наследуется.
OleDbMetaDataCollectionNames Предоставляет список констант для использования с методом GetSchema в целях извлечения коллекций метаданных.
OleDbMetaDataColumnNames Предоставляет статические значения, которые используются для имен столбцов в объектах OleDbMetaDataCollectionNames, содержащихся в таблице DataTable. Объект DataTable создан с помощью метода GetSchema.
OleDbParameter Представляет параметр для OleDbCommand и дополнительно его отображение для столбца DataSet. Этот класс не наследуется.
OleDbParameterCollection Представляет коллекцию параметров, которые важны для OleDbCommand, а также их сопоставления со столбцами в DataSet.
OleDbPermission Позволяет поставщику данных .NET Framework для OLE DB обеспечить пользователю уровень безопасности, достаточный для доступа к источнику данных OLE DB.
OleDbPermissionAttribute Связывает операцию безопасности с пользовательским атрибутом безопасности.
OleDbRowUpdatedEventArgs Предоставляет данные для события RowUpdated.
OleDbRowUpdatingEventArgs Предоставляет данные для события RowUpdating.
OleDbSchemaGuid Возвращает тип таблицы схемы, указываемой методом GetOleDbSchemaTable.
OleDbTransaction Представляет создаваемую в источнике данных SQL-транзакцию. Этот класс не наследуется.

 

OleDbConnection - класс

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

При создании экземпляра OleDbConnection для всех свойств задаются начальные значения. Для одного подключения OleDbConnection можно открыть более одного объекта DataReader. Если используемый поставщик OLE DB не поддерживает более одного объекта DataReader для одного подключения, поставщиком неявно открывается дополнительное подключение для каждого объекта.

Если объект OleDbConnection выходит за границы области действия, он не закрывается. Поэтому следует в явном виде закрыть подключение, вызвав метод Close или Dispose либо воспользовавшись объектомOleDbConnection в операторе Using.

Если неустранимое исключение OleDbException (например, с уровнем серьезности SQL Server равным 20 или более) генерируется методом, выполняющим команду OleDbCommand, подключение OleDbConnection может быть закрыто. Тем не менее, пользователь может опять открыть подключение и продолжить работу.

Приложение, которое создает экземпляр объекта OleDbConnection, может затребовать все необходимые разрешения на доступ к коду у непосредственных и опосредованных абонентов путем установки требований декларативной или принудительной безопасности. OleDbConnection определяет требования безопасности с помощью объекта OleDbPermission. Пользователи могут проверить, есть ли у кода необходимые разрешения с помощью объекта OleDbPermissionAttribute. Кроме того, пользователи и администраторы могут воспользоваться Caspol.exe (средство настройки политики управления доступом для кода) для изменения политики безопасности на уровне компьютера, пользователя или предприятия. Дополнительные сведения см. в разделе Управление доступом для кода и ADO.NET.

В следующем примере создаются OleDbCommand и OleDbConnection. Подключение OleDbConnection открывается и задается как Connection для OleDbCommand. Затем в примере вызывается метод ExecuteNonQuery, а потом подключение закрывается. Чтобы реализовать это, данному методу ExecuteNonQuery передается строка подключения и строка запроса, которая представляет собой оператор SQL INSERT.

public void InsertRow(string connectionString, string insertSQL)

{

using (OleDbConnection connection = new OleDbConnection(connectionString))

{

OleDbCommand command = new OleDbCommand(insertSQL);

command.Connection = connection;

try

{

connection.Open();

command.ExecuteNonQuery();

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

}

}

 

 

Практическая часть

База данных

База данных состоит из 6 таблиц

1. Экзамен

2. Предмет

3. Специальность

4. Группа

5. Студенты

6. Оценки.

Таблица Экзамен
1) Код (Тип данных: Счетчик)

2) Код предмета (Тип данных: Числовой)

3) ФИО преподавателя (Тип данных: Текст)

4) Дата (Тип данных: Дата и время)

Таблица Предмет
1) Код (Тип данных: Счетчик)

2) Название предмета (Тип данных: Текст)

3) Курс (Тип данных: Текст)

4) Код специальности (Тип данных: Числовой)

Таблица Специальность

1) Код (Тип данных: Счетчик)

2) Номер (Тип данных: Числовой)

3) Название (Тип данных: Текст)

 

Таблица Группа

1) Код (Тип данных: Счетчик)

2) Номер (Тип данных: Числовой)

3) Код специальности (Тип данных: Числовой)

4) Курс (Тип данных: Числовой)

Таблица Студенты

1) Код (Тип данных: Счетчик)

2) ФИО студента (Тип данных: Текст)

3) Код группы (Тип данных: Числовой)

4) Пол (Тип данных: Числовой)

Таблица Оценки

1) Код студента (Тип данных: Счетчик)

2) ФИО студента (Тип данных: Текст)

3) Пол (Тип данных: Числовой)

4) Номер группы (Тип данных: Числовой)

5) Специальность (Тип данных: Числовой)

6) Курс обучения (Тип данных: Числовой)

7) Предмет 1 (Тип данных: Текст)

8) Оценка 1 (Тип данных: Числовой)

9) Предмет 2 (Тип данных: Текст)

10) Оценка 2 (Тип данных: Числовой)

11) Предмет 3 (Тип данных: Текст)

12) Оценка 3 (Тип данных: Числовой)

13) Предмет 4 (Тип данных: Текст)

14) Оценка 4 (Тип данных: Числовой)

 

 

База данных проектировалась в программе Microsoft Access.

Строение и связи в базе данных вы можете увидеть на рис. 1,

Рис. 1

Таблица Экзамен

 

 

Таблица Предмет

Таблица Специальность

Таблица Группа

Таблица Студенты

Таблица Оценки

 

Пример работы программы

Главное окно Form1 (рис. 2) . Для начала работы выбираем нужную вкладку и начинаем работу.

Рис. 2 Вкладка Экзамены

Во вкладки Экзамены добавляем/удаляем/изменяем/сохраняем параметры.

Рис. 3 Вкладка предметы

Во вкладки Предмет добавляем/удаляем/изменяем/сохраняем параметры.

 

Рис. 4 Вкладка Специальности

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

Рис. 5 Вкладка Группы

Во вкладки Группы добавляем/удаляем/изменяем/сохраняем параметры.

 

Рис. 6 Вкладка Студенты

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

 

Рис. 7 Вкладка Оценки

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

 

Рис. 8 Оценки (после обновления БД)

 


Список литературы

 

1. http://msdn.microsoft.com/ru-RU/

2. http://ru.wikipedia.org/

3. http://www.cyberforum.ru/


4.

Приложение

Класс Form1

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace exam_supa

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

 

private void examBindingNavigatorSaveItem_Click(object sender, EventArgs e)

{

this.Validate();

this.examBindingSource.EndEdit();

this.tableAdapterManager.UpdateAll(this.databaseDataSet);

 

}

 

private void Form1_Load(object sender, EventArgs e)

{

// TODO: данная строка кода позволяет загрузить данные в таблицу "databaseDataSet.mark". При необходимости она может быть перемещена или удалена.

this.markTableAdapter.Fill(this.databaseDataSet.mark);

// TODO: данная строка кода позволяет загрузить данные в таблицу "databaseDataSet.student". При необходимости она может быть перемещена или удалена.

this.studentTableAdapter.Fill(this.databaseDataSet.student);

// TODO: данная строка кода позволяет загрузить данные в таблицу "databaseDataSet.group". При необходимости она может быть перемещена или удалена.

this.groupTableAdapter.Fill(this.databaseDataSet.group);

// TODO: данная строка кода позволяет загрузить данные в таблицу "databaseDataSet.spec". При необходимости она может быть перемещена или удалена.

this.specTableAdapter.Fill(this.databaseDataSet.spec);

// TODO: данная строка кода позволяет загрузить данные в таблицу "databaseDataSet.subject". При необходимости она может быть перемещена или удалена.

this.subjectTableAdapter.Fill(this.databaseDataSet.subject);

// TODO: данная строка кода позволяет загрузить данные в таблицу "databaseDataSet.exam". При необходимости она может быть перемещена или удалена.

this.examTableAdapter.Fill(this.databaseDataSet.exam);

 

comboBox1.SelectedIndex = 0;

}

 

enum aTable { Ex, Gr, Mk, Sp, St, Sb, dEx, dSt }

 

private int KeyToIndex(int key, aTable tab)

{

int i;

switch(tab)

{

// exam table

case aTable.Ex:

for(i=0;i<examDataGridView.Rows.Count-1;i++)

{

if(Convert.ToInt32(examDataGridView.Rows[i].Cells[0].Value) == key)

return i;

}

break;

// group table

case aTable.Gr:

for(i=0;i<groupDataGridView.Rows.Count-1;i++)

{

if(Convert.ToInt32(groupDataGridView.Rows[i].Cells[0].Value) == key)

return i;

}

break;

// mark table

case aTable.Mk:

for(i=0;i<markDataGridView.Rows.Count-1;i++)

{

if(Convert.ToInt32(markDataGridView.Rows[i].Cells[0].Value) == key)

return i;

}

break;

// spec table

case aTable.Sp:

for(i=0;i<specDataGridView.Rows.Count-1;i++)

{

if(Convert.ToInt32(specDataGridView.Rows[i].Cells[0].Value) == key)

return i;

}

break;

// student

case aTable.St:

for(i=0;i<studentDataGridView.Rows.Count-1;i++)

{

if(Convert.ToInt32(studentDataGridView.Rows[i].Cells[0].Value) == key)

return i;

}

break;

// subject

case aTable.Sb:

for(i=0;i<subjectDataGridView.Rows.Count-1;i++)

{

if(Convert.ToInt32(subjectDataGridView.Rows[i].Cells[0].Value) == key)

return i;

}

break;

// datagridview1

case aTable.dSt:

for(i=0;i<dataGridView1.Rows.Count-1;i++)

{

if(Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value) == key)

return i;

}

break;

// datagridview2

case aTable.dEx:

for(i=0;i<dataGridView2.Rows.Count-1;i++)

{

if(Convert.ToInt32(dataGridView2.Rows[i].Cells[0].Value) == key)

return i;

}

break;

}

return -1;

}

 

private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)

{

this.Validate();

this.examBindingSource.EndEdit();

this.tableAdapterManager.UpdateAll(this.databaseDataSet);

}

 

private void tabPage6_Click(object sender, EventArgs e)

{

/*listBox1.Items.Clear();

int i;

for(i=0;i<studentDataGridView.Rows.Count-1;i++)

{

listBox1.Items.Add(studentDataGridView.Rows[i].Cells[1].Value);

}*/

}

 

private void updexam(int group)

{

dataGridView2.Rows.Clear();

int kurs = Convert.ToInt32(groupDataGridView.Rows[group].Cells[3].Value);

int spec = Convert.ToInt32(groupDataGridView.Rows[group].Cells[2].Value);

 

int i, j;

for(i=0;i<subjectDataGridView.Rows.Count-1;i++)

{

if(Convert.ToInt32(subjectDataGridView.Rows[i].Cells[2].Value) == kurs &&

Convert.ToInt32(subjectDataGridView.Rows[i].Cells[3].Value) == spec)

{

int t = Convert.ToInt32(subjectDataGridView.Rows[i].Cells[0].Value);

for(j=0;j<examDataGridView.Rows.Count-1;j++)

{

if(Convert.ToInt32(examDataGridView.Rows[j].Cells[1].Value) == t)

{

dataGridView2.Rows.Add(1);

int k = dataGridView2.Rows.Count-2;

dataGridView2.Rows[k].Cells[0].Value = examDataGridView.Rows[j].Cells[0].Value;

dataGridView2.Rows[k].Cells[1].Value = examDataGridView.Rows[j].Cells[2].Value;

dataGridView2.Rows[k].Cells[2].Value = subjectDataGridView.Rows[i].Cells[1].Value;

dataGridView2.Rows[k].Cells[3].Value = examDataGridView.Rows[j].Cells[3].Value;

}

}

}

}

//MessageBox.Show(group.ToString());

}

 

private void button1_Click(object sender, EventArgs e)

{

dataGridView1.Rows.Clear();

int i;

for(i=0;i<studentDataGridView.Rows.Count-1;i++)

{

dataGridView1.Rows.Add(1);

int j = dataGridView1.Rows.Count-2;

dataGridView1.Rows[j].Cells[0].Value = studentDataGridView.Rows[i].Cells[0].Value;

dataGridView1.Rows[j].Cells[1].Value = studentDataGridView.Rows[i].Cells[1].Value;

dataGridView1.Rows[j].Cells[2].Value = studentDataGridView.Rows[i].Cells[3].Value;

int t = KeyToIndex(Convert.ToInt32(studentDataGridView.Rows[i].Cells[2].Value), aTable.Gr);

dataGridView1.Rows[j].Cells[3].Value = groupDataGridView.Rows[t].Cells[1].Value;

int k = KeyToIndex(Convert.ToInt32(groupDataGridView.Rows[t].Cells[2].Value), aTable.Sp);

dataGridView1.Rows[j].Cells[4].Value = specDataGridView.Rows[k].Cells[1].Value + " ''"+specDataGridView.Rows[k].Cells[2].Value+"''";

dataGridView1.Rows[j].Cells[5].Value = groupDataGridView.Rows[t].Cells[3].Value;

 

for(int l=0;l<4;l++)

{

t = KeyToIndex(Convert.ToInt32(studentDataGridView.Rows[i].Cells[0].Value), aTable.St);

object sb = null;

if(markDataGridView.Rows[t].Cells[1+l*2].Value != DBNull.Value)

{

k = KeyToIndex(Convert.ToInt32(markDataGridView.Rows[t].Cells[1+l*2].Value), aTable.Ex);

int k1 = KeyToIndex(Convert.ToInt32(examDataGridView.Rows[k].Cells[1].Value), aTable.Sb);

sb = subjectDataGridView.Rows[k1].Cells[1].Value;

}

int mk = 0;

if(markDataGridView.Rows[t].Cells[2+l*2].Value != DBNull.Value) mk = Convert.ToInt32(markDataGridView.Rows[t].Cells[2+l*2].Value);

dataGridView1.Rows[j].Cells[6+l*2].Value = sb;

dataGridView1.Rows[j].Cells[7+l*2].Value = comboBox1.Items[mk].ToString();

}

}

}

 

private void button2_Click(object sender, EventArgs e)

{

int t = -1, ex = -1;

DataGridViewSelectedRowCollection scc = dataGridView1.SelectedRows;

if(scc != null && scc.Count > 0)

{

t = KeyToIndex(Convert.ToInt32(scc[0].Cells[0].Value), aTable.St);

}

if(t==-1)

{

MessageBox.Show("Не выбран студент!", "Внимание");

return;

}

scc = dataGridView2.SelectedRows;

if(scc != null && scc.Count > 0)

{

ex = Convert.ToInt32(scc[0].Cells[0].Value);

}

if(ex==-1)

{

MessageBox.Show("Не выбран экзамен!", "Внимание!");

return;

}

 

int mk;

mk = comboBox1.SelectedIndex;

int pos=1;

int i;

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

{

if(markDataGridView.Rows[t].Cells[1+i*2].Value != DBNull.Value)

{

if(Convert.ToInt32(markDataGridView.Rows[t].Cells[1+i*2].Value) == ex)

{

pos = 1+i*2;

break;

}

}

else

{

pos = 1+i*2;

break;

}

}

 

markDataGridView.Rows[t].Cells[pos].Value = ex;

markDataGridView.Rows[t].Cells[pos+1].Value = mk;

 

button1_Click(this, null);

}

 

private void dataGridView1_SelectionChanged(object sender, EventArgs e)

{

DataGridViewSelectedRowCollection scc = dataGridView1.SelectedRows;

if(scc != null && scc.Count > 0)

{

int t = KeyToIndex(Convert.ToInt32(scc[0].Cells[0].Value), aTable.St);

if(t!=-1)

{

int g = KeyToIndex(Convert.ToInt32(studentDataGridView.Rows[t].Cells[2].Value), aTable.Gr);

updexam(g);

}

}

}

 

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

this.Validate();

this.examBindingSource.EndEdit();

this.tableAdapterManager.UpdateAll(this.databaseDataSet);

}

 

private bool StringAsInt(string str)

{

char[] toa = str.ToCharArray();

for(int i=0;i<str.Length;i++)

{

if(toa[i] < (int)'0' || toa[i] > (int)'9')

return false;

}

return true;

}

 

private void button3_Click(object sender, EventArgs e)

{

if(textBox1.Text == "" || textBox2.Text == "" ||

comboBox2.SelectedIndex == -1)

{

MessageBox.Show("Не все поля заполнены!", "Внимание!");

return;

}

 

if(StringAsInt(textBox2.Text))

{

int t = Convert.ToInt32(textBox2.Text);

if(t<1 || t>groupDataGridView.Rows.Count-1)

{

MessageBox.Show("В базе данных нет группы с ключом: "+t.ToString()+"!", "Внимание");

return;

}

}

else

{

MessageBox.Show("Некорретный ввод в поле ''Код группы''!", "Внимание");

return;

}

 

studentBindingSource.AddNew();

int k = studentDataGridView.Rows.Count-2;

studentDataGridView.Rows[k].Cells[1].Value = textBox1.Text;

studentDataGridView.Rows[k].Cells[2].Value = textBox2.Text;

studentDataGridView.Rows[k].Cells[3].Value = comboBox2.SelectedItem.ToString();

 

}

 

private void studentDataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)

{

markBindingSource.AddNew();

}

 

private void toolStripMenuItem1_Click(object sender, EventArgs e)

{

DataGridViewSelectedRowCollection scc = studentDataGridView.SelectedRows;

if(scc != null && scc.Count > 0)

{

int key = Convert.ToInt32(scc[0].Cells[0].Value);

int i;

for(i=0;i<studentDataGridView.Rows.Count-1;i++)

{

if(Convert.ToInt32(studentDataGridView.Rows[i].Cells[0].Value) == key)

{

studentBindingSource.RemoveAt(i);

markBindingSource.RemoveAt(i);

return;

}

}

}

}

 

private void toolStripMenuItem2_Click(object sender, EventArgs e)

{

DataGridViewSelectedRowCollection scc = examDataGridView.SelectedRows;

if(scc != null && scc.Count > 0)

{

int key = Convert.ToInt32(scc[0].Cells[0].Value);

int i = KeyToIndex(key, aTable.Ex);

int j, l;

for(j=0;j<markDataGridView.Rows.Count-1;j++)

{

for(l=0;l<4;l++)

{

if(markDataGridView.Rows[j].Cells[1+l*2].Value != DBNull.Value)

{

if(Convert.ToInt32(markDataGridView.Rows[j].Cells[1+l*2].Value) == key)

{

markDataGridView.Rows[j].Cells[1+l*2].Value = DBNull.Value;

markDataGridView.Rows[j].Cells[2+l*2].Value = DBNull.Value;

}

}

}

}

examBindingSource.RemoveAt(i);

}

}

 

private void toolStripMenuItem3_Click(object sender, EventArgs e)

{

DataGridViewSelectedRowCollection scc = subjectDataGridView.SelectedRows;

bool t=false;

if(scc != null && scc.Count > 0)

{

int key = Convert.ToInt32(scc[0].Cells[0].Value);

int i = KeyToIndex(key, aTable.Sb);

int j;

for(j=0;j<examDataGridView.Rows.Count-1;j++)

{

if(examDataGridView.Rows[j].Cells[1].Value != DBNull.Value)

{

if(Convert.ToInt32(examDataGridView.Rows[j].Cells[1].Value) == key)

{

t = true;

}

}

}

if(t)

{

MessageBox.Show("Нельзя удалить предмет, с которым связан экзамен!", "Внимание");

}

else

{

subjectBindingSource.RemoveAt(i);

}

}

}

 

private void toolStripMenuItem4_Click(object sender, EventArgs e)

{

DataGridViewSelectedRowCollection scc = specDataGridView.SelectedRows;

if(scc != null && scc.Count > 0)

{

bool t = false;

int key = Convert.ToInt32(scc[0].Cells[0].Value);

int i = KeyToIndex(key, aTable.Sp);

int j;

for(j=0;j<groupDataGridView.Rows.Count-1;j++)

{

if(groupDataGridView.Rows[j].Cells[2].Value != DBNull.Value)

{

if(Convert.ToInt32(groupDataGridView.Rows[j].Cells[2].Value) == key)

{

t = true;

}

}

}

if(t)

{

MessageBox.Show("Нельзя удалить специальность, с которой связана(ы) группа(ы)!","Внимание");

}

else

{

specBindingSource.RemoveAt(i);

}

}

}

 

private void удалитьToolStripMenuItem_Click(object sender, EventArgs e)

{

DataGridViewSelectedRowCollection scc = groupDataGridView.SelectedRows;

if(scc != null && scc.Count > 0)

{

bool t = false;

int key = Convert.ToInt32(scc[0].Cells[0].Value);

int i = KeyToIndex(key, aTable.Gr);

int j;

for(j=0;j<groupDataGridView.Rows.Count-1;j++)

{

if(studentDataGridView.Rows[j].Cells[2].Value != DBNull.Value)

{

if(Convert.ToInt32(studentDataGridView.Rows[j].Cells[2].Value) == key)

{

t = true;

}

}

}

if(t)

{

MessageBox.Show("Нельзя удалить группу, с которой связан(ы) студент(ы)!","Внимание");

}

else

{

groupBindingSource.RemoveAt(i);

}

}

}

}

}