레이블이 사용자관리인 게시물을 표시합니다. 모든 게시물 표시
레이블이 사용자관리인 게시물을 표시합니다. 모든 게시물 표시

2015년 7월 29일 수요일

C# WebForm : 사용자 관리 (6) : 사용자 삭제 페이지

사용자 삭제 페이지 역시 사용자 수정과 거의 같은 단계를 거친다.
일단 사용자 조회 페이지...

그러고 보니 삭제 버튼이 없다.

"MemberEntry.aspx" 에 버튼 하나 추가하고, 클릭 이벤트 추가.


전체 사용자 정보가 아니라, 사용자 아이디 하나만 값으로 전달한다는것 외에는 사용자 등록과 거의 유사하므로 btnInsert_Click() 을 복사해서 약간만 수정하면 된다.

그리고, "MemberBiz" 에 Delete() 함수를 추가 한다.

파라메타를 하나 밖에 전달 하지 않으니 정말 소스가 간단...
삭제 쿼리도 정말 간단하다.


요렇게 하고, 아무 사용자나 조회 한다음에 삭제 버튼을 클릭하면...


삭제 완성.

만약 삭제후 리스트로 돌아가게 만들려면...

이렇게 메시지 띄울때 리스트로 이동하게 스크립트를 추가해 주면 된다.



C# WebForm : 사용자 관리 (5) : 사용자 수정 페이지

이전에 사용자 등록 페이지를 만들었으니, 사용자 수정 페이지는 그냥 그걸 활용하면됨.


이전에 리스트 페이지 만들때, "MemberEntry.aspx" 로 링크 되게 만들어져 있음.
파라메터로 "SMODE", "USER_ID" 를 전달하게 되어 있음.

 하지만, 데이터 조회 기능이 구현되어 있지 않으므로 페이지로 가봐도 빈 페이지만 나옴.
그러니 기능을 구현해야 하는데, 일단 이전 페이지에서 전달한 파라메터를 받아 와야함.

"MemberEntry" 페이지에 public 변수를 선언.


물론, 저렇게 굳이 ViewState 에 저장하지 않아도 되지만, ViewState 에 저장하지 않으면, PostBack 이벤트 발생시마다 계속 파라메타 값을 읽어와야함.


암튼, 그 후에 getRequest() 라는 함수를 만들어 파라메타 값을 읽어오는 기능을 구현.
그리고, 읽어온 파라메타 중 "SMODE" 값을 기준으로 사용자 등록 기능인지, 사용자 수정 기능인지를 판단함.

사용자 수정 기능이면, getUserInfo(); 를 호출


나중에 읽어온 값을 각 텍스트박스에 넣어주는것 빼고는, 그냥 사용자 등록과 거의 같음.
그냥 "MemberBiz" 를 선언하고, Info() 를 호출.

그러기 위해서는 "MemberBiz" 에 Info() 기능을 추가해놔야 함.


당연히 쿼리도 하나 만들어야 하고...


이대로 제대로 진행 되었다면, 조금전 사용자 페이지를 새로 고침하면...


이렇게 현재 지정된 아이디의 정보를 불러옴.
그리고, 수정 버튼에 이벤트를 등록하고, 업데이트를 수행.

보시다시피 사용자 등록과 거의 똑같음. 그냥 Biz 단에 "Update" 라는 로직을 추가 해서 호출 할 뿐.

[MeberBiz.cs]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;

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

namespace Site.Biz
{
    public class MemberBiz : BizBase
    {
        // User 데이터
        public struct MemInfo
        {
            public int intNum;
            public string strLoginID;
            public string strGroup;
            public string strLoginPwd;
            public string strLoginName;
            public string strEmail;
            public string strBirthday;
            public string strHomePost;
            public string strHomeAddr1;
            public string strHomeAddr2;
            public string strHomeTel;
            public string strMobile;
            public int intVisit;
            public string strSignIP;
            public string dateSignDate;
            public string strRegID;
            public string dateRegDate;
            public string strModID;
            public string dateModDate;
        }

        // 검색 데이터
        public struct MemSearch
        {
            public int pageIndex;
            public int pageSize;

            public string strLoginID;
            public string strGroup;
            public string strLoginName;
        }


