2009-06-30 11 views
1

ASP.NETサーバーコントロール内に作成されたHiddenFieldコントロールがあります。 ValueChangedイベント用の新しいEventHandlerを追加しました。HiddenField EventHandler Javascript経由で変更したときにValueChangedが起動しない

私の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で関数 "checkedNodesChanged"と呼ばれる関数を作成し、そこにJavaScriptで登録およびイベントリスナーを使用して作業することができます。出力は次のようにする必要があります:

おそらく、コントロールのコードビハインドにこれを追加する方法があります。あなたがcheckedNodesChangedの意味の勇気を作成する必要があります

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

:ような何か。
サーバー側のValueChangedイベントは、PostBack中にサーバーのページライフサイクルでのみ発生し、値が元のページの負荷の元の値またはViewStateに格納されている最後の値と異なることを検出しました。最後の時間。

おそらく、このUpdateCheckedNodesは、私が参照している "checkedNodesChanged()"関数ですか?その場合は、私が持っているものの代わりにそれを呼び出してください。

関連する問題