C# 文本框在回发时失去价值

C# 文本框在回发时失去价值,c#,javascript,asp.net,C#,Javascript,Asp.net,我的网页上有大约4个文本框…一些是asp:TextBox,而另一些是input type=“text” 输入文本框通过javascript弹出日历控件填充,而asp.net文本框通过键入填充。这些文本框的初始值从数据库中检索 当用户更改这些值时,在单击“提交”按钮后,这些值不会被保存,文本框将被清除。请帮助解决这一困惑。谢谢 谢谢你的回复,但它仍然不起作用 我已将此代码放入我的页面加载事件中 if (Page.IsPostBack) { i

我的网页上有大约4个文本框…一些是asp:TextBox,而另一些是input type=“text”

输入文本框通过javascript弹出日历控件填充,而asp.net文本框通过键入填充。这些文本框的初始值从数据库中检索

当用户更改这些值时,在单击“提交”按钮后,这些值不会被保存,文本框将被清除。请帮助解决这一困惑。谢谢

谢谢你的回复,但它仍然不起作用

我已将此代码放入我的页面加载事件中

if (Page.IsPostBack)
            {
                if (ViewState["stock"] != null)
                    TextBoxMaterial.Text = ViewState["stock"].ToString();

                if (ViewState["supplier"] != null)
                    TextBoxSupplier.Text = ViewState["supplier"].ToString();

                if(ViewState["matTime"] != null)
                    TextBoxMatTime.Text = ViewState["matTime"].ToString();

                if(ViewState["prodTime"] != null)
                    TextBoxProdTime.Text = ViewState["prodTime"].ToString();

                if (ViewState["shipTime"] != null)
                    TextBoxShipTime.Text = ViewState["shipTime"].ToString();

                if(ViewState["cmr"] != null)
                    cmrDue.Value = ViewState["cmr"].ToString();

                if(ViewState["kc"] != null)
                    kcDue.Value = ViewState["kc"].ToString();

}
并将下面的代码放入按钮的onclick事件中

ViewState["stock"] = TextBoxMaterial.Text;
            ViewState["supplier"] = TextBoxSupplier.Text;
            ViewState["matTime"] = TextBoxMatTime.Text;
            ViewState["prodTime"] = TextBoxProdTime.Text;
            ViewState["shipTime"] = TextBoxShipTime.Text;
            ViewState["cmr"] = cmrDue.Value.ToString();
            ViewState["kc"] = kcDue.Value.ToString();

            string prodLine = DDProdLine.SelectedValue;
            string stock1 = DDMaterial.SelectedValue;
            string stock2 = ViewState["stock"].ToString();
            string supplier = ViewState["supplier"].ToString();
            string billet = RBBillet.SelectedValue;
            string matTime1 = ViewState["matTime"].ToString();
            string matTime2 = DDMatTime.SelectedValue;
            string prodTime1 = ViewState["prodTime"].ToString();
            string prodTime2 = DDProdTime.SelectedValue;
            string shipTime1 = ViewState["shipTime"].ToString();
            string shipTime2 = DDShipTime.SelectedValue;

            CultureInfo cultureInfo = CultureInfo.CurrentCulture;
            string format = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern.ToString();
            string cmr = ViewState["cmr"].ToString();
            string kc = ViewState["kc"].ToString();
            string x = cmr.Substring(3, 2);
            string y = cmr.Substring(0, 2);
            string z = cmr.Substring(6, 4);
            string x1 = kc.Substring(3, 2);
            string y1 = kc.Substring(0, 2);
            string z1 = kc.Substring(6, 4);
            string finalCmr = x + "/" + y + "/" + z;
            string finalKC = x1 + "/" + y1 + "/" + z1;

            DateTime dt = DateTime.ParseExact(finalCmr, format, cultureInfo);
            DateTime cr = DateTime.ParseExact(finalKC, format, cultureInfo);

            string custDate = dt.ToString("dd/mm/yyyy");
            string kcDate = cr.ToString("dd/mm/yyyy");
            string id = Request.QueryString["id"];
            bool success = true;

            TextBoxProdComment1.Text = stock2 + "," + supplier + matTime1 + "," + prodTime1 + "," + shipTime1 + "," + custDate
                + "," + kcDate;

            try
            {
                 success = CRTopButtons.SaveProdTable(id, prodLine, stock1, supplier, billet, matTime1, matTime2, prodTime1,
                    prodTime2, shipTime1, shipTime2, custDate, kcDate);
            }
            catch (Exception e)
            {
                TextBoxProdComment2.Text = e.Message;
                System.Diagnostics.Trace.Write(e.StackTrace);
            }
文本框仍然清除,没有一个是只读的


请帮助

