我正在设置一个由 XML 配置驱动的用户控件。用例子来解释更容易。看看下面的配置片段:
<node>
<text lbl="Text:"/>
<checkbox lbl="Check me:" checked="true"/>
</node>
我试图实现将该片段转换为单个文本框和复选框控件。当然,如果代码片段包含更多节点,则会自动生成更多控件。
鉴于任务的迭代性质,我选择使用Repeater。在其中我放置了两个(更多,见下文)控件,一个 CheckBox 和一个 Editbox。为了选择激活哪个控件,我使用了内联 switch 命令,检查当前配置节点的名称。
可悲的是,这行不通。问题在于,在数据绑定发生很久之后,切换是在渲染期间运行的。仅此一项就不是问题,不是因为配置节点可能会为数据绑定提供所需的信息。考虑一下如果复选框控件将尝试绑定到上面代码片段中的文本节点,拼命寻找它的“已选中”属性会发生什么。
任何想法如何使这成为可能?
谢谢,波阿斯
这是我当前的代码:
这是我的代码(运行的语法比上面的更复杂):
<asp:Repeater ID="settingRepeater" runat="server">
<ItemTemplate>
<%
switch (((XmlNode)Page.GetDataItem()).LocalName)
{
case "text":
%>
<asp:Label ID="settingsLabel" CssClass="editlabel" Text='<%# XPath("@lbl") %>' runat="server" />
<asp:TextBox ID="settingsLabelText" Text='<%# SettingsNode.SelectSingleNode(XPath("@xpath").ToString()).InnerText %>'
runat="server" AutoPostBack="true" Columns='<%# XmlUtils.OptReadInt((XmlNode)Page.GetDataItem(),"@width",20) %>'
/>
<% break;
case "checkbox":
%>
<asp:CheckBox ID="settingsCheckBox" Text='<%# XPath("@lbl") %>' runat="server"
Checked='<%# ((XmlElement)SettingsNode.SelectSingleNode(XPath("@xpath").ToString())).HasAttribute(XPath("@att").ToString()) %>'
/>
<% break;
} %>
</ItemTemplate>
</asp:Repeater>