2011-02-10 6 views
1

私はデータリストと、URLを保持するハイパーリンクコントロールを持っています。ユーザーは管理者のウェブサイトからこのデータリストを作成し、すべてのハイパーリンクにリンクがあるわけではありません。問題は、データベースフィールドにURLを持たないリンクを非表示にする方法です。データリストのためのデータリストを反復して、コントロールの可視性を設定します。

コード:私の背後にあるコードで

<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イベントを使用して、 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:DataList ID="dtlPromoEvents" runat="server" CellPadding="2" CellSpacing="2" OnItemDataBound="dtlPromoEvents_ItemDataBound" RepeatColumns="1" RepeatDirection="Vertical" RepeatLayout="Table" > 
+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、どのように "データベース/データモデルに依存するのですか"? DBNull.Valueを使用し、.net nullキーワードではなくNULLをデータベースでチェックする必要があります。 –

関連する問題