Frage

Ich habe ein Steuerelement, das Hidden in meinem ASP.NET Server-Steuerelement erstellt wird. Ich habe einen neuen Eventhandler für das Value Ereignis.

Wird dieses Ereignis ausgelöst werden, wenn der Wert meiner Hidden Änderungen innerhalb einer JavaScript-Funktion?

Das Hauptproblem Ich habe versucht, den Wert meiner Hiddenserverseitige abgerufen werden, wenn der Wert oder zumindest vor Postbacks geändert hat. Ich habe einen Server Kontrolle innerhalb einer Seite, wo die Seite eine Schaltfläche enthält, die ein Postback verursacht und ich versuchte zunächst mit Save / Load aber aus irgendeinem Grunde Save wird nie aufgerufen, bevor die Postback auftritt. Ich muß in der Lage sein, entweder den Wert aus dem Value Ereignisse zu erfassen oder vor dem Postbacks.

Hier ist der Code:

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);
  }

}

War es hilfreich?

Lösung

Ihr serverseitigen Code wird nur ausgelöst, während ein Gespräch auf der Seite, die die Steuerung Rendering -. Entweder während der anfänglichen Belastung oder während eines Postback

Wenn Sie den Wert aus dem verborgenen Feld VOR Postback benötigen, dann müssen Sie Ihre Arbeit in clientseitige JavaScript tun. Zum Beispiel können Sie eine Funktion in JavaScript als „Funktion checkedNodesChanged“ und arbeitet dort durch die Registrierung und Event-Listener in JavaScript erstellen. Die Ausgabe müsste wie folgt aussehen:

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

Es gibt wohl eine Möglichkeit, dies in Ihrem Code-Behind für die Steuerung hinzuzufügen. So etwas wie:

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

Sie müßten, um die sinnvollen Gedärme checkedNodesChanged erstellen.
Das serverseitige Value Ereignis nur ausgelöst, während des Seite-Lebenszyklus auf dem Server während eines Postback und er erkennt, dass der Wert anders als der ursprüngliche Wert von der ursprünglichen Seite zu laden oder aus dem letzten in Viewstate gespeicherten Wert, wenn es die letzten die Veröffentlichung Zurück wurde Zeit.

Vielleicht UpdateCheckedNodes ist die „checkedNodesChanged ()“ Funktion beziehe ich mich? In diesem Fall ruft nur, dass statt dem, was ich habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top