Я немного опаздываю, но для справки, вот как я добился чего-то подобного ...
Мой элемент управления - это дерево, которое использует шаблоны для узлов. Проблема, с которой я имел дело, заключалась в том, как зафиксировать изменения на стороне клиента в развернутом / свернутом состоянии узлов. В итоге получилось:
В 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 найдите значение в коллекции сообщений, которое соответствует уникальному (не ClientID) скрытого поля:
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
...
string cdExpanded = postCollection[_cdExpanded.UniqueID];
...
}
Внутри классов для отдельных узлов у меня есть код, который заполняет события onclick моих кнопок переключения вызовом функции 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 скрытых поля для отслеживания различных событий, но концепция та же самая)
Надеюсь, это поможет другим в будущем ...