私はデータリストと、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" /> <span style="color: #33ff00; font-size: 12pt">@</span> <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();
}
}
@Shawnこのようなことを行って以来、しばらくしていますが、ハイパーリンクにまだ値が割り当てられているとは思われません。バインディングはちょうど起こっているので。 e.Item.DataItemは、現在の「行」を返します。したがって、NavigateURLプロパティではなくURLが存在するかどうかを確認するために、データを参照する必要があります。 e.Item.DataItemはDataRowView型になります((DataRowView)e.Item.DataItem)["eventLink"]は現在の行の特定の列を返します。 DBNullの場合は、例のeLinkコントロールを非表示にします。 –
@ ShivKumar - あなたのメソッドと@ ShawnStewardのメソッドは同じようにうまくいくはずですが、データベース/データモデルの設計によってはDBNullが機能するかどうかをチェックします。 – 5arx
@ 5arx、どのように "データベース/データモデルに依存するのですか"? DBNull.Valueを使用し、.net nullキーワードではなくNULLをデータベースでチェックする必要があります。 –