2011-02-10 5 views
1

나는 데이터리스트와 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

th를 캡처하려면 ItemDataBound 이벤트를 사용해야합니다 e는 데이터에 바인딩 될 때 제어합니다. 이 경우 URL이 있는지 확인할 수 있고 그렇지 않은 경우 하이퍼 링크 컨트롤을 숨길 수 있습니다.

하는 방법 : 그냥 내 머리 위로 떨어져 2 링크 (의 예를 수정,
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

: 런타임에 DataList에 항목을 사용자 정의 , 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 태그에서 다음을 수행하십시오.

+0

@Shawn 이런 종류의 일을 한 지 오래되었지만 하이퍼 링크에 아직 할당 된 값이 없다고 생각합니다. 바인딩이 일어나기 때문에. e.Item.DataItem은 현재 "행"을 제공합니다. 따라서 NavigateURL 속성보다는 URL이 있는지 확인하기 위해 데이터를 살펴 봐야합니다. e.Item.DataItem은 DataRowView 유형입니다 (생각합니다). ((DataRowView) e.Item.DataItem) [ "eventLink"]는 현재 행에 대한 특정 열을 제공합니다. DBNull이면 예제에서 eLink 컨트롤을 숨 깁니다. –

+0

@ ShivKumar - 당신의 메소드와 @ ShawnSteward의 메소드는 똑같이 잘 작동해야한다. 데이터베이스/데이터 모델 디자인에 따라 DBNull이 작동하는지 여부를 체크한다. – 5arx

+0

@ 5arx, 어떻게 데이터베이스/데이터 모델에 의존합니까? .net null 키워드가 아닌 DBNull.Value를 사용하여 데이터베이스 NULL을 확인해야합니다. –

관련 문제