나는 데이터리스트와 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" /> <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, 어떻게 데이터베이스/데이터 모델에 의존합니까? .net null 키워드가 아닌 DBNull.Value를 사용하여 데이터베이스 NULL을 확인해야합니다. –