        public cReturnValue.bReturnValue Insert(MemInfo ro)
        {
            cReturnValue.bReturnValue bReVal = new cReturnValue.bReturnValue();
            bReVal.Result = true;
            bReVal.Message = "";

            string setQuery = string.Empty;

            try
            {
                DBCon();       // DB 커넥션 생성

                // item 등록
                setQuery = "P_MEMBER_MemberInfo_INSERT01";

                SqlParameter[] sqlParams = {
                            new SqlParameter("strLoginID",     SqlDbType.VarChar, 200), 
                            new SqlParameter("strGroup",     SqlDbType.Char, 4), 
                            new SqlParameter("strLoginPwd",     SqlDbType.VarChar, 20), 
                            new SqlParameter("strLoginName",    SqlDbType.VarChar, 20), 
                            new SqlParameter("strEmail",     SqlDbType.VarChar, 64), 
                            new SqlParameter("strBirthday",     SqlDbType.VarChar, 9), 
                            new SqlParameter("strHomePost",     SqlDbType.VarChar, 6), 
                            new SqlParameter("strHomeAddr1",    SqlDbType.VarChar, 64), 
                            new SqlParameter("strHomeAddr2",    SqlDbType.VarChar, 64), 
                            new SqlParameter("strHomeTel",     SqlDbType.VarChar, 14), 
                            new SqlParameter("strMobile",     SqlDbType.VarChar, 13), 
                            new SqlParameter("intVisit",     SqlDbType.Int), 
                            new SqlParameter("strSignIP",       SqlDbType.VarChar, 15), 
                            new SqlParameter("dateSignDate",    SqlDbType.VarChar, 128), 
                            new SqlParameter("strRegID",        SqlDbType.VarChar, 200), 
                            new SqlParameter("dateRegDate",     SqlDbType.VarChar, 128), 
                            new SqlParameter("strModID",        SqlDbType.VarChar, 200), 
                            new SqlParameter("dateModDate",     SqlDbType.VarChar, 128)
                        };

                sqlParams[0].Value = ro.strLoginID;
                sqlParams[1].Value = ro.strGroup;
                sqlParams[2].Value = ro.strLoginPwd;
                sqlParams[3].Value = ro.strLoginName;
                sqlParams[4].Value = ro.strEmail;
                sqlParams[5].Value = ro.strBirthday;
                sqlParams[6].Value = ro.strHomePost;
                sqlParams[7].Value = ro.strHomeAddr1;
                sqlParams[8].Value = ro.strHomeAddr2;
                sqlParams[9].Value = ro.strHomeTel;
                sqlParams[10].Value = ro.strMobile;
                sqlParams[11].Value = ro.intVisit;
                sqlParams[12].Value = ro.strSignIP;
                sqlParams[13].Value = ro.dateSignDate;
                sqlParams[14].Value = ro.strRegID;
                sqlParams[15].Value = ro.dateRegDate;
                sqlParams[16].Value = ro.strModID;
                sqlParams[17].Value = ro.dateModDate;

                cReturnValue.iReturnValue iReVal = new cReturnValue.iReturnValue();
                iReVal.Result = -1;
                iReVal.Message = "";

                iReVal = ExecuteNonQuery(CommandType.StoredProcedure, setQuery, sqlParams);

                if (iReVal.Result < 1)    // Error !!
                {
                    bReVal.Message = iReVal.Message;
                    bReVal.Result = false;
                    return bReVal;
                }

                return bReVal;
            }
            catch (Exception ex)
            {
                bReVal.Message = ex.Message;
                bReVal.Result = false;
                return bReVal;
            }
        }

