ASP.Net:如何在回发后维护TextBox状态

时间:2013-06-14 08:45:12

标签: c# javascript asp.net textbox postback

我想知道如何维护在Javascript中修改过的控件状态 我在C#ASP.net 2010 Express中有两个TextBox,一个DropDownList和一个按钮(所有Runat = Server)。

第一个文本框只接受用户输入的任何数据。
第二个文本框启用状态将根据DDL选择的值进行更改。
如果ddl选择的值为“ - ”,则第二个文本框将变为Enabled = False。
如果不是“ - ”,它将变为Enabled = True。这个启用是通过Javascript完成的。​​


在我的页面加载事件中,我有以下代码。

if (!IsPostBack)
{
     txtKey2.Text = "";
     txtKey2.BackColor = System.Drawing.ColorTranslator.FromHtml("#CCCCCC");
     txtKey2.Enabled = false;
}


在我的aspx页面中,我有一些javascript可以清除文本框数据并禁用文本框。

这是第二个文本框。

<asp:TextBox ID="txtKey2" runat="server" Width="425px" EnableViewState="False"></asp:TextBox>


这是DDL。

<asp:DropDownList ID="selKey1" runat="server" onchange="EnableSelkey(this.value,1)">
    <asp:ListItem Value="0">-</asp:ListItem>
    <asp:ListItem Value="1">AND</asp:ListItem>
    <asp:ListItem Value="2">OR</asp:ListItem>
</asp:DropDownList>

这是我的Javascript的代码。 (我有一个计划实现其他文本框和ddl所以在我的代码中,如果有条件,我还有其他的。)

function EnableSelkey(val, strID) {
    var txtBox;
    if (strID == "1")
        txtBox = document.getElementById('<%= txtKey2.ClientID %>');
    else if (strID == "2")
        txtBox = document.getElementById('<%= txtKey3.ClientID %>');
    else
        txtBox = document.getElementById('<%= txtKey4.ClientID %>');

    if (val != 0) {
        txtBox.disabled = false;
        txtBox.style.backgroundColor = "White";
        txtBox.value = "";
        txtBox.select();
    }
    else {
        txtBox.disabled = true;
        txtBox.style.backgroundColor = "#CCCCCC";
        txtBox.value = "";
    }
}

按钮点击事件中没有任何内容。

通过使用上面的所有代码,当我运行项目时,页面加载确定。 第二个启用文本框的状态设置为False(通过Page_Load事件)。到目前为止确定。

然后从我的浏览器中,我选择ddl值而不是“ - ”,文本框因为javascript而变为启用状态。这是好的。

我输入值并单击按钮。页面PostBack发生在这里。文本框仍然启用(因为我的文本框的EnableViewState = False)。

我选择ddl值为“ - ”,第二个文本框变为禁用状态。
点击按钮,页面回发发生,但这次文本框仍然启用。 &LT;&LT;这是我试图解决的问题。我将EnableViewState,ViewStateMode更改为不同的值但仍然相同。

这个有解决方案吗?

这是我的测试图片网址。 State 1State 2State 3

很抱歉这篇长篇文章。

3 个答案:

答案 0 :(得分:2)

我尝试过,除了使用额外的HiddenField控件外,没有找到任何解决方案。

我在Javascript中更新文本框的状态时更新隐藏字段值。 在我的页面加载事件中,我检查了所有隐藏的字段值,并根据隐藏字段值,我将禁用/启用我的文本框,这对我来说不是一个好的解决方案。

想象一下,我的表单上有10个或15个文本框,我需要有10或15个隐藏字段才能维护客户端操作结果。

目前,这是我唯一的解决方案。

我不确定这可以视为'答案'所以我还没有关闭这个问题。

答案 1 :(得分:0)

<asp:DropDownList ID="selKey1" runat="server" onchange="EnableSelkey(this.value,1)">
    <asp:ListItem Value="0">-</asp:ListItem>
    <asp:ListItem Value="1">AND</asp:ListItem>
    <asp:ListItem Value="2">OR</asp:ListItem>
</asp:DropDownList>

function EnableSelkey(val, strID) {
    var txtBox;        
    if (strID == "1")
        txtBox = document.getElementById('<%= txtKey2.ClientID %>');
    else if (strID == "2")
        txtBox = document.getElementById('<%= txtKey3.ClientID %>');
    else
        txtBox = document.getElementById('<%= txtKey4.ClientID %>');

    if (val != 0) {
        txtBox.disabled = false;
        txtBox.style.backgroundColor = "White";
        txtBox.value = "";
        txtBox.select();
    }
    else {
        txtBox.disabled = true;
        txtBox.style.backgroundColor = "#CCCCCC";
        txtBox.value = "";
    }
}

你必须在每次回发时给你调用javascript函数。

if (!IsPostBack)
{
     txtKey2.Text = "";
     txtKey2.BackColor = System.Drawing.ColorTranslator.FromHtml("#CCCCCC");
     txtKey2.Enabled = false;
}

ScriptManager.RegisterClientScriptBlock(this, typeof(System.Web.UI.Page), "MyJSFunction", "EnableSelkey("+selKey1.SelectedValue+",1);", true);

它可以帮到你,让我知道以获得进一步的帮助。

答案 2 :(得分:0)

我发现一个有效的解决方案是将我放在!IsPostBack部分中的代码放在页面加载事件中直接启用和禁用文本框。