2015년 7월 27일 월요일

C# WebForm : 사용자 관리 (4) : 사용자 목록 페이지 - 리스트 조회

일단 사용자 목록 페이지를 하나 생성.


그리고 화면을 대충 구성.


사용자 등록 페이지에 비해 정말 단촐하게...
실제로 등록된 것이라고는 버튼 2개와 "Literal" 하나 뿐...

일반적으로 리스트를 구성할때 "GridView" 를 많이 쓰지만, 여기서는 그냥 "Literal" 을 이용해 Html 로 처리 한다.
"GridView" 를 쓰면 쉽고 간단한 면이 있지만, 요즘은 "AJAX" 도 많이 쓰고 특히 "반응형웹" 등등... 별의별 요구사항 들을 다 적용하다 보면 차라리 그냥 "Html" 로 처리하는게 낫다.

[MemberList.aspx]

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MemberList.aspx.cs" Inherits="web_member_MemberList" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>

    <link rel="stylesheet" href="../_style/_style.css" type="text/css" />
    <link rel="stylesheet" href="../_style/table.css" type="text/css" />
    <link rel="stylesheet" href="../_style/member.css" type="text/css" />

</head>
<body>
    <form id="form1" runat="server">
    <div class="wrap">


<asp:ScriptManager ID="ScriptManager" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel" runat="server">
<ContentTemplate>

    <!--↓↓↓↓↓여기서부터↓↓↓↓↓-->
    <div class="content">
        <div class="title">
            회원관리
        </div>
                               
        <div class="body">

            <asp:Literal ID="ltrTable" runat="server"></asp:Literal>

        </div>
                   
        <div class="bottom">
            <asp:Button ID="btnInsert" runat="server" Text="Write" alt="Write" OnClick="btnInsert_Click" />
            <asp:Button ID="btnSearch" runat="server" Text="Search" alt="Search" OnClick="btnSearch_Click" />
        </div>
    </div>
    <!--↑↑↑↑↑여기까지↑↑↑↑↑-->

</ContentTemplate>
</asp:UpdatePanel>
   
    </div>
    </form>
</body>
</html>

[MemberList.cs]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Site.FrameWork.BaseClass;
using Site.FrameWork.Common;

public partial class web_member_MemberList : WebBase
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnSearch_Click(object sender, EventArgs e)
    {

    }
    protected void btnInsert_Click(object sender, EventArgs e)
    {

    }
}


이렇게 대충 틀만 잡아 놓은뒤...

"cReturnValue.cs" 에 데이터셋을 리턴하는 구조체를 하나 추가.


그런 다음. "BizBase" 에 데이터 셋을 조회 하는 쿼리 실행기를 추가 한다. ...


그런 다음 데이터를 조회 하는 쿼리를 하나 만들어 주고...


[P_MEMBER_MemberList_SELECT01.sql]

IF (OBJECT_ID ('[dbo].[P_MEMBER_MemberList_SELECT01]', 'P') IS NOT NULL)
BEGIN
    DROP PROCEDURE [dbo].[P_MEMBER_MemberList_SELECT01];
END
GO

/*
** Description: 1.회원 데이터를 조회한다.
** Author:  Son10001
** Create date: 2015-07-15
** Sample: Exec P_MEMBER_MemberList_SELECT01
*/

CREATE PROCEDURE [dbo].[P_MEMBER_MemberList_SELECT01]
(
    @intPageIndex int,
    @intPageSize int,
    
    @strLoginID  varchar(100),
    @strLoginName varchar(25),
    @strGroup  varchar(25)
)
AS

if (@strLoginID = '') 
    begin
        set @strLoginID = '%'
    end
else
    begin
        set @strLoginID = '%' + @strLoginID + '%'
    end

if (@strLoginName = '') 
    begin
        set @strLoginName = '%'
    end
else
    begin
        set @strLoginName = '%' + @strLoginName + '%'
    end

