Suppongo che vi sia un motivo valido per non utilizzare il controllo del server Web BulletedList. Ad ogni modo, questo è un esercizio di programmazione interessante che illustra i componenti interni dell'architettura Htmlservercontrol e come si collegano a semplici tag HTML.
I tag HTML ul
e li
non vengono mappati direttamente come HTMLServercontrols. Ciò significa che anche se si aggiunge un attributo runat="server"
all'elenco, i contenuti non saranno direttamente accessibili come listini.
Tuttavia, tutti i controlli non mappati direttamente come controlli del server Html sono accessibili tramite la classe HtmlGenericControl
. Ciò rende possibile creare e modificare tali controlli dinamicamente.
La soluzione, quindi, è duplice:
- fare la lista non ordinata
runat="server"
in modo che vi si possa accedere in codice lato server. Inoltre, è necessario creare gli elementi esistenti nell'elenco runat="server"
, altrimenti saranno accessibili solo come LiteralControl
che contiene i primi due listitems come testo normale.
- Nel codice, accedere al contenuto dell'elenco e aggiungere un nuovo HtmlGenericControl di tipo "li" ad esso.
Il seguente (bare-bones semplice) pagina illustra questa procedura:
<%@ 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>
Utilizzare asp: BulletedList non è un'opzione? – miccet