即使ReadOnly设置为false,也禁用ASP.NET GridView中的CheckBoxField列

时间:2010-06-21 12:03:18

标签: asp.net gridview checkbox 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>

有人能说出如何解决这个问题吗?

2 个答案:

答案 0 :(得分:40)

这是设计上的;默认情况下,GridView中的行不可编辑。

有两种方法可以解决这个问题:

1。添加编辑链接

在GridView代码中,添加AutoGenerateEditButton="True"。当您的GridView在浏览器中呈现时,您现在应该找到标记为“编辑”的超链接。如果单击它,GridView中的字段将变为可编辑,编辑链接将变为两个链接,一个用于保存对数据库的更改,另一个用于丢弃它们。使用此方法,可以为您完成将GridView中的更改连接到数据库的所有管道,具体取决于您执行数据绑定的方式。此示例使用SqlDataSource控件 alt text http://philippursglove.com/stackoverflow/checkboxgridview1.png alt text http://philippursglove.com/stackoverflow/checkboxgridview2.png

2。添加一个带有CheckBox的TemplateField

<columns>标记内,您可以添加自己设置数据绑定的TemplateFields,例如。

<asp:TemplateField HeaderText="Discontinued">  
    <ItemTemplate>  
        <asp:CheckBox runat="server" ID="DiscontinuedCheckBox" 
            Checked='<%# Eval("Discontinued")  %>' AutoPostback="true" 
            OnCheckedChanged="DiscontinuedCheckBox_CheckedChanged" />  
    </ItemTemplate>  
</asp:TemplateField>

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();
    }
}

或者,您可以在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;
    }
    ...
    }

答案 1 :(得分:1)

PhilPursglove解决方案适用于我(即使是嵌套的grivview)。谢谢!

我的完整代码(修改为使用控制树获取grivview,因为我无法直接访问netest gridview因为动态创建):

protected void Cb_IsApprovedByManagement_CheckChanged(object sender, EventArgs e)
    {
        CheckBox cb = (CheckBox)sender;

        // find the row we clicked the checkbox in by walking up the control tree
        GridViewRow selectedRow = (GridViewRow)cb.Parent.Parent;
        GridView gridView = (GridView)selectedRow.Parent.Parent;

        //  look up the DataKeys array
        int QuestionID_Current = (int)gridView.DataKeys[selectedRow.DataItemIndex].Value;

        // change value
        QuestionManager.ToggleActivity(QuestionManager.GetQuestion(QuestionID_Current));