bra*_*her 24 c# asp.net checkbox gridview readonly
我有一个带有两个CheckBoxField列的GridView.它们都将ReadOnly属性设置为false,但为它们生成的html代码具有属性disabled ="disabled".所以价值无法改变.
生成的HTML示例:
<span disabled="disabled"><input id="ctl00_ContentBody_GridView_ctl02_ctl01" type="checkbox" name="ctl00$ContentBody$GridView$ctl02$ctl01" checked="checked" disabled="disabled" /></span>
Run Code Online (Sandbox Code Playgroud)
任何人都可以说如何解决这个问题?
Phi*_*ove 40
这是设计的; 默认情况下,GridView中的行不可编辑.
有两种方法可以解决这个问题:
在GridView标记中,添加AutoGenerateEditButton="True".当您的GridView在浏览器中呈现时,您现在应该找到标记为"编辑"的超链接.如果单击它,GridView中的字段将变为可编辑,编辑链接将变为两个链接,一个用于保存对数据库的更改,另一个用于丢弃它们.使用此方法,可以为您完成将GridView中的更改连接到数据库的所有管道,具体取决于您执行数据绑定的方式.此示例使用SqlDataSource控件.
alt text http://philippursglove.com/stackoverflow/checkboxgridview1.png
替代文字http://philippursglove.com/stackoverflow/checkboxgridview2.png
在<columns>标签内部,您可以添加为自己设置数据绑定的TemplateFields,例如
<asp:TemplateField HeaderText="Discontinued">
<ItemTemplate>
<asp:CheckBox runat="server" ID="DiscontinuedCheckBox"
Checked='<%# Eval("Discontinued") %>' AutoPostback="true"
OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
Run Code Online (Sandbox Code Playgroud)
alt text 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();
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以在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>
Run Code Online (Sandbox Code Playgroud)
码:
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;
}
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40084 次 |
| 最近记录: |