【问题标题】:Panel set to hidden and then visible loses textbox values面板设置为隐藏然后可见会丢失文本框值
【发布时间】:2012-02-18 05:35:51
【问题描述】:

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

我有一个网格,它是我们 3rd 方购物车软件的一部分。该网格有一排数量文本框,客户可以在其中输入他们想购买的每种物品的数量。

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

myPanel.Visible=true;

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

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

最终我想在日历中选择一个隐藏的日期,但它还没有发挥作用......只是显示/隐藏按钮。

谢谢

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢菲利普的解释。这很有帮助。你让我有不同的想法。我最终在我的 CSS 中添加了 2 个名为 Hide 和 Show 的类,它们做了一个 display:none,然后从服务器端将 pnlMyPanel.CssClass 设置为正确的类。再次感谢!
    • @Deverill,很高兴我能提供帮助。
    【解决方案2】:

    您的代码应如下所示...

    显示和隐藏按钮定义以显示/隐藏面板是在 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();
                    }
                }
            }
    
        }
    }
    

    【讨论】:

    • 感谢您抽出宝贵时间创建示例。
    • 当时,并不是真的,因为我正在探索另一种方法。事实证明,我对您提供的内容有新的需求。谢谢。 +1
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2020-02-28
    • 2014-04-15
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-09
    相关资源
    最近更新 更多