C# 使用.NET填充html列表控件
我有一个这样定义的列表:C# 使用.NET填充html列表控件,c#,.net,html,vb.net,C#,.net,Html,Vb.net,我有一个这样定义的列表: <ul id="myList" class='myClass'> <li class="myItemClass">Item 1</li> <li class="myItemClass">Item 2</li> </ul> 第1项 第2项 使用.NET如何将项目动态添加到列表中?我还需要在每个新项上指定类名解决此问题的最简单方法是使用asp repeater控件 <ul
<ul id="myList" class='myClass'>
<li class="myItemClass">Item 1</li>
<li class="myItemClass">Item 2</li>
</ul>
第1项
第2项
使用.NET如何将项目动态添加到列表中?我还需要在每个新项上指定类名解决此问题的最简单方法是使用asp repeater控件
<ul id="myList" class='myClass'>
<asp:Repeater ID="repeaterMyList" Runat="server">
<ItemTemplate>
<li class="myItemClass">
<%# Eval("Item") %>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
我假设您有充分的理由不使用BulletedList Web服务器控件。无论如何,这是一个有趣的编程练习,演示了Htmlservercontrol体系结构的内部结构以及它们如何映射到简单的HTML标记 HTML
ul
和li
标记不直接映射为HTMLServer控件。这意味着,即使将runat=“server”
属性添加到列表中,其内容也不能作为列表项直接访问
但是,所有未直接映射为Html服务器控件的控件都可以通过HtmlGenericControl
类访问。这使得动态创建和修改此类控件成为可能
因此,解决方案有两个方面:
- 创建无序列表
,以便您可以在服务器端代码中访问它。另外,您应该使列表中的现有项runat=“server”
,否则它们只能作为包含前两个列表项的纯文本的runat=“server”
来访问李>LiteralControl
- 在代码中,访问列表的内容并向其中添加类型为“li”的新HtmlGenericControl
私有共享addedItems作为列表(HtmlGenericControl)
受保护的子页加载(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Load
如果不是Page.IsPostBack,则
'在第一次加载时,实例化列表。
addedItems=新列表(HtmlGenericControl)
如果结束
端接头
受保护的子btn1_单击(ByVal sender作为对象,ByVal e作为System.EventArgs)
'将先前创建的项目添加到UL列表中。
这一步是必要的,因为
“…以前添加的项目在回发时丢失。
对于i,整数=0到addedItems.Count-1
myList.Controls.Add(addedItems.Item(i))
下一个
'获取列表中现有项数
Dim count As Integer=myList.Controls.count
'根据文本框中的输入创建新列表项。
将li设置为HtmlGenericControl=CreateBarketItem()
'在BulletedList的末尾添加新的列表项。
myList.Controls.AddAt(count,li)
'还将此新创建的列表项添加到常规列表中。
增编.加(李)
端接头
私有函数CreateBulletItem()作为HtmlGenericControl
Dim li作为新的HtmlGenericControl(“li”)
li.InnerText=txtNewItem.Value
li.Attributes(“类”)=“myItemClass”
返回李
端函数
测试页
第1项
第2项
您可以使用asp:BulletedList,如
<asp:BulletedList ID="MyList1" CssClass="MyClass" runat="server">
<asp:ListItem Text="Item1" class="MyClass" />
</asp:BulletedList>
或者,如果出于某些特定原因,您需要使用ul标签,则可以向其添加runat=“server”。例如
<ul id="MyList2" class="MyClass" runat="server">
<li class="MyClass">Item1</li>
</ul>
您甚至可以使用该HTML,添加runat=“server”无论它是什么控件,您都可以将其视为HTMLControl,我经常使用div
<ul id="myList" runat="server" class="myClass">
<li class="myItemClass">Item 1</li>
<li class="myItemClass">Item 2</li>
</ul>
第1项
第2项
然后你得到HTMLControl并使用它
HtmlGenericControl li;
for (int x = 3; x <= 10; x++)
{
li = new HtmlGenericControl("li");
li.Attributes.Add("class", "myItemClass");
li.InnerText = "Item " + x;
myList.Controls.Add(li);
}
htmlgenericcontrolli;
对于(int x=3;x使用asp:BulletedList不是一个选项?因为我是.net新手,我可以问一下为什么要创建AddItems=new List(属于HtmlGenericControl)页面加载?我看不到此列表“绑定”到任何控件,是吗?为什么要将此列表中的项添加到ul?如果这是一个新问题,很抱歉。@dasha:因为动态创建的listitems不会持久保存在内存或视图状态中。我需要将新创建的listitems存储在某个位置,以便将它们添加回ul。此外,我还需要使“addedItems”变量共享,以便在回发时能够访问它。我已在代码中添加了解释性注释。希望这有帮助。:-)我正在尝试使用此技术。但在用户控件的代码隐藏中使用“mylist.something”时,会出现空引用异常。能找个人帮忙吗。
<ul id="MyList2" class="MyClass" runat="server">
<li class="MyClass">Item1</li>
</ul>
HtmlGenericControl li = new HtmlGenericControl("li");
li.Attributes.Add("class", "MyClass");
li.InnerText = "Item2";
MyList2.Controls.Add(li);
<ul id="myList" runat="server" class="myClass">
<li class="myItemClass">Item 1</li>
<li class="myItemClass">Item 2</li>
</ul>
HtmlGenericControl li;
for (int x = 3; x <= 10; x++)
{
li = new HtmlGenericControl("li");
li.Attributes.Add("class", "myItemClass");
li.InnerText = "Item " + x;
myList.Controls.Add(li);
}
<ul id="myList" runat="server" class="myClass">
<li class="myItemClass">Item 1</li>
<li class="myItemClass">Item 2</li>
<li class="myItemClass">Item 3</li>
<li class="myItemClass">Item 4</li>
<li class="myItemClass">Item 5</li>
<li class="myItemClass">Item 6</li>
<li class="myItemClass">Item 7</li>
<li class="myItemClass">Item 8</li>
<li class="myItemClass">Item 9</li>
<li class="myItemClass">Item 10</li>
</ul>
<asp:BulletedList runat="server" ...