2009-06-30 67 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()」函數?在這種情況下,只需調用它而不是我所擁有的。

相關問題