当 Control Enable=false TextBox 丢失值时,Viewstate 在某些情况下不起作用
Viewstate not working certain cases when Control Enable=false TextBox looses value
我在我的一些代码中发现了一个问题,但无法找出原因。我正在使用 .Net 4.5. 谁能告诉我这两种情况的区别?我尝试了一些不同的东西,例如 javascript 通过 Page.ClientScript
或在 body onload 事件上禁用,但我没有得到我想要的东西(TextBox2 是“”,TextBox1 是 "Hello, TextBox1")。当我注释掉 tmp.Enable = false
时,一切都很好。我希望能够禁用这两个控件,但仍然可以访问文本值。适用于 "TextBox1" 但不适用于 "tmp" 即 "TextBox2"。
在 Page_Load 期间创建 !IsPostBack 和 TextBox2 的原因是因为我正在动态创建 X 数量的控件并从数据读取器设置它们的值。然后它们可以由用户修改并保存到 table。必须有办法!
这 post 听起来像我的问题,但我得到的结果与他们不同。
ASP.Net ViewState doesn't work when Control become Enable=False
<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();
}
尝试使用 Read Only
属性????
只读
In the context of a TextBox, readonly allows the user to set focus to
and select and copy the text but not modify it. A disabled TextBox
does not allow any interaction whatsoever.
Use ReadOnly when you have data that you want the user to see and
copy, but not modify. Use a disabled textbox, when the data you are
displaying is not applicable in for the current state of a dialog or
window.
已启用:
Gets or sets a value indicating whether the control can respond to
user interaction.
您应该考虑使用 ReadOnly = true
而不是 Enabled = false
。
disabled 表单元素的值 NOT 传递给处理器方法。有关更具体的详细信息,请参阅 disabled-vs-readonly-form-fields/
编辑: 关于您的代码的补充
用你的代码创建了一个测试用例,发现我只是误读了你的代码。以下是您的代码中发生的情况:
您在每个 PostBack 上创建一个新的文本框 (tmp)。
tmp 已重新创建(但 TextBox1 已存在且未重新创建)
您不要在每个 PostBack 上为 tmp 赋值
这意味着 tmp 中没有文本(未重新创建 TextBox1,保留其文本)
可以在 answer given by R.C in this SO post dynamically-created-controls-losing-data-after-postback
中找到更具体的详细信息
在此 post ASPNet-Dynamic-Controls-ViewState-Retain-state-for-dynamically-created-controls-on-PostBack
中可以找到一个实用的方法
我在我的一些代码中发现了一个问题,但无法找出原因。我正在使用 .Net 4.5. 谁能告诉我这两种情况的区别?我尝试了一些不同的东西,例如 javascript 通过 Page.ClientScript
或在 body onload 事件上禁用,但我没有得到我想要的东西(TextBox2 是“”,TextBox1 是 "Hello, TextBox1")。当我注释掉 tmp.Enable = false
时,一切都很好。我希望能够禁用这两个控件,但仍然可以访问文本值。适用于 "TextBox1" 但不适用于 "tmp" 即 "TextBox2"。
在 Page_Load 期间创建 !IsPostBack 和 TextBox2 的原因是因为我正在动态创建 X 数量的控件并从数据读取器设置它们的值。然后它们可以由用户修改并保存到 table。必须有办法!
这 post 听起来像我的问题,但我得到的结果与他们不同。
ASP.Net ViewState doesn't work when Control become Enable=False
<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();
}
尝试使用 Read Only
属性????
只读
In the context of a TextBox, readonly allows the user to set focus to and select and copy the text but not modify it. A disabled TextBox does not allow any interaction whatsoever.
Use ReadOnly when you have data that you want the user to see and copy, but not modify. Use a disabled textbox, when the data you are displaying is not applicable in for the current state of a dialog or window.
已启用:
Gets or sets a value indicating whether the control can respond to user interaction.
您应该考虑使用 ReadOnly = true
而不是 Enabled = false
。
disabled 表单元素的值 NOT 传递给处理器方法。有关更具体的详细信息,请参阅 disabled-vs-readonly-form-fields/
编辑: 关于您的代码的补充
用你的代码创建了一个测试用例,发现我只是误读了你的代码。以下是您的代码中发生的情况:
您在每个 PostBack 上创建一个新的文本框 (tmp)。
tmp 已重新创建(但 TextBox1 已存在且未重新创建)您不要在每个 PostBack 上为 tmp 赋值
这意味着 tmp 中没有文本(未重新创建 TextBox1,保留其文本)
可以在 answer given by R.C in this SO post dynamically-created-controls-losing-data-after-postback
中找到更具体的详细信息在此 post ASPNet-Dynamic-Controls-ViewState-Retain-state-for-dynamically-created-controls-on-PostBack
中可以找到一个实用的方法