2009-05-29 20 views
7

Mam listę zdefiniowane tak:zapełnić listę kontroli HTML przy użyciu .NET

<ul id="myList" class='myClass'> 
    <li class="myItemClass">Item 1</li> 
    <li class="myItemClass">Item 2</li> 
</ul> 

użyciu .NET Jak mogę dodać elementy do listy dynamicznie? Ja też trzeba podać nazwę klasy na każdej nowej pozycji

+3

Korzystanie z asp: BulletedList nie jest opcją? – miccet

Odpowiedz

2

Najprostszy sposób można rozwiązać ten problem jest za pomocą kontroli repeater asp

<ul id="myList" class='myClass'> 
<asp:Repeater ID="repeaterMyList" Runat="server"> 
<ItemTemplate> 
    <li class="myItemClass"> 
    <%# Eval("Item") %> 
    </li> 
</ItemTemplate> 
</asp:Repeater> 
</ul> 

[Edit] - Nie pamiętam, aby ustawić źródło danych na repeaterMyList i wywołanie databind na kontrolerze wzmacniaka w kodzie źródłowym.

repeaterMyList.DataSource = someDataTable; 
repeaterMyList.DataBind(); 
1

Zakładam, że istnieje uzasadniony powód, aby nie używać kontrolki serwera internetowego BulletedList. W każdym razie jest to interesujące ćwiczenie programistyczne, które ilustruje elementy wewnętrzne architektury Htmlservercontrol i jak mapują one do prostych znaczników HTML.

Znaczniki HTML ul i li nie są bezpośrednio mapowane jako kontrolki HTMLServercontrol. Oznacza to, że nawet jeśli dodasz do listy atrybut runat="server", jego zawartość nie będzie bezpośrednio dostępna jako lista znaków.

Jednak wszystkie elementy sterowania, które nie są bezpośrednio zamapowane jako elementy sterujące serwera HTML, są dostępne za pośrednictwem klasy HtmlGenericControl. Umożliwia to dynamiczne tworzenie i modyfikowanie takich kontrolek.

Rozwiązaniem jest więc dwojaka:

  • Zrób listę nieuporządkowaną runat="server", dzięki czemu można uzyskać do niego dostęp w kodu po stronie serwera. Powinieneś również utworzyć istniejące elementy na liście runat="server", w przeciwnym razie będą one dostępne tylko jako LiteralControl, które zawierają pierwsze dwa listy jako zwykły tekst.
  • W kodzie, uzyskaj dostęp do zawartości listy i dodaj do niej nowy HtmlGenericControl typu "li".

następujące (goły proste) strony demonstruje tę procedurę:


<%@ 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> 
+0

Jako, że jestem nowy w .net, mogę zapytać, dlaczego tworzysz addedItems = Nowa lista (z HtmlGenericControl) podczas ładowania strony? Nie widzę, żeby ta lista była "powiązana" z jakąkolwiek kontrolą, prawda? Dlaczego dodajesz przedmioty z tej listy do ul? Przepraszam, jeśli to nowe pytanie. –

+0

@dasha: Ponieważ dynamicznie utworzone listy nie są zachowywane w pamięci ani w obiekcie ViewState. Musiałem gdzieś przechowywać nowo utworzone listy, aby móc je dodać do UL. Musiałem również udostępnić zmienną "addedItems" Shared, aby móc uzyskać do niej dostęp po odświeżeniu. – Cerebrus

+0

Dodałem komentarze wyjaśniające do kodu. Mam nadzieję że to pomoże. :-) – Cerebrus

4

Można użyć asp: BulletedList jak

<asp:BulletedList ID="MyList1" CssClass="MyClass" runat="server"> 
    <asp:ListItem Text="Item1" class="MyClass" /> 
</asp:BulletedList> 

Dodaj dodać kod jak

ListItem item = new ListItem("Item2"); 
item.Attributes.Add("class", "MyClass"); 
MyList1.Items.Add(item); 

Jeśli z jakiegoś konkretnego powodu musisz użyć tagu ul, możesz dodać do niego runat = "server". Na przykład.

<ul id="MyList2" class="MyClass" runat="server"> 
    <li class="MyClass">Item1</li> 
</ul> 

z kodem jak

HtmlGenericControl li = new HtmlGenericControl("li"); 
li.Attributes.Add("class", "MyClass"); 
li.InnerText = "Item2"; 
MyList2.Controls.Add(li); 
14

można nawet użyć tego kodu HTML, dodając runat = „server” będzie można traktować go jako HTMLControl nie mater co kontrolować to, ja to zrobić często z div

<ul id="myList" runat="server" class="myClass"> 
    <li class="myItemClass">Item 1</li> 
    <li class="myItemClass">Item 2</li> 
</ul> 

następnie dostać że HTMLControl i bawić się z nim

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); 
} 

skończy się z:

<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> 

oczywiście, że można wykorzystać listę uporządkowaną lub unorderer, ale także poniżej Controls Web ASP.NET.

<asp:BulletedList runat="server" ... 
+0

Próbuję zastosować tę technikę. Ale otrzymuję wyjątek odwołania zerowego przy użyciu "mylist.something" w kodzie użytkownika z tyłu. Czy ktoś może ci pomóc. –

+0

pracował dla mnie, thx alot !!! – Sam

Powiązane problemy