2010-08-20 31 views
23

tôi có một danh sách UL trong một trang ASPX:Add to List từ codebehind C# Asp.net

<ul id="tabs"> 
<li id="tab1"><a href="ztab1.htm">Tab 1</a></li> 
<li id="tab2"><a href="ztab2.htm">Tab 2</a></li> 
<li id="tab3"><a href="ztab3.htm">Tab 3</a></li> 
<li id="tab4"><a href="ztab4.htm">Tab 4</a></li> 
</ul> 

Tôi muốn thêm các mục danh sách động từ codebehind, bao gồm sự xâm nhập href cho từng hạng mục danh sách mới.

Làm cách nào?

Trả lời

49

Bạn cần phải đánh dấu ul của bạn như một điều khiển phía máy chủ, sau đó điều trị các 'mục mới' như một HtmlGenericControl và chèn nó vào bộ sưu tập kiểm soát:

<ul runat="server" id="tabs"> 

Để thêm các mục, tạo ra một nguyên tố mới và thêm:

HtmlGenericControl li = new HtmlGenericControl("li"); 
tabs.Controls.Add(li); 

HtmlGenericControl anchor = new HtmlGenericControl("a"); 
anchor.Attributes.Add("href", "page.htm"); 
anchor.InnerText = "TabX"; 

li.Controls.Add(anchor); 
+0

Tôi nhận được UL không cho phép lỗi kiểm soát trẻ em – Si8

+1

nó phải là tabs.Controls.Add (li) –

+0

Dim newLi = New HtmlGenericControl ("li") Dim anchor = New HtmlGenericControl ("a") anchor.Attributes.Add ("href", itemrow.Item (" reg_url "). ToString(). Trim()) anchor.InnerText = itemrow.Item (" conf_name ") newLi.Controls.Add (anchor) eventList.Controls.Add (newLi) – mzonerz

7

Sử dụng asp:bulletedList và danh sách của bạn sẽ dễ dàng hơn nhiều.

<asp:BulletedList id="blTabs" 
    BulletStyle="Disc" 
    DisplayMode="LinkButton" 
    runat="server"> 
    <asp:ListItem Value="ztab1.htm">tab1</asp:ListItem> 
    <asp:ListItem Value="ztab2.htm">tab2</asp:ListItem> 
    <asp:ListItem Value="ztab3.htm">tab3</asp:ListItem> 
</asp:BulletedList> 

Mã Đằng sau:

ListItem li = new ListItem(); 
    li.Value = "*.html"; //html goes here i.e. xtab1.html 
    li.Text = "New Text"; //text name goes i.e. here tab1 
    blTabs.Items.Add(li); 
5

Kết quả này cũng tương tự như của GenericTypeTea, nhưng sự khác biệt là HTML là 'viết' trong mã phía sau và tiêm vào trang.

Trong đánh dấu của bạn:

<asp:Literal id="litMarkup" runat="server" /> 

Trong mã của bạn đằng sau:

List<string> locations // however this initialized 

StringBuilder sb = new StringBuilder(); 

sb.Append("<ul id=\"tabs\">"); 

for (int i = 0; i < locations.Count; i++) 
{ 
    sb.Append("<li id=\"tab" + i.ToString() + "\"><a href=\"" + locations[i] + "\">Tab " + i.ToString() + "</a></li>"); 
} 

sb.Append("</ul>"); 

litMarkup.Text = sb.ToString(); 
+0

Tuyệt vời như thế nào tôi được đánh dấu trên một câu trả lời hoàn toàn khả thi và hợp lệ mà không có bất kỳ lời giải thích. –

+0

Nó xảy ra giao phối, không mang nó cá nhân. Một số người dùng quá hèn nhát để đưa ra lời giải thích cho downvote của họ. Tôi đã không cho downvote nhưng tôi đoán bạn đã nhận nó bởi vì đây là một cách khôn ngoan làm việc đó.Không phải vì nó không cung cấp cho cùng một đầu ra, nhưng bởi vì nó là một cơn ác mộng bảo trì tuyệt đối, nhiều mã hơn và khá khó đọc. Chúng tôi đã cấm loại mã này từ các dự án của chúng tôi từ lâu rồi. Các 'TagHelper' trong ASP.Net MVC là một cách tốt đẹp để làm một cái gì đó tương tự như câu trả lời của bạn mặc dù. – GenericTypeTea

+0

@GenericTypeTea - Cảm ơn lời giải thích của bạn, tôi đã không biết bằng cách sử dụng một chữ được coi là một thực hành xấu –

4

Bạn có thể tạo một UL động bằng cách sử dụng một asp:Repeater kiểm soát

Bạn có thể sử dụng lặp lại ở sau bằng cách nào, trong tệp .aspx

<asp:Repeater ID="menu_ul_1" runat="server"> 
    <HeaderTemplate> 
    <ul class="my-menu"> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <li> 
     <a href='<%# Eval("href_li")%>'> 
     <%# Eval("DisplayText")%></a> 
     </li> 
    </ItemTemplate> 
    <FooterTemplate> 
     </ul> 
    </FooterTemplate> 
</asp:Repeater> 
của bạn

Và bạn có thể đưa dữ liệu động thông qua mã phía sau trong .aspx.cs tập tin

protected void Page_Load(object sender, EventArgs e) 
{ 
    DataTable newsDataTable = new DataTable(); 

    // add some columns to our datatable 
    newsDataTable.Columns.Add("href_li"); 
    newsDataTable.Columns.Add("DisplayText"); 

    for (int i = 1; i <= 5; i++) 
    { 
     DataRow newsDataRow = newsDataTable.NewRow(); 
     newsDataRow["href_li"] = "?sc=item_" + i; 
     newsDataRow["DisplayText"] = "List Item # "+i; 
     newsDataTable.Rows.Add(newsDataRow); 
    } 
    menu_ul_1.DataSource = newsDataTable; 
    menu_ul_1.DataBind(); 
} 

Kết quả: Bạn sẽ nhận được sau html thông qua mã này

<ul class="my-menu"> 
    <li><a href='?sc=item_1'>List Item # 1</a> </li> 
    <li><a href='?sc=item_2'>List Item # 2</a> </li> 
    <li><a href='?sc=item_3'>List Item # 3</a> </li> 
    <li><a href='?sc=item_4'>List Item # 4</a> </li> 
    <li><a href='?sc=item_5'>List Item # 5</a> </li> 
</ul> 
+0

Chà ... Tuyệt vời! Làm thế nào tôi có thể chuyển đổi mã của bạn để sử dụng kết nối SQL? http://stackoverflow.com/questions/23565614/how-to-use-dataset-instead-of-datatable-in-c-sharp – Si8

+0

Tôi thực sự đã làm việc đó nhưng làm thế nào tôi có thể thao tác lớp cho các 'LI' khác nhau ? – Si8

+0

Không làm việc cho tôi. Tôi đã bỏ trống 'li' – SearchForKnowledge

0

lồng nó với con phụ huynh, sử dụng yếu tố của bạn như bên dưới

Dim newLi = New HtmlGenericControl("li") 
     Dim anchor = New HtmlGenericControl("a") 
     anchor.Attributes.Add("href", itemrow.Item("reg_url").ToString().Trim()) 
     anchor.InnerText = itemrow.Item("conf_name") 
     newLi.Controls.Add(anchor) 
     eventList.Controls.Add(newLi)