        public cReturnValue.bReturnValue Update(MemInfo ro)
        {
            cReturnValue.bReturnValue bReVal = new cReturnValue.bReturnValue();
            bReVal.Result = true;
            bReVal.Message = "";

            string setQuery = string.Empty;

            try
            {
                DBCon();       // DB 커넥션 생성

                // item 등록
                setQuery = "P_MEMBER_MemberInfo_UPDATE01";

                SqlParameter[] sqlParams = {
                            new SqlParameter("strLoginID",     SqlDbType.VarChar, 200), 
                            new SqlParameter("strGroup",     SqlDbType.Char, 4), 
                            new SqlParameter("strLoginPwd",     SqlDbType.VarChar, 20), 
                            new SqlParameter("strLoginName",    SqlDbType.VarChar, 20), 
                            new SqlParameter("strEmail",     SqlDbType.VarChar, 64), 
                            new SqlParameter("strBirthday",     SqlDbType.VarChar, 9), 
                            new SqlParameter("strHomePost",     SqlDbType.VarChar, 6), 
                            new SqlParameter("strHomeAddr1",    SqlDbType.VarChar, 64), 
                            new SqlParameter("strHomeAddr2",    SqlDbType.VarChar, 64), 
                            new SqlParameter("strHomeTel",     SqlDbType.VarChar, 14), 
                            new SqlParameter("strMobile",     SqlDbType.VarChar, 13), 
                            new SqlParameter("intVisit",     SqlDbType.Int), 
                            new SqlParameter("strSignIP",       SqlDbType.VarChar, 15), 
                            new SqlParameter("dateSignDate",    SqlDbType.VarChar, 128), 
                            new SqlParameter("strRegID",        SqlDbType.VarChar, 200), 
                            new SqlParameter("dateRegDate",     SqlDbType.VarChar, 128), 
                            new SqlParameter("strModID",        SqlDbType.VarChar, 200), 
                            new SqlParameter("dateModDate",     SqlDbType.VarChar, 128)
                        };

                sqlParams[0].Value = ro.strLoginID;
                sqlParams[1].Value = ro.strGroup;
                sqlParams[2].Value = ro.strLoginPwd;
                sqlParams[3].Value = ro.strLoginName;
                sqlParams[4].Value = ro.strEmail;
                sqlParams[5].Value = ro.strBirthday;
                sqlParams[6].Value = ro.strHomePost;
                sqlParams[7].Value = ro.strHomeAddr1;
                sqlParams[8].Value = ro.strHomeAddr2;
                sqlParams[9].Value = ro.strHomeTel;
                sqlParams[10].Value = ro.strMobile;
                sqlParams[11].Value = ro.intVisit;
                sqlParams[12].Value = ro.strSignIP;
                sqlParams[13].Value = ro.dateSignDate;
                sqlParams[14].Value = ro.strRegID;
                sqlParams[15].Value = ro.dateRegDate;
                sqlParams[16].Value = ro.strModID;
                sqlParams[17].Value = ro.dateModDate;

                cReturnValue.iReturnValue iReVal = new cReturnValue.iReturnValue();
                iReVal.Result = -1;
                iReVal.Message = "";

                iReVal = ExecuteNonQuery(CommandType.StoredProcedure, setQuery, sqlParams);

                if (iReVal.Result < 1)    // Error !!
                {
                    bReVal.Message = iReVal.Message;
                    bReVal.Result = false;
                    return bReVal;
                }

                return bReVal;
            }
            catch (Exception ex)
            {
                bReVal.Message = ex.Message;
                bReVal.Result = false;
                return bReVal;
            }
        }

        public cReturnValue.dsReturnValue List(MemSearch ro)
        {
            cReturnValue.dsReturnValue dsReVal = new cReturnValue.dsReturnValue();
            dsReVal.Result = 0;
            dsReVal.Data = null;
            dsReVal.Message = "";

            string setQuery = "P_MEMBER_MemberList_SELECT01";

            try
            {
                DBCon();       // DB 커넥션 생성

                SqlParameter[] sqlParams = {
                            new SqlParameter("intPageIndex", SqlDbType.Int), 
                            new SqlParameter("intPageSize",     SqlDbType.Int),
                            new SqlParameter("strLoginID",     SqlDbType.VarChar, 200), 
                            new SqlParameter("strLoginName",    SqlDbType.VarChar, 20),
                            new SqlParameter("strGroup",        SqlDbType.VarChar, 20)
                        };

                sqlParams[0].Value = (ro.pageIndex - 1) * ro.pageSize;
                sqlParams[1].Value = ro.pageSize;
                sqlParams[2].Value = ro.strLoginID;
                sqlParams[3].Value = ro.strLoginName;
                sqlParams[4].Value = ro.strGroup;

                dsReVal = ExecuteDataSet(CommandType.StoredProcedure, setQuery, sqlParams);

                return dsReVal;
            }
            catch (Exception ex)
            {
                dsReVal.Message = ex.Message;
                dsReVal.Result = -1;
                return dsReVal;
            }
        }

