서버 컨트롤 사용하는걸 별로 안좋아하고 특히나 디자인 코딩된 것을 그대로 사용하고 싶어서 Repeater컨트롤을 많이 사용하게 되는데 게시판에서 글 내용이 없을경우 "작성된 글 없음" 을 표시하는 방법과 출력되는 내용을 내 맘대로 만들어서 출력되도록 하는 방법이다.
위와 같은 테이블 구조를 가진 게시판이고 중간의 table 부분을 Repeater를 사용한다.
왜 테이블구조가 저렇게 나왔는지는.... 디자이너가 저렇게 구현해서 주었다. 바꾸기도 귀찮고 해서 그냥 사용중...
<asp:Repeater ID="DataListTable" runat="server" OnItemDataBound="DataListTable_ItemDataBound">
<HeaderTemplate>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
</HeaderTemplate>
<ItemTemplate>
<tr>
<td width="573" height="32" class="bbs" style="padding-left:15px">
<asp:Label ID="bTitle" runat="server" Text="Label"></asp:Label>
</td>
<td width="80" align="center" class=""><asp:Label ID="bDate" runat="server" Text="Label"></asp:Label></td>
<td width="67" align="center" class=""><asp:Label ID="bVisit" runat="server" Text="Label"></asp:Label></td>
</tr>
<tr>
<td height="1" colspan="3" bgcolor="#e6e6e6"></td>
</tr>
</ItemTemplate>
<FooterTemplate>
<tr runat="server" id="lblEmptyData" visible="true">
<td colspan="3" height="300" align="center">작성된 글이 없습니다.</td>
</tr>
</table>
</FooterTemplate>
</asp:Repeater>
Header 부분과 Item 부분, Footer부분의 3부분으로 나눠서 구현하였다.
이중 Footer 부분에는 글이 없을경우 작성된 글이 없습니다. 메시지를 출력할 공간을 가진다.
이제 cs단에서 구현된 코드를 보도록 한다.
다른부분들은 다 알것이라 생각하고 실제 데이터가 Bind되고 Bind된 내용을 출력하는 부분이다.
작성된 글이 없을경우 출력하기 위해서 FooterTemplate를 사용하는것은 알았지만 내가 뭘 잘못했는지 제대로 동작을 하지 않았다. 또한 대부분의 코드가 aspx 코드상에 <%#Evil("컬럼명")%>을 사용하는 코드들이 대부분이었다.
일단 데이터를 Bind하고 Bind하면서 총 게시물의 개수도 같이 가져온다.
DataSet ds = new DataSet();
ds = DataSet 형태로 넘겨받으면 된다.
if (ds != null)
{
DataListTable.DataSource = ds.Tables[0];
if (ds.Tables[0].Rows.Count > 0)
{
totPageCnt = Convert.ToInt32(ds.Tables[0].Rows[0]["totCnt"].ToString());
}
DataListTable.DataMember = "DataListTable";
DataListTable.DataBind();
}
* totPageCnt 는 전역변수로 선언되어 있고 기본값은 0이 들어가 있다.(row의 개수가 0보다 크면 값만 바꿔주면된다.)
위와 같이 진행하면 DataListTable이라는 Repeater컨트롤 안에 Data가 Bind되는 것을 알 수 있다.
위의 상태에서 그대로 출력을 하고자 할 경우에는 Label대신 <%#Evil("컬럼명")%>을 넣어주면 출력된다.
cs단에서 출력할 내용을 한번더 정리해서 출력하고자 할 경우 다음과 같이 처리한다.
protected void DataListTable_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
string bTitle = "";
Label lbl_bTitle = (Label)e.Item.FindControl("bTitle");
Label lbl_bDate = (Label)e.Item.FindControl("bDate");
Label lbl_bVisit = (Label)e.Item.FindControl("bVisit");
//전체 게시물의 수가 1보다 작으면 즉 게시물이 없다면 FooterTemplate의 lblEmptyData의 Visible속성을 바꿔준다.
if (totPageCnt < 1)
{
if (e.Item.ItemType == ListItemType.Footer)
{
HtmlTableRow lbl_footer = (HtmlTableRow)e.Item.FindControl("lblEmptyData");
lbl_footer.Visible = true;
}
}
else
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView data = (DataRowView)e.Item.DataItem;
//작성된 글이 새글일 경우 새글 아이콘 출력하기
if (int.Parse(data["diffDate"].ToString()) < 1)
{
bTitle = " <img src=\"/Images/B_ico_new.gif\" align=\"absmiddle\" />";
}
//제목넣기
lbl_bTitle.Text = "<a href=\"view.aspx?page=" + page + "&idx=" + data["idx"].ToString() + "&sCode=" + sCode + "\">" + data["bTitle"].ToString() + "</a>" + bTitle;
//작성일 넣기
lbl_bDate.Text = data["bDate"].ToString().Substring(2, 8);
//조회수넣기
lbl_bVisit.Text = data["bVisit"].ToString();
}
else if (e.Item.ItemType == ListItemType.Footer)
{
//혹시나 FooterTemplate의 lblEmptyData의 Visible속성이 바뀌었을수도 있으니 확인차원에서 안보이도록 설정한다.
HtmlTableRow lbl_footer = (HtmlTableRow)e.Item.FindControl("lblEmptyData");
lbl_footer.Visible = false;
}
}
}
위와 같이 코드를 작성하면 제목, 작성일, 조회수가 원하는 형태로 출력되는 것을 볼 수 있다.
웹에 올라온 것을 토대로 작성을 해보니 다음과 같은 문제가 발생하였다.
Protected void DataLisTable_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if(DataListTable.Items.Count < 1)
{
if(e.Item.ItemType == ListItemType.Footer)
{
HtmlTableRow lbl_footer = (HtmlTableRow)e.Item.FindControl("lblEmptyData");
lbl_footer.Visible = false;
}
}
}
위와 같이 작성할 경우 무조건 Footer부분이 출력되는 것을 볼 수 있는데 이유는 Data가 Bind되면서 위의 코드를 호출하게 되는데
처음 시작은 무조건 DataListTable.Items.Count의 값이 0부터 시작되는 것을 볼 수 있다.
확인을 하고 싶다면 위의 코드중간에 Response.Write(DataListTable.Items.Count.ToString()); 을 넣어서 출력해보도록 한다.
댓글 영역