2011-02-10 27 views
1

我有一個datalist和一個超鏈接控件,它包含一個url。用戶通過管理網站創建這個數據列表,並不是所有的超鏈接都有鏈接。問題是如何隱藏數據庫字段中沒有url的鏈接。爲DataList遍歷數據列表來設置控件的可見性

代碼:

<asp:DataList ID="dtlPromoEvents" runat="server" CellPadding="2" CellSpacing="2" RepeatColumns="1" RepeatDirection="Vertical" RepeatLayout="Table" > 
    <ItemTemplate> 
     <asp:Label ID="lblPromoHeading" runat="server" Text='<%# Eval("eventHeading") %>' Font-Size="12pt" ForeColor="#FFFF00" /> 
     <br /> 
     <br /> 
     <asp:Label ID="promoDate" runat="server" Text='<%# Eval("eventDate", "{0:D}") %>' Font-Size="11pt" ForeColor="#33FF00" />&nbsp;<span style="color: #33ff00; font-size: 12pt">@</span>&nbsp;<asp:Label ID="lblPromoTime" runat="server" Text='<%# Eval("startTime", "{0:t}") %>' Font-Size="11pt" ForeColor="#33FF00" /> 
     <br /> 
     <br /> 
     <asp:Label ID="lblPromoDetails" runat="server" Text='<%# Eval("eventDetails") %>' Font-Size="11pt" /> 
     <br /> 
     <br /> 
     <br /> 
     <asp:HyperLink ID="eventLink" Text="Check this out!" CssClass="linkEvent" Visible="false" runat="server" Target="_blank" ToolTip="click to go check out what's happening!" NavigateUrl='<%# Eval("eventLink") %>' /> 
     <br /> 
     <br /> 
     <br /> 
     <hr style="width: 480px; height: 1px; background-color: #ff9900; border-color: #ff9900" /> 
     <br /> 
    </ItemTemplate> 
</asp:DataList> 

在後面我將用代碼的數據源,現在我難倒就如何實現到項,並控制「看看這個」鏈接的可見性代碼根據db字段是否有鏈接。

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      dtlPromoEvents.DataSource = LoadEvents(); 

      //filter through the events and turn on visibility for the events that have a live link. 


      dtlPromoEvents.DataBind(); 
     }  
    } 

    public static DataSet LoadEvents() 
    { 
     DataSet eventInfo = new DataSet(); 

     string connectionString = ConfigurationManager.AppSettings["ConnectBeerGeeksDb"]; 

     using (SqlConnection selectConnInfo = new SqlConnection(connectionString)) 
     { 
      SqlDataAdapter adapterInfo = new SqlDataAdapter("SELECT [eventDate], [startTime], [eventHeading], [eventDetails], [eventLink] FROM [promoEvent] WHERE (eventDate + 1 > GETDATE()) ORDER BY eventDate", selectConnInfo); 
      selectConnInfo.Open(); 
      eventInfo.Clear(); 
      adapterInfo.Fill(eventInfo); 
      selectConnInfo.Close(); 
     } 
     return eventInfo; 
    } 

任何意見,將不勝感激。

感謝,

rjsteward

增加,在這個URL工作的細化代碼:[http://beergeekspub.com/events.aspx][1]

protected void dtlPromoEvents_ItemDataBound(object sender, DataListItemEventArgs e) 
    { 

     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      // Retrieve the Hyperlink control in the current DataListItem. 
      HyperLink eLink = (HyperLink)e.Item.FindControl("eventLink"); 

      // Check if a URL exists, if not then hide the control 
      if (string.IsNullOrEmpty(eLink.NavigateUrl)) 
      { 
       eLink.Visible =false; 
      } 

     } 
    } 

也頁加載數據綁定數據列表 -

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      dtlPromoEvents.DataSource = LoadEvents(); 

      dtlPromoEvents.DataBind(); 
     }  
    } 

回答

2

您應該使用ItemDataBound事件來捕獲當它們被綁定到數據時,它們被控制。在這種情況下,您可以檢查URL是否存在,如果不存在,則隱藏超鏈接控件。

如何:在運行時自定義DataList控件的項目:
http://msdn.microsoft.com/en-us/library/6y92e1ze(v=VS.100).aspx#Y900

DataList.ItemDataBound事件
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datalist.itemdatabound(v=VS.100).aspx

例如,修改第二連桿(就在我的頭頂上的例子,而不是C#的傢伙,所以這可能不是確切的):

protected void dtlPromoEvents_ItemDataBound(object sender, DataListItemEventArgs e) 
    { 

     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      // Retrieve the Hyperlink control in the current DataListItem. 
      HyperLink eLink = (HyperLink)e.Item.FindControl("eventLink"); 

      // Check if a URL exists, if not then hide the control 
      if (string.IsNullOrEmpty(eLink.NavigateUrl)) 
      { 
       eLink.Visible =false; 
      } 

     } 
    } 

在asp標記做到這一點:

<asp:DataList ID="dtlPromoEvents" runat="server" CellPadding="2" CellSpacing="2" OnItemDataBound="dtlPromoEvents_ItemDataBound" RepeatColumns="1" RepeatDirection="Vertical" RepeatLayout="Table" > 
+0

@Shawn,因爲我做了這種事情已經有一段時間了,但我不相信超鏈接會分配值。由於綁定正在發生。 e.Item.DataItem將給出當前的「行」。所以我們應該看看數據是否存在,而不是NavigateURL屬性。 e.Item.DataItem將是DataRowView類型(我認爲),因此((DataRowView)e.Item.DataItem)[「eventLink」]將給出當前行的特定列。如果是DBNull,則在您的示例中隱藏eLink控件。 – 2011-02-11 04:48:51