2009-06-30 70 views
1

我有一个在我的ASP.NET服务器控件中创建的HiddenField控件。 我为ValueChanged事件添加了一个新的EventHandler。HiddenField EventHandler ValueChanged在通过Javascript更改时未触发

当我的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); 
    } 

}

回答

1

您的服务器端代码所呈现控件的页面在通话过程中只火 - 无论是在初始加载或回发过程。

如果您需要从隐藏字段PRIOR到PostBack的值,那么您需要在客户端JavaScript中完成您的工作。例如,您可以在JavaScript中创建一个名为“function checkedNodesChanged”的函数,并通过JavaScript中的注册和事件侦听器在那里工作。输出需要如下所示:

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

可能有一种方法可以在控制代码中添加此代码。例如:

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

您将不得不创建checkedNodesChanged的有意义的胆量。
服务器端的ValueChanged事件只在服务器的页生命周期期间在PostBack期间触发,并且它检测到该值与原始页面加载时的原始值不同或者在ViewState中存储的最后一个值不同时发布。最后一次。

也许这UpdateCheckedNodes是我所指的“checkedNodesChanged()”函数?在这种情况下,只需调用它而不是我所拥有的。

相关问题