        public cReturnValue.dsReturnValue Info(MemSearch ro)
        {
            cReturnValue.dsReturnValue dsReVal = new cReturnValue.dsReturnValue();
            dsReVal.Result = 0;
            dsReVal.Data = null;
            dsReVal.Message = "";

            string setQuery = "P_MEMBER_MemberInfo_SELECT01";

            try
            {
                DBCon();
                SqlParameter[] sqlParams = {
                            new SqlParameter("strLoginID",     SqlDbType.VarChar, 200)
                        };

                sqlParams[0].Value = ro.strLoginID;

                dsReVal = ExecuteDataSet(CommandType.StoredProcedure, setQuery, sqlParams);

                return dsReVal;
            }
            catch (Exception ex)
            {
                dsReVal.Message = ex.Message;
                dsReVal.Result = -1;
                return dsReVal;
            }
        }

    }
}


[P_MEMBER_MemberInfo_UPDATE01.sql]
      
IF (OBJECT_ID ('[dbo].[P_MEMBER_MemberInfo_UPDATE01]', 'P') IS NOT NULL)
BEGIN
    DROP PROCEDURE [dbo].[P_MEMBER_MemberInfo_UPDATE01];
END
GO
        
/*
** Description: 업체 정보를 수정한다.
** Author:  Son10001
** Create date: 2015-07-15
** Sample: Exec [P_MEMBER_MemberInfo_UPDATE01]
*/

CREATE PROCEDURE [dbo].[P_MEMBER_MemberInfo_UPDATE01]
(
    @strLoginID Varchar(128), 
    @strGroup Varchar(128), 
    @strLoginPwd Varchar(128), 
    @strLoginName Varchar(128), 
    @strEmail Varchar(128), 
    @strBirthday Varchar(128), 
    @strHomePost Varchar(128), 
    @strHomeAddr1 Varchar(128), 
    @strHomeAddr2 Varchar(128), 
    @strHomeTel Varchar(128), 
    @strMobile Varchar(128), 
    @intVisit int, 

    @strSignIP Varchar(128), 
    @dateSignDate Varchar(128), 
    @strRegID Varchar(128), 
    @dateRegDate Varchar(128), 
    @strModID Varchar(128), 
    @dateModDate Varchar(128)
)
AS

   
UPDATE    T_MEMBER_LIST
SET       
    strGroup = @strGroup, 
    
    strLoginPwd = case @strLoginPwd 
                    when '' then strLoginPwd
                    else @strLoginPwd end, 

    strLoginName = @strLoginName, 
    strEmail  = @strEmail, 
    strBirthday  = @strBirthday, 
    strHomePost  = @strHomePost, 
    strHomeAddr1 = @strHomeAddr1, 
    strHomeAddr2 = @strHomeAddr2, 
    strHomeTel  = @strHomeTel, 
    strMobile  = @strMobile, 

    intVisit  = case @intVisit
                    when '' then intVisit
                    else @intVisit end, 

    strSignIP  = case @strSignIP 
                    when '' then strSignIP
                    else @strSignIP end

WHERE     
    strLoginID = @strLoginID
    



이렇게 소스를 추가함.

이렇게 변경하고...

비밀번호 값을 변경하고, "Update" 버튼을 클릭해 데이터를 변경.


DB 에 잘 반영되어 있음.

그러고 보니 비밀번호가 그냥 노출되는데... 이걸 막을려면...
 해당 텍스트 박스의 속성에 "TextMode" 를 "Password" 로 지정.

그러면 패스워드가 노출되지 않음.


C# WebForm : 사용자 관리 (4) : 사용자 목록 페이지 - 페이징(Paging) 기능 만들기

이제 좀 귀찮지만 페이징 기능을 만들어 본다.

이건 사용자 컨트롤로 만들건데, 궂이 사용자 컨트롤로 안만들어도 되지만, 페이징이란게 워낙에 광범위하게 많이 쓰이다 보니, 사용자 컨트롤로 한번 만들어 놓으면 여러모로 유용하게 쓰인다.


일단 "UserControls" 폴더를 하나 만든 후, "ucListPager" 라는 유저 컨트롤을 추가.
폴더는 만들던 말던, 알아서 ... 관리만 알아서 잘할 수 있다면 된다.

