Ich nehme an, dass es einen gültigen Grund gibt, dass Sie das BulletedList Webserver-Steuerelement nicht verwenden. Wie auch immer, dies ist eine interessante Programmierübung, die die Interna der Htmlservercontrol-Architektur und ihre Zuordnung zu einfachen HTML-Tags veranschaulicht.
Die Tags HTML ul
und li
werden nicht direkt als HTMLServerControls zugeordnet. Das bedeutet, dass selbst wenn Sie der Liste ein runat="server"
-Attribut hinzufügen, der Inhalt nicht direkt als Listenelemente verfügbar ist.
Alle Steuerelemente, die nicht direkt als HTML-Serversteuerelemente zugeordnet sind, sind jedoch über die Klasse HtmlGenericControl
zugänglich. Dies ermöglicht es, solche Steuerelemente dynamisch zu erstellen und zu ändern.
Die Lösung ist daher zweifach:
- die ungeordnete Liste Make
runat="server"
, so dass Sie es in serverseitigen Code zugreifen können. Außerdem sollten Sie die vorhandenen Elemente in der Liste runat="server"
einfügen, ansonsten sind sie nur als LiteralControl
zugänglich, die die ersten beiden Listenelemente als Nur-Text enthält.
- Im Code auf den Inhalt der Liste zugreifen und ein neues HtmlGenericControl vom Typ "li" hinzufügen.
die folgenden (nackte Knochen einfach) Seite veranschaulicht dieses Verfahren:
<%@ Page Language="VB" AutoEventWireup="false" %>
<%@ Import Namespace="System.Collections.Generic" %>
<script runat="server">
Private Shared addedItems As List(Of HtmlGenericControl)
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
'On first load, instantiate the List.
addedItems = New List(Of HtmlGenericControl)
End If
End Sub
Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'Add the previously created items to the UL list.
'This step is necessary because
'...the previously added items are lost on postback.
For i As Integer = 0 To addedItems.Count - 1
myList.Controls.Add(addedItems.Item(i))
Next
'Get the existing no. of items in the list
Dim count As Integer = myList.Controls.Count
'Create a new list item based on input in textbox.
Dim li As HtmlGenericControl = CreateBulletItem()
'Add the new list item at the end of the BulletedList.
myList.Controls.AddAt(count, li)
'Also add this newly created list item to the generic list.
addedItems.Add(li)
End Sub
Private Function CreateBulletItem() As HtmlGenericControl
Dim li As New HtmlGenericControl("li")
li.InnerText = txtNewItem.Value
li.Attributes("class") = "myItemClass"
Return li
End Function
</script>
<html>
<head runat="server">
<title>Test Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<ul id="myList" class='myClass' runat="server">
<li runat="server" class="myItemClass">Item 1</li>
<li runat="server" class="myItemClass">Item 2</li>
</ul>
<input type="text" id="txtNewItem" runat="server" />
<asp:Button ID="btn1" runat="server" Text="Add" OnClick="btn1_Click" />
</div>
</form>
</body>
</html>
Verwenden der asp: BulletedList ist keine Option? – miccet