在动态添加的控件中按id查找元素

时间:2013-04-12 09:13:20

标签: javascript asp.net getelementbyid

我有一个asp页面,其中我动态添加了我创建的控件(多次)。在该控件中,我有密码和用户名的文本框以及恢复按钮。

我在该控件中使用此javascript代码并失败:

function HandlePasswordChanged() {
    document.getElementById("<%=btnRevert.ClientID %>").disabled = false;
}
function HandleUserChanged() {
    document.getElementById("<%=btnRevert.ClientID %>").disabled = false;
    document.getElementById("<%=txtPassword.ClientID %>").disabled = false;
}
function btnRevertClick() {
    document.getElementById("<%=btnRevert.ClientID %>").disabled = true;
    document.getElementById("<%=txtPassword.ClientID %>").disabled = true;
    document.getElementById("<%=txtUsername.ClientID %>").value = document.getElementById("<%=systemAccount.ClientID %>").value;
    document.getElementById("<%=txtPassword.ClientID %>").value = "";
}

它的作用是当我按下一个控件上的恢复按钮时它会禁用另一个控件上的文本框 - getelement无法找到正确的文本框。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果您正在使用.net 4.0:

您可以为动态添加的控件设置ClientIDMode="Static"。此外,您必须确保为控件设置唯一ID。

答案 1 :(得分:0)

我设法找到了解决方案。

问题在于,每当我使用javascript代码添加acsx控件时,它添加了多个具有相同名称但内部不同的函数。当一个控件想要调用它的“自己的”函数时,它只使用了第一个,因为它们都被命名为相同。

我的解决方案是改变这个功能:

function HandleUserChanged() {
    document.getElementById("<%=btnRevert.ClientID %>").disabled = false;
    document.getElementById("<%=txtPassword.ClientID %>").disabled = false;
}

到此:

function HandleUserChanged(btnRevertId, txtPasswordId, cellPasswordId) {
    document.getElementById(btnRevertId).disabled = false;
    document.getElementById(txtPasswordId).disabled = false;
}

然后在c#代码中我添加了这个:

txtUsername.Attributes.Add("onchange", "HandleUserChanged(\"" + btnRevert.ClientID + "\", \"" + txtPassword.ClientID + "\", \"" + cellPassword.ClientID + "\")");

这样每个控件都确切地知道哪些控件属于他,并将正确的参数发送给函数。