만든 유저 콘트롤의 Html 을 보면 "Inherits" 라는 항목이 있는데, 이게 기본적으로 현재 파일을 생성한 폴더의 경로로 되어 있다.
보통은 궂이 바꿀 필요가 없지만, 앞으로 다른 소스에도 갖다 쓸려고 한다면, 좀 정리해 주는게 좋다. (물론 안해도 상관은 없다.)


저 명칭은 비하인드 코드의 class 명이므로 aspx 파일과 cs 파일의 명칭을 같이 맞춰 주면 된다. (기본 명칭에 폴더명이 들어가 있는 것은 저게 다른 소스와 명칭이 중복되면 안되기 때문.)


나의 경우 간단히 "ucListPager" 라고 명명하고(당연히 cs 파일의 class 명도 같이 바꿔줌) 간단하게 html 을 구성한다.

이걸 "MemberList.aspx" 에서 쓸려면....


쓸려는 aspx 파일의 상단에 사용자 컨트롤을 등록해 주고...


적당한 위치에 등록한 태그명을 이용해 넣어 주면 된다.
이렇게 하면...


요렇게 나타나는데, 아직은 데이터가 없어서 버튼만 나타나 있다.

이제 할 것은 기능 추가... 를 해야 하니, "ucListPager.cs" 파일을 아래와 같이 편집.

[ucListPager.cs]

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

using System.Text;

public partial class ucListPager : System.Web.UI.UserControl
{
    #region Control Property 설정

    // 전체 항목 수
    public int TotalRecordCount
    {
        get
        {
            int returnValue = 0;
            try
            {
                if (this.ViewState["TotalRecordCount"] != null)
                { returnValue = Convert.ToInt32(this.ViewState["TotalRecordCount"]); }
            }
            catch
            { returnValue = 0; }

            return returnValue;
        }
        set
        { this.ViewState["TotalRecordCount"] = value.ToString(); }
    }

    // 페이지 사이즈
    public int PageSize
    {
        get
        {
            int returnValue = 10;
            try
            {
                if (this.ViewState["PageSize"] != null)
                { returnValue = Convert.ToInt32(this.ViewState["PageSize"]); }
            }
            catch
            { returnValue = 10; }

            return returnValue;
        }
        set
        { this.ViewState["PageSize"] = value.ToString(); }
    }

    // 전체 페이지 수
    public int TotalPageCount
    {
        get
        {
            int totalPageCount = this.TotalRecordCount / this.PageSize + ((this.TotalRecordCount % this.PageSize) == 0 ? 0 : 1);
            return totalPageCount;
        }
    }

    // 현재 페이지
    public int CurrentPageIndex
    {
        get
        {
            int currentPageIndex = 1;
            try
            {
                if (this.ViewState["CurrentPageIndex"] != null)
                { currentPageIndex = Convert.ToInt32(this.ViewState["CurrentPageIndex"]); }
            }
            catch
            { currentPageIndex = 1; }

            if (currentPageIndex < 1)
            {
                currentPageIndex = 1;
                this.ViewState["CurrentPageIndex"] = currentPageIndex;
            }

            return currentPageIndex;
        }
        set
        { this.ViewState["CurrentPageIndex"] = value.ToString(); }
    }

    // 현재 페이지의 시작 아이템 넘버
    public int CurrentStartIndex
    {
        get
        {
            return (this.CurrentPageIndex - 1) * this.PageSize;
        }
    }

    // 페이지 인덱스의 최대 수
    public int MaxPageDisplaySize
    {
        get
        {
            int returnValue = 10;
            try
            {
                if (this.ViewState["MaxPageDisplaySize"] != null)
                { returnValue = Convert.ToInt32(this.ViewState["MaxPageDisplaySize"]); }
            }
            catch
            { returnValue = 10; }

            return returnValue;
        }
        set
        {
            this.ViewState["MaxPageDisplaySize"] = value.ToString();
        }
    }

    #endregion


