Пользовательский контроль с использованием панелей не работает
Я пытаюсь воссоздать то, что делает элемент управления ASP.NET Wizard, используя пользовательский элемент управления. Я не могу использовать элемент управления мастера, потому что он перезагружает страницу и оборачивает HTML в table
,
Критерии управления: - Асинхронная перезагрузка - Возможность изменить шаг от идентификатора элемента управления (.Next(), .Prev())
В настоящее время он состоит из 2 частей:
- MultiStep
- шаг
Разметка:
<asp:UpdatePanel id="upTest" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label ID="lblbActiveStep" runat="server" Text="Label"></asp:Label>
<customControl:MultiStep ID="msExample" Visible="True" ActiveStepIndex="0" runat="server">
<customControl:Step runat="server" Name="Step 1">
<p>Step 1</p>
</customControl:Step>
<customControl:Step runat="server" Name="Step 2">
<p>Step 2</p>
</customControl:Step>
<customControl:Step runat="server" Name="Step 3">
<p>Step 3</p>
</customControl:Step>
</customControl:MultiStep>
<asp:Button ID="btnTest" OnClick="btnTest_OnClick" runat="server" Text="Button" />
</ContentTemplate>
</asp:UpdatePanel>
Мой текущий код работает для отображения активного шага, но при обновлении ActiveStepIndex он не перерисовывается.
MultiStep Control:
[ParseChildren(true, "Steps"), PersistChildren(false)]
public class MultiStep : CompositeControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
public StepList Steps { get; set; }
[PersistenceMode(PersistenceMode.InnerProperty)]
public int ActiveStepIndex { get; set; }
public MultiStep()
{
Steps = new StepList();
ActiveStepIndex = 0;
}
protected override void RenderChildren(HtmlTextWriter writer)
{
for (int i = 0; i < Steps.Count; i++)
{
Steps[i].Visible = (i == ActiveStepIndex);
if (Steps[i].Visible)
Steps[i].InstantiateIn(this);
}
base.RenderChildren(writer);
}
public void Next()
{
if (ActiveStepIndex < Steps.Count )
{
ActiveStepIndex++;
UpdateVisible(ActiveStepIndex);
}
}
private void UpdateVisible(int stepIndex)
{
foreach (Step step in Steps)
{
step.Visible = false;
}
Steps[ActiveStepIndex].Visible = true;
}
}
Шаг подуправления:
[ParseChildren(true, "Content"), PersistChildren(false)]
public class Step : CompositeControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
public string Name { get; set; }
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(MultiStep))]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content { get; set; }
[PersistenceMode(PersistenceMode.InnerProperty)]
public Panel Panel { get; set; }
public Step()
{
}
public void InstantiateIn(Control container)
{
Content?.InstantiateIn(container);
}
}
Коллекция StepList
public class StepList : Collection<Step> { }
При нажатии на testing
Кнопка запускает этот код:
protected void testing_OnClick(object sender, EventArgs e)
{
msExample.Next();
}
Обновить
Шаг обновляется только один раз, а затем кнопка перестает работать по какой-то странной причине.