我在这方面有点晚了,但是,仅供将来参考,以下是我如何完成类似的事情......
我的控件是一个使用节点模板的树。我处理的问题是如何捕获客户端对节点展开/折叠状态的更改。最终起作用的是:
在 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];
...
}
在各个节点的类中,我有代码通过调用 JavaScript 函数来填充切换按钮的 onclick 事件,该函数将基本控件的 ID 和各个节点作为参数。
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 个隐藏字段来跟踪不同的事件,但概念是相同的)
希望这可以帮助其他人在未来......