    #region Control Override 설정

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        this.GeneratePageList();
    }

    #endregion



    protected void Page_Load(object sender, EventArgs e)
    {

    }


    #region 사용자 정의 메서드

    private void GeneratePageList()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("   ");

        try
        {
            int totalPageCount = this.TotalPageCount;
            int currentPageIndex = this.CurrentPageIndex;
            int maxPageList = this.MaxPageDisplaySize;

            if (0 == totalPageCount)
            {
                this.divPanel.Visible = false;
                return;
            }
            else
            {
                this.divPanel.Visible = true;
            }

            int startPageIndex = 0;
            if (0 == currentPageIndex % maxPageList)
            {
                startPageIndex = (currentPageIndex / maxPageList) * (maxPageList) - maxPageList + 1;
            }
            else
            {
                startPageIndex = (currentPageIndex / maxPageList) * maxPageList + 1;
            }

            int endPageIndex = 0;
            if (totalPageCount + 1 > (startPageIndex + maxPageList))
            {
                endPageIndex = startPageIndex + maxPageList;
            }
            else
            {
                endPageIndex = startPageIndex + (totalPageCount % maxPageList == 0 ? maxPageList : totalPageCount % maxPageList);
            }

            for (int i = startPageIndex; i < endPageIndex; i++)
            {
                if (i == CurrentPageIndex)
                {
                    sb.Append("" + i.ToString() + "");
                }
                else
                {
                    sb.Append("" + i.ToString() + "");
                }

                sb.Append("   ");
            }

            lblPageList.Text = sb.ToString();
        }
        catch
        {
        }
    }

    #endregion

}


--

요렇게 해놓으면 ... MemberList.aspx 파일에서 쓸수 있는데...


여기 "Property" 로 사용할 값들은....


사용자 컨트롤 태그에 직접 써넣어 지정 할 수 있다.

이런 식으로 소스 상에서 지정도 가능함.
암튼 이렇게 하고...


요렇게 테스트용 데이터를 DB에 넣어 놓고, 페이지를 로드 해보면....

요렇게 페이지 리스트가 나타난다.

지금은 1 ~ 10 페이지가 나타나는데, 이것은 사용자 컨트롤의 속성을 레코드 수 100개, 페이지 크기 10 으로 직접 지정 해놨기 때문에 10페이지로 나타난 것이다.

요걸 실제 데이터에 맞게 나오게 할려면...
MemberList.apsx 에서 데이터를 조회 하는 부분의 마지막에 전체 아이템 수를 지정하면 된다.


요렇게 리스트를 만드는 과정중에 전체 아이템 수를 지정하면 된다.
주의 할점은 바인딩한 값이, Tables[0] 가 아니라 Tables[1] 이다.

요건 이전에 만들었던 DB 쿼리를 보면...

이렇게 실제로는 저장 프로시져안에 2개의 쿼리가 실행되고 있다.
이게, 처음 쿼리는 이번 페이지의 아이템 목록이며, 아래 쿼리는 지정된 검색 조건하의 전체 아이템 수.

그렇기 때문에, 받아온 데이터셋을 디버그 모드에서 보면...


이렇게 조회된 테이블이 2개가 있음을 알 수 있다.
이중에서 2번째 테이블인 전체 아이템 수 값을 페이져에 지정하는 것이다.

이렇게 하고, 페이지를 다시 로드 해보면...


이렇게 실제 값으로 페이지 목록을 만들어 준다.

여기까지는 됐고, 이제 실제 클릭시 이동 기능을 만들어 준다.
사용자 컨트롤에서 클릭한 페이지를 사용자 컨트롤을 사용하고 있는 페이지로 전달 하기 위해서는 이벤트를 이용한다.


이전에 페이지 목록을 만드는 로직에 보면 각 페이지 번호에 "goSelectPage()" 라는 자바 스크립트를 링크 시키고 있는게 보일 것이다.

이제 이 자바스크립트를 생성해 준다.


스크립트는 간단하게 숨겨진 텍스트필드에 클릭한 값을 지정하고, 숨겨놓은 페이지 이동 버튼을 클릭하게 하는 자바스크립트.

그러면, 버튼 클릭시 이벤트 프로세스를 작성해 주자.

버튼을 클릭하면, "PageIndexChange" 이벤트를 발생하게 한다.
이렇게  "PageIndexChange" 이벤트를 만들어 놓았으니...


이제 "MemberList.aspx" 의 Html 에서 페이징 사용자 컨트롤에  "onPageIndexChange" 이벤트를 등록 할 수 있다.

사용자 컨트롤 태그에 "onPageIndexChange" 이벤트 발생시 실행할 프로세스로 "pagerPagingIndexChang" 를 지정해 놓고...

