Написать эту статью меня побудило старательное игнорирование описание процедуры использования 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();
}
}
Теперь компилируем и… Вуаля… Работаем.
Вот и все. Весь приведенный здесь код полностью работающий.
Удачи всем. |