GridView上的复选框始终返回False

时间:2012-01-22 16:51:34

标签: asp.net vb.net gridview checkbox

我在第一列上有一个带有复选框的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>

现在在后面的代码中,我尝试更新DataTable上的 Checked 列,作为GridView的数据源(因为,如上所示,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

如何在此方案中获取Checkbox的已检查状态?或者更新上述专栏的最佳方法是什么?

P.S。请注意,单击复选框不会回发。在用户点击Save之前,页面上没有任何内容发生(这是预期的行为)。

4 个答案:

答案 0 :(得分:8)

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

IF Not IsPostBack Then
   DataBind()
End IF

答案 1 :(得分:2)

您是否应将AutoPostback属性设置为true?

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

答案 2 :(得分:0)

我的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被选中时,它会更新最初的 数据条目的错误值,以确保应该使哪些文件可用 下载。

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++;
    }
}

答案 3 :(得分:-1)

即使在Page.IsPostBack块中未绑定Gridview,Gridview也会完美填充,但此处复选框将始终返回false。

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

使用以下代码 如果不是IsPostBack然后    的DataBind() 结束IF

然后Checkbox.Checked将返回true。