이렇게 지정된 페이지 번호로 목록을 다시 불러 오게 한다.
그러면...

이렇게 페이지 번호를 클릭할 때 마다, 목록을 새로 불러 오게 된다.
다음으로 다음 페이지, 이전 페이지 ... 등등을 구현할려면...


각 버튼에 onClick 이벤트를 등록해 주고...


beHind Code 에 처리 로직을 등록.
간단히, 어디를 조회할지 페이지번호를 계산해 놓고, 페이지 재로드 이벤트를 발생시키면 된다.

이렇게 하면 기능은 모두 끝....

마지막으로...


페이져용 스타일시트를 만들어서 ....


사용자 컨트롤을 사용하고 있는 페이지에 넣어주면...
(물론 사용자 컨트롤 자체에 넣어 줘도 되지만...)


이렇게 사용자 리스트 완성.

[최종 ucListPager.ascx]

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucListPager.ascx.cs" Inherits="ucListPager" %>

<div id="divPanel" class="pageNavigation" runat="server">
    <div class="ucPager_div">
        <table class="ucPager_table">
        <tr>
            <td>
                <asp:Button id="btnGoFirstPage" CssClass="btnGoFirstPage" runat="server" Text="<<" OnClick="btnGoFirstPage_Click" />
            </td>
            <td>
                <asp:Button id="btnGoPreviousPage" CssClass="btnGoPreviousPage" runat="server" Text="<" OnClick="btnGoPreviousPage_Click" />
            </td>
            <td>
               <asp:Label id="lblPageList" CssClass="lblPageList" runat="server" Text=""  />
            </td>
            <td>
                <asp:Button id="btnGoNextPage" CssClass="btnGoNextPage" runat="server" Text=">" OnClick="btnGoNextPage_Click" />
            </td>
            <td>
                <asp:Button id="btnGoLastPage" CssClass="btnGoLastPage" runat="server" Text=">>" OnClick="btnGoLastPage_Click" />
            </td>
        </tr>
        </table>
    </div>

    <asp:Button ID="btnGoSelectedPage" runat="server"  style="display: none;" OnClick="btnGoSelectedPage_Click" />
    <asp:TextBox ID="hdnCurrentPageIndex" runat="server" style="display: none;" />
</div>


<script type="text/javascript">
function goSelectedPage(pageIndex)
{       
    var btnGoSelectedPage = $get("<%=btnGoSelectedPage.ClientID %>");
    var hdnCurrentPageIndex = $get("<%=hdnCurrentPageIndex.ClientID %>");

    hdnCurrentPageIndex.value = pageIndex;
    btnGoSelectedPage.click();
}
</script>



[최종 ucListPager.cs]

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

using System.Text;

public partial class ucListPager : System.Web.UI.UserControl
{
    #region Control Property 설정

    // 전체 항목 수
    public int TotalRecordCount
    {
        get
        {
            int returnValue = 0;
            try
            {
                if (this.ViewState["TotalRecordCount"] != null)
                { returnValue = Convert.ToInt32(this.ViewState["TotalRecordCount"]); }
            }
            catch
            { returnValue = 0; }

            return returnValue;
        }
        set
        { this.ViewState["TotalRecordCount"] = value.ToString(); }
    }

    // 페이지 사이즈
    public int PageSize
    {
        get
        {
            int returnValue = 10;
            try
            {
                if (this.ViewState["PageSize"] != null)
                { returnValue = Convert.ToInt32(this.ViewState["PageSize"]); }
            }
            catch
            { returnValue = 10; }

            return returnValue;
        }
        set
        { this.ViewState["PageSize"] = value.ToString(); }
    }

    // 전체 페이지 수
    public int TotalPageCount
    {
        get
        {
            int totalPageCount = this.TotalRecordCount / this.PageSize + ((this.TotalRecordCount % this.PageSize) == 0 ? 0 : 1);
            return totalPageCount;
        }
    }

    // 현재 페이지
    public int CurrentPageIndex
    {
        get
        {
            int currentPageIndex = 1;
            try
            {
                if (this.ViewState["CurrentPageIndex"] != null)
                { currentPageIndex = Convert.ToInt32(this.ViewState["CurrentPageIndex"]); }
            }
            catch
            { currentPageIndex = 1; }

            if (currentPageIndex < 1)
            {
                currentPageIndex = 1;
                this.ViewState["CurrentPageIndex"] = currentPageIndex.ToString();
            }
            return currentPageIndex;
        }
        set
        {
            this.ViewState["CurrentPageIndex"] = value.ToString();
        }
    }

