1

我想知道如何维护在Javascript中修改的控件状态。
我在 C# ASP.net 2010 Express 中有两个 TextBoxes、一个 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 的计划,所以在我的代码中我有 Else if 条件)。

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 值选择为 other 而不是“-”,由于 javascript,文本框变为启用。还行吧。

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

我将 ddl 值选择为“-”,第二个文本框被禁用。
单击按钮,页面回发发生,但这次文本框仍处于启用状态。<<这是我要解决的问题。我将 EnableViewState、ViewStateMode 更改为不同的值,但仍然相同。

这个有什么解决办法吗?

这是我的测试图片网址。 状态 1 , 状态 2 , 状态 3

对不起,很长的帖子。

4

3 回答 3

2

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

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

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

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

我不确定这是否可以视为“答案”,所以我还没有结束这个问题。

于 2013-07-02T03:50:43.800 回答
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);

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

于 2013-06-14T09:14:50.967 回答
0

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

于 2014-05-31T02:32:11.933 回答