2009-06-30 6 views
1

J'ai un contrôle HiddenField créé dans mon contrôle serveur ASP.NET. J'ai ajouté un nouveau EventHandler pour l'événement ValueChanged.HiddenField EventHandler ValueChanged non déclenché lors d'une modification via Javascript

Cet événement sera-t-il déclenché lorsque la valeur de mon champ HiddenField changera depuis une fonction javascript?

Le principal problème que j'ai est d'essayer de récupérer la valeur de mon côté serveur HiddenField lorsque la valeur a changé ou au moins avant la publication. J'ai un contrôle de serveur dans une page où cette page contient un bouton qui provoque une publication et j'ai d'abord essayé d'utiliser SaveControlState/LoadControlState mais pour une raison quelconque, SaveControlState n'est jamais appelé avant la publication. Je dois être capable de capturer la valeur depuis l'événement ValueChanged ou avant la publication.

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

}

Répondre

1

Votre code côté serveur ne se déclenche pendant un appel à la page qui est rendu le contrôle - soit au cours de la charge initiale ou lors d'une publication.

Si vous avez besoin de la valeur du champ caché PRIOR à PostBack, alors vous devez faire votre travail dans le JavaScript côté client. Par exemple, vous pouvez créer une fonction en JavaScript appelée "function checkedNodesChanged" et y travailler en vous enregistrant et en écoutant l'événement en JavaScript. La sortie devrait ressembler à:

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

Il y a probablement un moyen d'ajouter ceci dans votre code-behind pour le contrôle. Quelque chose comme:

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

Vous auriez à créer les tripes significatives de checkedNodesChanged. L'événement ValueChanged côté serveur se déclenche uniquement pendant le cycle de vie de la page sur le serveur pendant un PostBack et détecte que la valeur est différente de la valeur d'origine du chargement de la page d'origine ou de la dernière valeur stockée dans ViewState. la dernière fois.

Peut-être que UpdateCheckedNodes est la fonction "checkedNodesChanged()" dont je parle? Dans ce cas, appelez simplement cela au lieu de ce que j'ai.

Questions connexes