상세 컨텐츠

본문 제목

Repeater 컨트롤 사용중 출력할 데이터가 없을때

Programming/asp.net

by luckey 2010. 3. 11. 17:09

본문

서버 컨트롤 사용하는걸 별로 안좋아하고 특히나 디자인 코딩된 것을 그대로 사용하고 싶어서 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()); 을 넣어서 출력해보도록 한다.

관련글 더보기

댓글 영역