    // 현재 페이지의 시작 아이템 넘버
    public int CurrentStartIndex
    {
        get
        {
            return (this.CurrentPageIndex - 1) * this.PageSize;
        }
    }

    // 페이지 인덱스의 최대 수
    public int MaxPageDisplaySize
    {
        get
        {
            int returnValue = 10;
            try
            {
                if (this.ViewState["MaxPageDisplaySize"] != null)
                { returnValue = Convert.ToInt32(this.ViewState["MaxPageDisplaySize"]); }
            }
            catch
            { returnValue = 10; }

            return returnValue;
        }
        set
        {
            this.ViewState["MaxPageDisplaySize"] = value.ToString();
        }
    }

    #endregion


    #region Control Override 설정

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        this.GeneratePageList();
    }

    #endregion



    protected void Page_Load(object sender, EventArgs e)
    {

    }


    #region 사용자 정의 메서드

    private void GeneratePageList()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("&nbsp; &nbsp;");

        try
        {
            int totalPageCount = this.TotalPageCount;
            int currentPageIndex = this.CurrentPageIndex;
            int maxPageList = this.MaxPageDisplaySize;

            if (0 == totalPageCount)
            {
                this.divPanel.Visible = false;
                return;
            }
            else
            {
                this.divPanel.Visible = true;
            }

            int startPageIndex = 0;
            if (0 == currentPageIndex % maxPageList)
            {
                startPageIndex = (currentPageIndex / maxPageList) * (maxPageList) - maxPageList + 1;
            }
            else
            {
                startPageIndex = (currentPageIndex / maxPageList) * maxPageList + 1;
            }

            int endPageIndex = 0;
            if (totalPageCount + 1 > (startPageIndex + maxPageList))
            {
                endPageIndex = startPageIndex + maxPageList;
            }
            else
            {
                endPageIndex = startPageIndex + (totalPageCount % maxPageList == 0 ? maxPageList : totalPageCount % maxPageList);
            }

            for (int i = startPageIndex; i < endPageIndex; i++)
            {
                if (i == CurrentPageIndex)
                {
                    sb.Append("<b>" + i.ToString() + "</b>");
                }
                else
                {
                    sb.Append("<a href=\"javascript:goSelectedPage('" + i.ToString() + "')\">" + i.ToString() + "</a>");
                }

                sb.Append("&nbsp; &nbsp;");
            }

            lblPageList.Text = sb.ToString();
        }
        catch
        {
        }
    }

    public delegate void PagerClickEventHandler (object sender);
    public event PagerClickEventHandler PageIndexChange;
    private void CallPageIndexChangeEvent()
    {
        this.PageIndexChange(this);
    }

    protected void btnGoFirstPage_Click(object sender, EventArgs e)
    {
        this.CurrentPageIndex = 1;
        CallPageIndexChangeEvent();
    }

    protected void btnGoPreviousPage_Click(object sender, EventArgs e)
    {
        if (2 <= this.CurrentPageIndex)
        {
            this.CurrentPageIndex = this.CurrentPageIndex - 1;
            CallPageIndexChangeEvent();
        }
    }

    protected void btnGoNextPage_Click(object sender, EventArgs e)
    {
        if (this.TotalPageCount > this.CurrentPageIndex)
        {
            this.CurrentPageIndex = this.CurrentPageIndex + 1;
            CallPageIndexChangeEvent();
        }
    }

    protected void btnGoLastPage_Click(object sender, EventArgs e)
    {
        this.CurrentPageIndex = this.TotalPageCount;
        CallPageIndexChangeEvent();
    }

    protected void btnGoSelectedPage_Click(object sender, EventArgs e)
    {
        try
        {
            int newPageIndex = Convert.ToInt32(hdnCurrentPageIndex.Text);
            this.CurrentPageIndex = newPageIndex;
            this.CallPageIndexChangeEvent();
        }
        catch
        { }
    }

    #endregion

}




흐... 힘들다...

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" 를 클릭하면...

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

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