Это по замыслу; строки в GridView по умолчанию не редактируются.
Есть два способа решения этой проблемы:
1. Добавить ссылку для редактирования
В теге GridView добавьте AutoGenerateEditButton="True"
. Когда ваш GridView визуализируется в браузере, вы должны найти гиперссылку с надписью «Изменить». Если вы щелкнете по нему, поля в вашем GridView станут редактируемыми, и ссылка «Изменить» станет двумя ссылками: одна для сохранения ваших изменений в базе данных, а другая для их отмены. Используя этот метод, вы можете выполнить всю работу по подключению изменений в GridView к базе данных, в зависимости от того, как вы делаете привязку данных. В этом примере используется элемент управления SqlDataSource.
альтернативный текст http://philippursglove.com/stackoverflow/checkboxgridview1.png
альтернативный текст http://philippursglove.com/stackoverflow/checkboxgridview2.png
2. Добавьте TemplateField с CheckBox внутри него
Внутри тега <columns>
вы можете добавить TemplateFields, для которых вы устанавливаете привязку данных, например,
<asp:TemplateField HeaderText="Discontinued">
<ItemTemplate>
<asp:CheckBox runat="server" ID="DiscontinuedCheckBox"
Checked='<%# Eval("Discontinued") %>' AutoPostback="true"
OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
альтернативный текст http://philippursglove.com/stackoverflow/checkboxgridview3.png
Этот флажок будет включен, но вам нужно выполнить работу самостоятельно, чтобы отразить любые изменения в базе данных. Это просто, если вы можете получить ключ базы данных, так как вам нужно будет запустить оператор UPDATE
в какой-то момент, и вы захотите запустить его в правильном ряду! Вот два способа сделать это:
В теге Gridview добавьте DataKeyNames="MyDatabasePrimaryKey"
. Затем в обработчике CheckedChanged
вам нужно выяснить, в какой строке вы находитесь, и найти это в массиве DataKeys
.
protected void DiscontinuedCheckBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox DiscontinuedCheckBox;
SqlConnection conn;
SqlCommand cmd;
int productId;
GridViewRow selectedRow;
// Cast the sender object to a CheckBox
DiscontinuedCheckBox = (CheckBox)sender;
// We can find the row we clicked the checkbox in by walking up the control tree
selectedRow = (GridViewRow)DiscontinuedCheckBox.Parent.Parent;
// GridViewRow has a DataItemIndex property which we can use to look up the DataKeys array
productId = (int)ProductGridView.DataKeys[selectedRow.DataItemIndex].Value;
using (conn = new SqlConnection(ProductDataSource.ConnectionString))
{
cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
if (DiscontinuedCheckBox.Checked)
{
cmd.CommandText = "UPDATE Products SET Discontinued = 1 WHERE ProductId = " + ProductId.ToString();
}
else
{
cmd.CommandText = "UPDATE Products SET Discontinued = 0 WHERE ProductId = " + ProductId.ToString();
}
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
Или вы можете добавить ключ в элемент управления HiddenField:
<asp:TemplateField HeaderText="Discontinued">
<ItemTemplate>
<asp:hiddenfield runat="server" id="ProductIdHiddenField"
Value='<%# Eval("ProductID") %>' />
<asp:CheckBox runat="server" ID="DiscontinuedCheckBox"
Checked='<%# Eval("Discontinued") %>'
AutoPostback="true"
OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
Код:
protected void DiscontinuedCheckBox_CheckedChanged(object sender, EventArgs e)
{
CheckBox DiscontinuedCheckBox;
HiddenField ProductIdHiddenField;
DiscontinuedCheckBox = (CheckBox)sender;
ProductIdHiddenField = (HiddenField)DiscontinuedCheckBox.Parent.FindControl("ProductIdHiddenField");
using (conn = new SqlConnection(ProductDataSource.ConnectionString))
{
...
if (DiscontinuedCheckBox.Checked)
{
cmd.CommandText = "UPDATE Products SET Discontinued = 1 WHERE ProductId = " + ProductIdHiddenField.Value;
}
...
}