C#: DataGrid + Checkbox(Delete/Insert)

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

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

Исходные данные:

Имеем две таблицы - ordertable и ordertable1 со столбцами (OrderID(int), login(nvchar), StockID(int), postedDate(nvchar), Quantity(int)).

Примечание: В скобках даны типы данных столбцов

Поставленная задача: отмеченные флажками несколько строк из таблицы ordertable, нажатием на кнопку btnInsert скопировать в таблицу ordertable1.

Далее отмечаем несколько строк в таблице dgOrdertable1, и нажатием на кнопку btnDelete удаляем их.

Помещаем на WebForm1 две кнопки и две таблицы, как показано на рис. 1

Рис. 1

В каждой таблице создаем колонку CheckBox-ов (см. код страницы внизу)

Как видите из кода, таблица dgOrdertable связана с ordertable, а dgOrdertable1 связана с ordertable1. На форму перенесен sqlDataAdapter1, который связан с ordertable, и перенесен sqlDataAdapter2 - связан с ordertable1. Сгенерирован dataSet11,к которому привязаны dgOrdertable и dgOrdertable1.

Код загрузки страницы:

 private void Page_Load( object sender, System.EventArgs e)
		{
			 if (!IsPostBack)
			{
				
				sqlDataAdapter1.Fill(dataSet11);
				sqlDataAdapter2.Fill(dataSet11);
				dgOrdertable.DataBind();
				dgOrdertable1.DataBind();
			}
		}

Далее обработчик события копирования строки из dgOrdertable в dgOrdertable1

 private void btnInsert_Click( object sender, System.EventArgs e)
{
 int OrderID;
 int StockID;
 string login;
 string postedDate;
 int Quantity;			
CheckBox chkbox = new CheckBox();
 for ( int i =0; i < dgOrdertable.Items.Count-1; i++) 
{
 foreach (DataGridItem dgi in dgOrdertable.Items) 
{
 if (((CheckBox) dgi.FindControl("chkbox")).Checked) 
{				
login=dgOrdertable.Items[i].Cells[2].Text;
postedDate=dgOrdertable.Items[i].Cells[4].Text;
OrderID=System.Convert.ToInt16(dgOrdertable.Items[i].Cells[1].Text);
StockID=System.Convert.ToInt16(dgOrdertable.Items[i].Cells[3].Text);
Quantity=System.Convert.ToInt16(dgOrdertable.Items[i].Cells[5].Text);
// в sqlDataAdapter1 в InsertCommand в параметре CommandText "INSERT INTO ordertable 
//(OrderID, login, StockID, postedDate, Quantity) VALUES (@OrderID, @login, @StockID, //@postedDate, @Quantity)"

sqlDataAdapter2.InsertCommand.Parameters["@OrderID"].Value=OrderID;
sqlDataAdapter2.InsertCommand.Parameters["@login"].Value=login;
sqlDataAdapter2.InsertCommand.Parameters["@StockID"].Value=StockID;
sqlDataAdapter2.InsertCommand.Parameters["@postedDate"].Value=postedDate;
sqlDataAdapter2.InsertCommand.Parameters["@Quantity"].Value=Quantity;
sqlConnection1.Open();	
sqlDataAdapter2.InsertCommand.ExecuteNonQuery();
sqlConnection1.Close();
}
i++;
}					
sqlDataAdapter1.Fill(dataSet11);
sqlDataAdapter2.Fill(dataSet11);
dgOrdertable.DataBind();
dgOrdertable1.DataBind();
}
}

Обработчик события удаления отмеченных строк из dgOrdertable1.

 private void btnDelete_Click( object sender, System.EventArgs e)
{
 int OrderID;
 int StockID;
 string login;
CheckBox chkbox = new CheckBox();
 for ( int i =0; i < dgOrdertable1.Items.Count; i++) 
{
 foreach (DataGridItem dgi in dgOrdertable1.Items) 
{
 if (((CheckBox) dgi.FindControl("chkbox")).Checked) 
{	
OrderID=System.Convert.ToInt16(dgOrdertable1.Items[i].Cells[1].Text);
login=dgOrdertable1.Items[i].Cells[2].Text;
StockID=System.Convert.ToInt16(dgOrdertable1.Items[i].Cells[3].Text);

// в sqlDataAdapter1 в DeleteCommand в параметре CommandText "DELETE FROM ordertable1 //WHERE (OrderID = @OrderID) AND (login = @login) AND (StockID = @StockID)" sqlDataAdapter2.DeleteCommand.Parameters["@OrderID"].Value=OrderID; sqlDataAdapter2.DeleteCommand.Parameters["@login"].Value=login; sqlDataAdapter2.DeleteCommand.Parameters["@StockID"].Value=StockID; sqlConnection1.Open(); sqlDataAdapter2.DeleteCommand.ExecuteNonQuery(); sqlConnection1.Close(); } i++; } sqlDataAdapter1.Fill(dataSet11); sqlDataAdapter2.Fill(dataSet11); dgOrdertable.DataBind(); dgOrdertable1.DataBind(); } }

Теперь компилируем и… Вуаля… Работаем.

Вот и все. Весь приведенный здесь код полностью работающий.

Удачи всем.

 


Страница сайта http://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=4903