これに飛び込むのが少し遅れましたが、将来の参考のために、私が同様のことをどのように達成したかを以下に示します…</p>
私のコントロールは、ノードのテンプレートを使用するツリーです。これに対処していた問題は、ノードの展開/折りたたみ状態に対するクライアント側の変更をキャプチャする方法でした。最終的に機能したのは次のとおりです。
CreateChildControls で、隠しフィールドをルート コントロールのコントロール コレクションに追加します。
protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)
{
...
_cdExpanded = new HiddenField();
_cdExpanded.ID = "cdExpanded";
this.Controls.Add(_cdExpanded);
...
}
OnInit 呼び出しで
protected override void OnInit(EventArgs e)
{
...
Page.RegisterRequiresPostBack(this);
...
}
LoadPostData で、非表示フィールドの UniqueID (ClientID ではない) と一致する投稿コレクションの値を探します。
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
...
string cdExpanded = postCollection[_cdExpanded.UniqueID];
...
}
個々のノードのクラス内には、トグル ボタンの onclick イベントに、ベース コントロールの ID と個々のノードを引数として受け取る JavaScript 関数の呼び出しを設定するコードがあります。
string ToggleScript
{
get
{
return "ToggleNode('" + this.ClientID + "', '" + _TreeRoot.ClientID + "');";
}
}
protected override void Render(HtmlTextWriter writer)
{
...
if (this.HasChildren)
{
writer.AddAttribute("onclick", ToggleScript);
}
...
}
これにより、getElementById を使用して隠しフィールドを簡単に見つけることができます。
function ToggleNode(nodeID, treeID) {
var cdExpanded = document.getElementById(treeID + "_cdExpanded");
...
}
次に、発生したイベントの必要に応じて、JavaScript が非表示フィールドの値を変更します。サーバーに戻ると、このフィールドの内容を解析して、再度レンダリングする前に必要に応じてコントロールの状態を変更できます。(注: 実際には、さまざまなイベントを追跡するために 3 つの隠しフィールドを使用していますが、概念は同じです)
これが将来他の人に役立つことを願っています…</p>