我在这方面有点晚了,但为了将来参考,这里是我如何完成类似的事情......</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];
...
}
在各个节点的类中,我有代码通过调用 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 个隐藏字段来跟踪不同的事件,但概念是相同的)
希望这对将来的其他人有所帮助……</p>