HiddenField manejador de sucesos ValueChanged no disparó cuando se cambia a través de Javascript

StackOverflow https://stackoverflow.com/questions/1064036

Pregunta

Tengo un control HiddenField que se crea dentro de mi control de servidor ASP.NET. He añadido un nuevo manejador de sucesos para el evento ValueChanged.

será despedido este evento cuando el valor de mis cambios HiddenField desde dentro de una función de JavaScript?

El principal problema que estoy teniendo está tratando de recuperar el valor de mi servidor del lado HiddenField cuando el valor ha cambiado o al menos antes de la devolución de datos. Tengo un control de servidor dentro de una página en la que la página contiene un botón que hace que una devolución de datos y al principio intenté usando SaveControlState / LoadControlState pero por alguna razón SaveControlState nunca es llamado antes de que ocurra la devolución de datos. Tengo que ser capaz de capturar el valor ya sea desde dentro del evento ValueChanged o antes de la devolución de datos.

Aquí está el código:

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

}

¿Fue útil?

Solución

Su código de servidor sólo se activa durante una llamada a la página que está prestando el control -. Ya sea durante la carga inicial o durante una devolución de datos

Si necesita el valor del campo oculto antes de hacer una devolución de datos, entonces usted necesita para hacer su trabajo en el lado del cliente JavaScript. Por ejemplo, puede crear una función de JavaScript llamada "función checkedNodesChanged" y hacer el trabajo allí mediante el registro y detector de eventos en JavaScript. La salida tendría que quedar así:

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

Es probable que haya una manera de agregar esto en su código subyacente para el control. Algo así como:

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

Se tendría que crear las agallas significativas de checkedNodesChanged.
El lado del servidor de eventos ValueChanged sólo se activa durante la Página del ciclo de vida en el servidor durante una devolución de datos y detecta que el valor es diferente del valor original de la carga de la página original o desde el último valor almacenado en ViewState cuando fue enviado de vuelta el último hora.

Tal vez esta es la UpdateCheckedNodes "checkedNodesChanged) (" la función que me refiero? En ese caso, simplemente llame a que en lugar de lo que tengo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top