当控件启用=false时,视图状态不工作,文本框失去值

本文关键字:文本 工作 失去 视图状态 启用 false 控件 | 更新日期: 2023-09-27 18:16:48

我在我的一些代码中发现了一个问题,但不知道原因。我用。Net 4.5。谁能告诉我这两种情况的区别?我尝试了一些不同的东西,如javascript通过Page.ClientScript或身体onload事件禁用,但我没有得到我想要的(TextBox2是"和TextBox1是"你好,TextBox1")。当我注释掉tmp.Enable = false时,一切都很好。我想能够禁用这两个控件,但仍然访问文本值。适用于"TextBox1",但不是"tmp"aka"TextBox2"。

在Page_Load期间创建!IsPostBack和TextBox2的原因是因为我动态地创建了X个控件并从数据阅读器设置了它们的值。然后,用户可以修改它们并将其保存到表中。一定有办法的!

这篇文章听起来像我的问题,但我得到的结果与他们不同。
ASP。当控件变为Enable=False时,Net ViewState不起作用

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
    function t() {
        document.getElementById("TextBox1").disabled = true;
        document.getElementById("TextBox2").disabled = true;
    }
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
    <asp:Panel runat="server" ID="Panel1">
        <asp:TextBox runat="server" ID="TextBox1"></asp:TextBox>
    <asp:Button runat="server" ID="button1" OnClick="button1_Click" />
    </asp:Panel>
</div>
</form>
</body>
</html>
public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) { TextBox1.Text = "Hello, TextBox1"; }
        TextBox1.Enabled = false; 
        TextBox tmp = new TextBox();
        tmp.ID = "TextBox2";
        if (!IsPostBack) { tmp.Text = "Hello, TextBox2"; }
        tmp.Enabled = false;
        Panel1.Controls.Add(tmp); 
    }
    protected void button1_Click(object sender, EventArgs e)
    {
        TextBox tmp = ((TextBox)Page.FindControl("TextBox2"));
        if(tmp != null)
        {
            tmp.Text.ToString();
        }
        TextBox1.Text.ToString(); 
    }
}

更新:根据haraman的建议,我可以通过以下更改使其工作:

protected void Page_PreInit(object sender, EventArgs e)
    {
        TextBox tmp = new TextBox();
        tmp.ID = "TextBox2";
        Panel1.Controls.Add(tmp); 
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) { TextBox1.Text = "Hello, TextBox1"; }
        TextBox1.Enabled = false;
        if (!IsPostBack) { ((TextBox)Page.FindControl("TextBox2")).Text = "Hello, TextBox2"; }
        ((TextBox)Page.FindControl("TextBox2")).Enabled = false;

    }
    protected void button1_Click(object sender, EventArgs e)
    {
        TextBox tmp = ((TextBox)Page.FindControl("TextBox2"));
        if (tmp != null)
        {
            tmp.Text.ToString();
        }
        TextBox1.Text.ToString();
    }

当控件启用=false时,视图状态不工作,文本框失去值

您应该考虑使用ReadOnly = true而不是Enabled = false

disabled表单元素的值是传递给处理器方法的NOT。更多详细信息请参考disabled-vs-readonly-form-fields/

EDIT:关于你的代码的添加
用你的代码创建了一个测试用例,发现我只是误读了你的代码。下面是代码中发生的事情:

  1. 在每个PostBack上创建一个新的TextBox (tmp)。
    tmp被重新创建(但是TextBox1已经存在并且没有被重新创建)

  2. 不要在每次PostBack时都给tmp赋值
    这意味着没有文本在tmp (TextBox1不被重新创建,保留其文本)

更具体的细节可以在R.C在这篇帖子中给出的答案中找到。

可以在这篇文章中找到一个实用的方法

尝试使用Read Only属性????

只读

在TextBox上下文中,readonly允许用户将焦点设置为选择并复制文本,但不修改它。禁用的文本框不允许任何交互

使用ReadOnly当你有数据,你希望用户看到和复制,但不能修改。使用一个禁用的文本框,当你的数据显示不适用于对话框的当前状态或窗口。

启用

:

获取或设置一个值,该值指示控件是否可以响应用户交互。