c# - 即使 ReadOnly 设置为 false,ASP.NET GridView 中的 CheckBoxField 列也会被禁用

标签 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>

有人能说说怎么弄吗?

最佳答案

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

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

1。添加编辑链接

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

alt text

2。添加一个带有 CheckBox 的 TemplateField

<columns>里面标签,您可以添加您自己设置数据绑定(bind)的模板字段,例如

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

alt text
(来源:philippursglove.com)

此复选框将被启用,但您需要自己完成工作以将任何更改反射(reflect)回数据库。只要您可以获得数据库 key ,这就很简单,因为您需要运行 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;
    }
    ...
    }

关于c# - 即使 ReadOnly 设置为 false,ASP.NET GridView 中的 CheckBoxField 列也会被禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3084419/

相关文章:

asp.net - session 状态的 Azure 协同定位缓存最大项目大小

python - Selenium WebDriver python : checkbox cannot click, 默认复选框不可见,悬停时可见

c# - 使用 C# 从 Oracle DB 返回 Int 值

c# - 基本类型的自定义鉴别器 = null : "but does not have a discriminator value configured"

asp.net - 可以在ajax工具包日历扩展器中添加 'None'选项吗?

c# - Asp.Net WebApi OWIN 身份验证

javascript - 判断checkbox是否有变化

javascript - 通过 javascript 确定更改了哪些字段

c# - 使用 Ninject 时如何模拟通用 Get 方法并使用 SetUp 方法填充模拟数据库?

c# - 通过 Web 应用程序将文件上传到 SharePoint Online 库