您的视图状态似乎已禁用。在页面指令中启用viewstate

  • 回发后,
    文本框不会保存其状态。ASP.NET不会为您处理此问题

  • 如果在Page_Load事件中放入代码以设置ASP.NET文本框的值,则不会保存回发的值,因为Page_Load发生在子控件状态在中恢复之后。ASP.NET已还原这些值,但您正在覆盖其还原的值

  • 修复#2的正确方法是在加载初始状态之前检查
    Page.IsPostBack
    ,如下所示:

    if ( !Page.IsPostBack )
    {
        // set the textbox initial states from the database
    }
    
    string strDate = Request.Form["id_of_input_element"].ToString();
    
  • 更新:

    有两种方法可以解决问题#1。可以使用Request.Form[]集合手动检索回发值,如下所示:

    if ( !Page.IsPostBack )
    {
        // set the textbox initial states from the database
    }
    
    string strDate = Request.Form["id_of_input_element"].ToString();
    

    您可以做的另一件事,如果可以的话,我建议您将
    元素更改为ASP.NET文本框,并将任何客户端Javascript事件连接到该文本框。然后ASP.NET将完全处理您的回发。

    我在寻找同一类型问题的答案时发现了这一点,现在我发现了我的问题,我认为它可以帮助其他人将其放在这里

    在我的例子中,我的控件的
    中有一个标签
    ,因此,如果您没有解决上述问题,我建议搜索
    中丢失的


    希望对某些情况有所帮助。

    我遇到的另一件事。。。如果您使用的是ASP.NET文本框控件(例如),并且它是只读或禁用的,回发将不会捕获更改的值

    根据我的问题,我正在通过javascript更改控件的值,即使浏览器进行了更改,在回发时,控件仍保留原始值

    似乎也是一个常见的问题。。。javascript启动自定义ASCX日历控件,结果由javascript注入文本框。不应允许用户直接修改文本框值

    string strDate = Request.Form["id_of_input_element"].ToString(); 
    

    我最终使用上面的方法,在回发之后,将控件“重置”为其更改的值

    我遇到了一个类似的问题,解决方案是“在回发过程中丢失javascript更改的数据” 这篇文章最能说明这一点

    例如,假设我们有一个asp.net控件:

    <asp:TextBox ID="txtName" runat="server" EnableViewState= "false" ReadOnly="true" /> 
    

    你完成了。只要不要忘记删除ReadOnly=“true”或Enable=“false”,如果您的目的是禁止编辑控件,只需使用上面的代码段即可。如果你打开了Enable=“false”,别忘了删除它。

    如果我知道你的要求是正确的,我想你是想让那些文本框成为只读的。如果是这样的话,我以前就遇到过这个问题,并通过使用C而不是ASP.NET使文本框只读来解决它,我只是添加了一些行,比如
    textboxName.Attributes.Add(“readonly”,“readonly”)在页面中加载,效果很好。我在这里找到的解决方案是在

    而不是
    TextBoxPassword.Text=Password

    使用


    你是如何拯救他们的?您能否用最少的代码重现问题并在此处共享该代码?标准输入控件是否在服务器上运行(即runat=“server”)?是否启用了viewstate?您可以添加javascript代码和页面加载代码吗?从数据库填充文本框的事件是什么?是在页面加载过程中吗?我猜您实际上是在页面加载中设置它们的值,从而清除回发上的值-如果(!IsPostBack),您可能需要添加一条语句在您试图从数据库设置值的代码周围。您确定问题是视图状态吗?对我来说,这似乎是视图状态的问题。viewstate在回发时真正负责获取数据。类似地,若我们打开了viewstate,则datatable不需要每次都重新绑定,这样就不会在每次回发时ping数据库。但是保留viewstate可能是有害的,因为整个数据都存在于页面上,因此如果viewstate保存了大量数据,则会延迟检索页面。请查看上面的代码,并告诉我我做错了什么…谢谢!非常感谢你,你帮助了我,我很沮丧地试图弄明白为什么回邮时我所有的表单值都是空的!我使用了Page.IsPostBack变量,解决了这个问题。我最初没有意识到,即使在回发时,ASP.net也会再次调用“Page_Load”方法!我有一个方法,可以在页面加载时自动清除表单,这也是在回发时清除表单!非常感谢你!通过检查此问题/状况,我的问题也得到了类似的解决。我忘了在我的DropDownList控件上设置AutoPostBack,所以当我点击按钮时,它覆盖了文本框的值,因为当时它试图填充文本框,从而删除了用户所做的更改。先生,您刚刚让我开心。这让我快发疯了+1Hmm不应该是txtName.Attribute.Add(“readonly”,“true”);?将
    属性
    重命名为
    属性