Gridview 中 TemplateField 中的复选框在回发时丢失

Posted

技术标签:

【中文标题】Gridview 中 TemplateField 中的复选框在回发时丢失【英文标题】:Checkbox in TemplateField in Gridview loses checked on postback 【发布时间】:2010-12-07 05:19:37 【问题描述】:

我有一个带有模板字段的网格视图。在该模板字段中是一个复选框。我在 gridview 之外有一个提交按钮来分配已检查的记录。在回发时,没有复选框注册为被选中。这是我的代码:

<Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox ID="cb" Checked="false" runat="server" />
                        <asp:Label ID="lblCFID" runat="server" Visible="false" Text='<%# Eval("ID") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField HeaderStyle-HorizontalAlign="Center" DataField="Name" HeaderText="Name" />
                <asp:BoundField HeaderStyle-HorizontalAlign="Center" DataField="DOB" HeaderText="Date of Birth" />
                <asp:BoundField HeaderStyle-HorizontalAlign="Center" HeaderText="Gender" DataField="Gender"  />
                <asp:BoundField HeaderStyle-HorizontalAlign="Center" HeaderText="Status" DataField="Status"  />
                <asp:BoundField HeaderStyle-HorizontalAlign="Center" HeaderText="Plan Name" DataField="PlanName"  />
                <asp:BoundField HeaderStyle-HorizontalAlign="Center" HeaderText="Type" DataField="ControlType"  />
                <asp:BoundField HeaderStyle-HorizontalAlign="Center" HeaderText="Date of Service" dataformatstring="0:MMMM d, yyyy" htmlencode="false" DataField="DateofService"  />
            </Columns>

protected void AssignRecords(object sender, EventArgs e)

    int Rows = gvASH.Rows.Count;
    for (int i = 0; i < Rows; i++)
    
        //CheckBoxField cb = ((CheckBoxField)gvASH.Rows[i].Cells[1]).;
        CheckBox cb = (CheckBox)gvASH.Rows[i].Cells[0].FindControl("cb");
        Label lblID = (Label)gvASH.Rows[i].Cells[0].FindControl("lblCFID");
        if (cb.Checked == true)
        

            string ID = lblID.Text;
            //Assign Code
        
    

我在字符串 ID = lblID.Text 上设置了断点;但它永远不会找到任何已检查的内容。

【问题讨论】:

我正在使用 C#,但这个来自 VB.Net 中的 asp.net 网站的示例基本上正在做我正在做的事情:asp.net/Learn/data-access/tutorial-52-vb.aspx 所以我知道这是可能的,我只是不这样做不知道为什么它对我不起作用。 页面生命周期何时是您分配的方法被调用? 在此处查看解决方案,您需要保留选择复选框highoncoding.com/Articles/… 【参考方案1】:

我认为你缺少的是,当你点击按钮并且你的页面被回发时,你重新绑定到 gridview,你需要在这种情况下绑定像

 if (!Page.IsPostBack)
    
        GridView1.DataSourceID = "yourDatasourceID";
        GridView1.DataBind();
    

【讨论】:

你说得对,我只是在搜索方法上放了一个断点,它又被调用了。我必须追查它是从哪里调用的。【参考方案2】:

在回发时,GridView 的内容是从 page_init 和 page_load 之间的回发 Viewstate 数据重新创建的。或许可以尝试在 page_load 中检查您的 Gridview 以查看其中的内容。

【讨论】:

【参考方案3】:

设置复选框的自动回发属性

AutoPostBack="true" 

【讨论】:

以上是关于Gridview 中 TemplateField 中的复选框在回发时丢失的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GridView 中隐藏 TemplateField 列

使用 jquery 或 javascript 在 GridView 的 TemplateField 中查找控件

Gridview 中 TemplateField 中的复选框在回发时丢失

ASP.Net GridView 和 TemplateField 可见性 - false 但 ItemTemplate 仍在执行

gridview编辑模板中没有itemtemplate

OnCheckedChanged事件根本没有在GridView中触发