HiddenField ValueChanged-Event-Handler nicht gefeuert, wenn sich über Javascript
Habe ich ein HiddenField-Steuerelement, das erstellt wird, in meinem ASP.NET server-Kontrolle.
Ich habe eine neue EventHandler für das ValueChanged-Ereignis.
Wird dieses Ereignis ausgelöst, wenn der Wert meiner HiddenField änderungen innerhalb einer javascript-Funktion?
Das Hauptproblem, das ich habe, ist der Versuch zum abrufen des Werts von meinem HiddenField server-Seite, wenn sich der Wert geändert hat oder zumindest vor dem postback. Ich habe ein server-Steuerelement in eine Seite, wo die Seite enthält eine Schaltfläche, die ein postback verursacht und ich habe zunächst versucht, mit SaveControlState/LoadControlState aber aus irgendeinem Grund SaveControlState wird nie aufgerufen, bevor das postback erfolgt. Ich muss in der Lage zu erfassen der Wert innerhalb der ValueChanged-Ereignis oder vor dem postback.
Hier 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);
}
}
InformationsquelleAutor Andrew | 2009-06-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein server-side-code wird nur ausgelöst, während ein Aufruf der Seite, ist die rendering-control-entweder bei der ersten Belastung oder während eines Postbacks.
Wenn Sie brauchen, der Wert aus dem versteckten Feld VOR PostBack, dann müssen Sie tun Ihre Arbeit in client-side JavaScript. Zum Beispiel, können Sie erstellen eine Funktion in JavaScript aufgerufen "- Funktion checkedNodesChanged" und arbeiten dort mit der Registrierung und der Ereignis-listener in JavaScript. Die Ausgabe müsste wie folgt Aussehen:
Es ist wahrscheinlich ein Weg, um fügen Sie diese im code-behind für die Kontrolle. So etwas wie:
Müssen Sie diesen erstellen die sinnvolle Mut checkedNodesChanged.
Die server-Seite das ValueChanged-Ereignis wird nur ausgelöst, während der Lebenszyklus der Seite auf dem server während eines Postbacks und es erkennt, dass der Wert anders ist als der ursprüngliche Wert aus der original-Seite geladen oder von der letzten gespeicherten Wert im ViewState, wenn es Veröffentlicht wurde Wieder das Letzte mal.
Vielleicht UpdateCheckedNodes ist die "checkedNodesChanged ()" - Funktion, die ich mich beziehe? In diesem Fall, rufen Sie einfach an, anstelle von dem, was ich habe.
InformationsquelleAutor Tony Heupel