if (@strGroup = '') 
    begin
        set @strGroup = '%'
    end
else
    begin
        set @strGroup = '%' + @strGroup + '%'
    end


BEGIN
WITH MEMBER_ROW_NUMBER_LIST AS
(
    SELECT 
        intNum, strLoginID, strGroup, strLoginPwd, strLoginName, strEmail, strBirthday, 
        strHomePost, strHomeAddr1, strHomeAddr2, strHomeTel, strMobile, 
        intVisit, strSignIP, strRegID, strModID, 
        CONVERT(NVARCHAR(10), CONVERT(DATETIME, dateSignDate) , 121) AS dateSignDate, 
        CONVERT(NVARCHAR(10), CONVERT(DATETIME, dateRegDate) , 121) AS dateRegDate, 
        CONVERT(NVARCHAR(10), CONVERT(DATETIME, dateModDate) , 121) AS dateModDate, 

        ROW_NUMBER() OVER (ORDER BY strLoginID DESC) AS ROW_INDEX
    FROM 
        T_MEMBER_LIST
    WHERE
        strLoginID LIKE @strLoginID
        AND ISNULL(strLoginName, '') LIKE @strLoginName
        AND ISNULL(strGroup, '') LIKE @strGroup
)

SELECT
        *
FROM 
    MEMBER_ROW_NUMBER_LIST
WHERE
    ROW_INDEX >= @intPageIndex + 1
    AND ROW_INDEX < @intPageSize + @intPageIndex + 1
ORDER BY strLoginID DESC


SELECT
    COUNT(*)
FROM 
    T_MEMBER_LIST
WHERE
    strLoginID LIKE @strLoginID
    AND ISNULL(strLoginName, '') LIKE @strLoginName
    AND ISNULL(strGroup, '') LIKE @strGroup

END


그리고 비즈 단에 처리 로직을 작성...
일단 검색 파라메터를 넘겨줄 데이터 형태를 하나 만들어 주고...
기본적으로 현재 페이지, 페이지당 아이템 갯수는 지정되어야 하고, 검색 조건으로 사용자 아이디, 사용자 명, 그룹... 등등... 을 지정 할 수 있게 만듬. 이건 필요하다면 늘일 수도 ... 줄일 수도 있음. 그리고 리스트 조회 처리 로직을 작성... 위에서 만든 검색 조건을 파라메터로 넘겨 주면 그것으로 쿼리를 실행하여 결과 값을 돌려 줌.
비즈 로직까지 만들어쓰면, 이제 웹단에서 호출하는 것을 만들어 주면 된다. 웹페이지에서 ... "Search" 버튼을 클릭시 실행할 함수를 만들어 준다.
저기서 GetData() 가 실제 BizLayer 를 호출하고 웹페이지에 결과 값을 출력하는 부분.

[MemberList.cs]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

using Site.Dac;
using Site.FrameWork.BaseClass;
using Site.FrameWork.Common;

