【问题标题】:Checkbox on GridView always returning FalseGridView 上的复选框总是返回 False
【发布时间】:2012-02-16 06:41:03
【问题描述】:

我有一个GridView,第一列有一个复选框:

<asp:GridView ID="dgNumeradores" runat="server" AutoGenerateColumns="False" CellPadding="4" DataKeyNames="ItemID">
    <Columns>
        <asp:TemplateField HeaderText="Seleccionar">
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chkChecked" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField HeaderText="Item" DataField="Description">
        </asp:BoundField>
        <asp:BoundField HeaderText="Plantilla" DataField="Template">
        </asp:BoundField>
    </Columns>
</asp:GridView>

现在在后面的代码中,我尝试更新作为 GridView 的数据源的 DataTable 上的 Checked 列(因为如上所示,Checkbox 列未绑定到数据源你可能知道的原因。):

Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    Try
        For Each dr As GridViewRow In Me.dgNumeradores.Rows
            Me.itemsNumTable.Select("ItemID = '" & dgNumeradores.DataKeys(dr.RowIndex).Value & "'")(0)("Checked") = DirectCast(dr.Cells(0).FindControl("chkChecked"), CheckBox).Checked
        Next
        'Some more unimportant-for-this-question code
    Catch ex As Exception
        tableInfo.ShowError(ex.Message)
    End Try
End Sub

问题是Checkbox.Checked 总是返回False。

在这种情况下如何获得复选框的选中状态?或者更新上述专栏的最佳方法是什么?

附:请注意,单击复选框不会回发。在用户单击 Save 之前,页面上没有任何反应(这是预期的行为)。

【问题讨论】:

    标签: asp.net vb.net gridview checkbox


    【解决方案1】:

    您是否在页面加载中绑定了 GridView?如果是这种情况,请使用 IsPostBack

    IF Not IsPostBack Then
       DataBind()
    End IF
    

    【讨论】:

    • 绑定没有问题。 Gridview 完美填充,复选框保持选中状态(视觉上)。我只是不知道如何正确查询他们的状态。
    • 您是否在页面级别或父控件中禁用了 ViewState。您的方法似乎是正确的。问题是,您在页面生命周期中的哪个位置或 GridView 控件的哪个事件中处理行?能否附上代码?
    【解决方案2】:

    您不应该将 AutoPostback 属性设置为 true 吗?

    <asp:CheckBox runat="server" ID="chkChecked" AutoPostback="true" />
    

    【讨论】:

    • 我不知道 :s 我对 asp 不太熟悉。但是当我将 AutoPostBack 设置为 true 时,在 PostBack 上复选框会清除。
    【解决方案3】:

    我的 GridView 中有两列。第一列包含文件名, 第二列包含复选框。一旦用户选择了任意 复选框的数量,然后通过单击按钮选择的文件可以 已下载。

    我的标记如下

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
        <Columns>
                <asp:BoundField HeaderText="Available Schemas" 
                    DataField="SchemaFileName" 
                    SortExpression="UserId">
                </asp:BoundField>
                <asp:TemplateField HeaderText="Select Schema">
                    <ItemTemplate>
                        <asp:CheckBox runat="server" ID="SelectedFiles"  checked= '<%# Eval("checkValue") %>'/>
                    </ItemTemplate>
                </asp:TemplateField>
        </Columns>
    </asp:GridView>
    

    我的 CodeBehind 部分如下

    protected void Page_Load(object sender, EventArgs e)
    {
        GenerateDownloadLinks();
    
        if (!IsPostBack)
        { 
        GridView1.DataSource = listOfData;
        GridView1.DataBind();
        }
    }
    

    listOfData 在 GenerateDownloadLinks() 中填充,然后绑定到 GridView1。

    一旦用户选择文件并点击下载,我的代码就会循环执行 GridView 的行,当 CheckBox 被选中时,它会更新最初的 数据条目的 false 值,以确保哪些文件可以用于 下载。

    protected void GetFiles_Click(object sender, EventArgs e)
    {
        int i = 0;
        foreach (GridViewRow row in GridView1.Rows)
        {
            CheckBox chkRow = (row.Cells[1].FindControl("SelectedFiles") as CheckBox);
            if (chkRow.Checked)
            {
                listOfData[i].CheckValue = true;
            }
            i++;
        }
    }
    

    【讨论】:

      【解决方案4】:

      即使没有绑定到 Page.IsPostBack 块中,Gridview 也能完美填充,但这里的复选框将始终返回 false。

      在Page.IsPostBack中绑定gridview,它会运行得非常好。

      使用下面的代码 IF Not IsPostBack Then 数据绑定() 中频结束

      然后 Checkbox.Checked 将返回 true。

      【讨论】:

        猜你喜欢
        • 2021-08-24
        • 2019-03-13
        • 1970-01-01
        • 2020-06-16
        • 2014-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多