面板设置为隐藏然后可见会丢失文本框值



我希望我能正确地解释这一点。

我有一个网格,是我们第三方购物车软件的一部分。这个网格有一排数量文本框,客户可以在其中输入他们想要购买的每件东西的数量。

我把这个网格放在一个面板里,这样我就可以用打开或关闭它

myPanel.Visible=true;

使用上面的代码方法,我还有一个要显示和隐藏的按钮。

如果我在文本框中输入一个值,然后单击隐藏按钮,然后单击显示按钮,当面板再次出现时,值为零。如果我随后重新加载页面(浏览器重新加载),则该值将返回原来的值。这是一个很好的魔术,但不是我需要的。我做错了什么?

最终,我想在日历隐藏但尚未播放时从日历中选择一个日期。。。只有显示/隐藏按钮。

感谢

这听起来像是ASP.NET WebFormsViewState 的正确行为

  1. 首页加载:面板可见,并且面板加载了其初始值
  2. 隐藏面板:一旦按下按钮,就会出现回帖。myPanel被设置为不可见,这在服务器端意味着没有生成面板的HTML(这可以通过查看生成的HTML来确认)
  3. 显示面板:再次发生回发。但是,由于在上一步中未渲染这些值,因此它们在ViewState中不可用于重新填充面板
  4. 重新加载页面:这将重新启动过程(与步骤1相同)

一个可能的解决方案是在客户端隐藏面板(<div)。这还有一个好处,即不必往返于服务器,只需启用/禁用面板。

您的代码应该如下所示。。。

显示和隐藏按钮定义显示/隐藏面板是Java脚本。这意味着在服务器端没有按钮点击事件的处理程序。。。这种方法建议正常且快速。。


示例ASPX代码

<script type="text/javascript" language="javascript">
    function Hide() {
        var ID = document.getElementById('pnl');
        ID.style.display = 'none';
        return false;
    }
    function Show() {
        var ID = document.getElementById('btnHide');
        ID.style.display = 'block';
        return false;
    }
</script>
<asp:panel id="pnl" runat="server">
    <asp:GridView ID="grd" runat="server">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Label ID="ed" runat="server" Text='<%#Eval("name") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</asp:panel>
<asp:button text="Hide" runat="server" id="Button1" onclientclick="return Hide();" />
<asp:button text="Show" runat="server" id="btnShow" onclientclick="return Show();" />

后面的示例代码

public partial class Default4 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            using (DataTable Dt = new DataTable())
            {
                using (DataColumn Dc = new DataColumn("Name"))
                {
                    Dt.Columns.Add(Dc);
                    DataRow dr = Dt.NewRow();
                    dr["name"] = "1";
                    Dt.Rows.Add(dr);
                    dr = Dt.NewRow();
                    dr["name"] = "2";
                    Dt.Rows.Add(dr);
                    grd.DataSource = Dt;
                    grd.DataBind();
                }
            }
        }
    }
}

最新更新