public partial class web_member_MemberList : WebBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void btnSearch_Click(object sender, EventArgs e)
    {
        GetData();
    }
    protected void btnInsert_Click(object sender, EventArgs e)
    {
    }

    private void GetData(int pageIndex = 1)
    {
        cReturnValue.dsReturnValue dsReVal = new cReturnValue.dsReturnValue();
        dsReVal.Result = 0;
        dsReVal.Data = null;
        dsReVal.Message = "";

        Site.Biz.MemberBiz.MemSearch searchInfo = new Site.Biz.MemberBiz.MemSearch();
        searchInfo.pageIndex = pageIndex;
        searchInfo.pageSize = 10;
        searchInfo.strLoginID = "";
        searchInfo.strGroup = "";
        searchInfo.strLoginName = "";

        // Biz  생성
        using (Site.Biz.MemberBiz biz = new Site.Biz.MemberBiz())
        {
            dsReVal = biz.list (searchInfo);

            if (dsReVal.Result < 0)              // 그룹 등록
            {
                ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType()
                            , "SysMessage", "alert('" + dsReVal.Message.Replace("'", "\\'").Replace("\r\n", "\\r\\n") + "')"
                            , true);
                return;
            }
        }

        string strList = string.Empty;
        int itemNum;
        ltrTable.Text = "";

        strList = @"
                <table class='tb_BlackLine' style='width:100%;'>
                    <colgroup>
                        <col width='100'></col>
                        <col width='100'></col>
                        <col></col>
                        <col></col>
                        <col width='150'></col>
                        <col width='100'></col>
                    </colgroup>
                  <tr class='head'>
                    <th bgcolor='f4f4f4'><strong>번호</strong></th>
                    <th bgcolor='f4f4f4'><strong>아이디</strong></th>
                    <th bgcolor='f4f4f4'><strong>성명</strong></th>
                    <th bgcolor='f4f4f4'><strong>e-Mail</strong></th>
                    <th bgcolor='f4f4f4'><strong>등록일</strong></th>
                    <th bgcolor='f4f4f4'><strong>그룹</strong></th>
                  </tr>
            ";

        for (itemNum = 0; itemNum < dsReVal.Data.Tables[0].Rows.Count; itemNum++)
        {
            strList += @"
                    <tr>
                      <td>" + dsReVal.Data.Tables[0].Rows[itemNum]["intNum"].ToString() + @"</td>
                      <td><a href='MemberEntry.aspx?SMODE=UPDATE&USER_ID=" + dsReVal.Data.Tables[0].Rows[itemNum]["strLoginID"].ToString() + @"'>" + dsReVal.Data.Tables[0].Rows[itemNum]["strLoginID"].ToString() + @"</a></td>
                      <td><a href='MemberEntry.aspx?SMODE=UPDATE&USER_ID=" + dsReVal.Data.Tables[0].Rows[itemNum]["strLoginID"].ToString() + @"'>" + dsReVal.Data.Tables[0].Rows[itemNum]["strLoginName"].ToString() + @"</a></td>
                      <td><a href='MemberEntry.aspx?SMODE=UPDATE&USER_ID=" + dsReVal.Data.Tables[0].Rows[itemNum]["strLoginID"].ToString() + @"'>" + dsReVal.Data.Tables[0].Rows[itemNum]["strEmail"].ToString() + @"</a></td>
                      <td>" + dsReVal.Data.Tables[0].Rows[itemNum]["dateRegDate"].ToString() + @"</td>
                      <td>" + dsReVal.Data.Tables[0].Rows[itemNum]["strGroup"].ToString() + @"</td>
                    </tr>
                ";
        }

        if (itemNum != 10)
        {
            while (itemNum < 10)
            {
                strList += @"
                        <tr>
                          <td> &nbsp; </td>
                          <td> &nbsp; </td>
                          <td> &nbsp; </td>
                          <td> &nbsp; </td>
                          <td> &nbsp; </td>
                          <td> &nbsp; </td>
                        </tr>
                    ";
                itemNum++;
            }
        }

        strList += @"</table>";

        ltrTable.Text = strList;
    }
}

보다 시피, 그냥 직접 html 을 일일이 만들어 찍고 있다. "GridView" 를 쓰는것보다, 그닥 효율적인 방법은 아니지만, 이해하기가 쉽고, 입맛대로 얼마든지 세세한 컨트롤을 할 수 있다는 장점은 있다. 좀더 다듬는다면 StringBulider 를 쓰는게 좋겠지만, 이렇게 한다고 서버가 다운되고 그러지는 않으니 편한대로 쓰면 된다. ^^; 다 되었으면... 페이지를 실행하고...
저기 "Search" 를 클릭하면...

이렇게 사용자 목록을 조회 해 준다.

일단, 각 사용자를 클릭시 사용자 편집 페잊로 이동하게 링크는 잡혀있다. 요건 담에 구현하고...
아... 페이징... 다음에 ... 하자...
페이징... 귀찮아...