簡體   English   中英

通過Javascript更改時未觸發HiddenField EventHandler ValueChanged

[英]HiddenField EventHandler ValueChanged not fired when changed via Javascript

我有一個在ASP.NET服務器控件內創建的HiddenField控件。 我為ValueChanged事件添加了一個新的EventHandler。

當我的HiddenField的值從javascript函數中更改時,會觸發此事件嗎?

我遇到的主要問題是,當值已更改或至少在回發之前,嘗試檢索我的HiddenField服務器端的值。 我在一個頁面內有一個服務器控件,該頁面包含一個導致回發的按鈕,我最初嘗試使用SaveControlState / LoadControlState,但是由於某種原因,從未在回發發生之前調用SaveControlState。 我需要能夠從ValueChanged事件中或回發之前捕獲值。

這是代碼:

public class ObjectTree : WebControl {
private CA.TreeView _treeView;
private HiddenField fldCheckedNodes = new HiddenField();
public CA.TreeView TreeView {
    get { return _treeView; }
    set { _treeView = value; }
}
public ObjectTree() {
    _treeView = new CA.TreeView();
    _treeView.ID = "objectTree";
    fldCheckedNodes.ID = "fldCheckedNodes";
}
protected void fldCheckedNodes_ValueChanged(Object sender, EventArgs e) {
    string test = fldCheckedNodes.Value;
}
protected override void  OnPreRender(EventArgs e) {
    TreeView.ClientSideOnNodeCheckChanged = TreeView.ClientID + "NodeChecked";
    fldCheckedNodes.ValueChanged += new EventHandler(fldCheckedNodes_ValueChanged);
    if (!Page.ClientScript.IsClientScriptBlockRegistered("jscript")) {
        StringBuilder jscript = new StringBuilder();
        jscript.AppendLine("    function " + TreeView.ClientID + "UpdateCheckedNodes() {");  
        jscript.AppendLine("    var x = 0;");
        jscript.AppendLine("    var nodeArray = " + TreeView.ClientID + ".get_nodes().get_nodeArray();");
        jscript.AppendLine("    var nodeLength = nodeArray.length;");
        jscript.AppendLine("    document.getElementById('" + fldCheckedNodes.ClientID + "').value = \"\";");                 
        jscript.AppendLine("    for (x=0; x < nodeLength; x++) {");
        jscript.AppendLine("        examineNode(nodeArray[x]);");
        jscript.AppendLine("    }");
        jscript.AppendLine("    var result = document.getElementById('" + fldCheckedNodes.ClientID + "').value;");
        jscript.AppendLine("    return true;");
        jscript.AppendLine("    }");
        jscript.AppendLine("    function examineNode(node) {");
        jscript.AppendLine("    var y = 0;");
        jscript.AppendLine("    var childNodes = node.get_nodes().get_nodeArray();");
        jscript.AppendLine("    var childNodeLength = childNodes.length;");         
        jscript.AppendLine("    if (node.get_checked()) {");
        jscript.AppendLine("        if (document.getElementById('" + fldCheckedNodes.ClientID + "').value.length > 0) {");
        jscript.AppendLine("            document.getElementById('" + fldCheckedNodes.ClientID + "').value += \",\"; ");
        jscript.AppendLine("            document.getElementById('" + fldCheckedNodes.ClientID + "').value += node.get_id();");   
        jscript.AppendLine("        } else {");
        jscript.AppendLine("            document.getElementById('" + fldCheckedNodes.ClientID + "').value += node.get_id();");  
        jscript.AppendLine("        }");
        jscript.AppendLine("    }");             
        jscript.AppendLine("    if (childNodeLength >= 1) {");
        jscript.AppendLine("        for (y=0; y < childNodeLength; y++) {");
        jscript.AppendLine("            examineNode(childNodes[y]);");
        jscript.AppendLine("        }");  
        jscript.AppendLine("    } ");     
        jscript.AppendLine("    }");
        jscript.AppendLine("</script>");
        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "jscript", jscript.ToString());
    }
    base.OnPreRender(e);
}
protected override void CreateChildControls() {
     Controls.Add(TreeView);
     Controls.Add(fldCheckedNodes);
}
protected override void RenderContents(HtmlTextWriter output) {
    TreeView.RenderControl(output);
    fldCheckedNodes.RenderControl(output);
  }

}

您的服務器端代碼僅在對呈現控件的頁面的調用期間觸發(無論是在初始加載期間還是在PostBack期間)。

如果需要從隱藏字段PRIOR到PostBack的值,則需要使用客戶端JavaScript進行工作。 例如,您可以在JavaScript中創建一個稱為“ function CheckedNodesChanged”的函數,並通過在JavaScript中進行注冊和事件監聽器在其中工作。 輸出將如下所示:

<input type="hidden" id="fldCheckedNodes" onchange="checkedNodesChanged();" />

可能有一種方法可以將其添加到控件的代碼隱藏中。 就像是:

fldCheckedNodes.Attributes.Add("onchange", "checkedNodesChanged();");

您將必須創建checkedNodesChanged的有意義的膽量。
服務器端ValueChanged事件僅在PostBack期間在服務器上的Page生命周期內觸發,並且它檢測到該值不同於原始頁面加載時的原始值或不同於ViewState存儲在ViewState中的最后一個值后的值。時間。

也許此UpdateCheckedNodes是我指的“ checkedNodesChanged()”函數? 在這種情況下,只需打電話給我即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM