블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
01.C#기초 (4)
02.C#고급 (13)
03.ASP.NET (28)
04.HTML&Script (17)
05.Silverlight (38)
06.C 언어 기초 (2)
07.iOS (14)
08.Java (5)
09.SQL (8)
10.컴퓨터보안 (10)
11.패턴이야기 (3)
12.유니티3D (1)
13.Ubuntu (7)
14.Node.js (6)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday

'프로그래밍/03.ASP.NET'에 해당되는 글 28건

  1. 2007.12.26 [ASP.NET2.0 알고가기] 페이지 지시자 종류
  2. 2007.12.05 AJAX 방명록 만들기[9]
  3. 2007.12.04 AJAX 방명록 만들기[8]



ASP.NET2.0 Page 지시자의 종류

 

 

 

Page 지시자

설명

Async

 페이지가 비동기 처리기인지 결정하는 것으로 기본값은 false이며, 페이지가 비동기 처리를 하게 하려면 이 특성을 true로 설정한 후 AddOnPreRenderCompleteAsync 메소드를 이용해 비동기 처리 메소드를 등록하거나 페이지가 IHttpAsyncHandlEr 인터페이스를 구현해야 한다.

CodeFile

 코드 비하인드 파일의 경로를 지정한다.

MaintainScrollPositionOnPostBack

 페이지가 라운드트립하는 동안에 브라우저의 스크롤 위치를 유지할지를 결정하는 것.(기본값 false) 이 특성은 이전 버전에서 사용하던 SmartNavigation 특성을 대신한다.

MasterPageFile

 마스터 페이지 파일의 경로를 지정한다.

Title

페이지의 제목을 지정한다.

Theme

테마의 이름을 설정한다.

StylesheetTheme

  테마의 이름을 설정하지만 Theme보다 낮은 우선 순위를 가진다.

EnableTheming

 페이지가 테마를 사용할지 여부를 지정하는 것으로 기본값은 true이다. ‘Web.config’파일에서 응용프로그램 전역에 테마를 사용하도록 설정되었을 경우 이 특성을 false로 지정하면 특정 페이지만 테마가 적용되지 않도록 할 수 있다.

CompilationMode

클라이언트의 요청이 올 때 페이지 파일을 컴파일하는 방법을 결정한다.

LinePragmas

라인 프래그머가 컴파일된 어셈블리로 추가될지 여부이다.

 

 

 

 

Posted by happydong
, |



 AJAX 방명록 만들기[9]

이번에는 글을 삭제할 수 있는 삭제버튼을 구현해 보도록 하겠습니다. 제가 만든 Ajax 방명록에는 따로 수정버튼이 있지는 않기때문에 글을 쓰다가 잘 못쓰면 그냥 삭제하고 다시 써야 합니다. 조금 불편하겠네요^^;; 하지만 지금까지 만들었던 내용을 잘 생각해 보시면 수정부분 구현은그리 어렵지 않을 것 이라 생각이 되는 군요~ 그 부분은 숙제로 남기도록 하고요~ㅋ(너무 검방진말투...죄송 ^^;;) 삭제 버튼에 관해서 코드를 하나하나 보도록 하겠습니다. 먼저 아래 그림을 보시면 삭제 버튼이 어디에 붙은 녀석인지 알수 있을 것입니다.

1. 그림

사용자 삽입 이미지

그리고 삭제 버튼을 클릭하게 되면 비밀번호를 입력 할 수 있도록 메세지창 처럼 나타나게 됩니다. 아래 그림과 같이 말이죠.

2. 그림

사용자 삽입 이미지


메세지창이 나타나면 글을 입력했을 때 비밀번호를 입력 하고 삭제를 클릭하면 삭제가 되는 겁니다. 자 이제 본격적으로 코드를 보도록 하겠습니다.  먼저~! aspx 페이지의 구성된 코드를 보도록 하겠습니다.  

 .aspx페이지

//삭제 취소

function cancel()

{

document.getElementById("<%= delete_table.ClientID%>").style.display = "none";

document.getElementById("<%= User_PassWord.ClientID %>").value = "";

}

//삭제 버튼을 클릭함.

function content_Delete(seq)

{

document.getElementById("<%= b_seq.ClientID %>").value = seq;

document.getElementById("<%= delete_table.ClientID%>").style.display = "block";

}

 

<asp:HiddenField ID="b_seq" runat="server" />

 

<%-- ################### 방명록 리스트 시작 ###################### --%>

<asp:DataList ID="DataList1" runat="server" OnItemDataBound="DataList_databound">

<HeaderTemplate>

 

중간 생략

 

</HeaderTemplate>

<ItemTemplate>

 

중간 생략

 

<img alt="" style="cursor: pointer;" src="images/btn/imgDel.gif" id="Imgbtn_Delete"

onclick="content_Delete('<%# Eval("b_seq")%>')" />

</ItemTemplate>

</asp:DataList>

<%-- ############## 방명록 리스트 끝 ############################## --%>

 

<%-- ############### 삭제 관련 창 시작 작업중.. ################### --%>

<asp:Panel ID="pnl_delete" runat="server" Style="position: absolute; top: 300px; left: 500px;">

<table id="delete_table" style="display: none; background-color: #959695" cellspacing="0"

cellpadding="0" width="400" border="0" runat="server">

<tbody>

<tr style="height: 30px" valign="middle">

<td style="font-size: 11pt; width: 100%; color: white" id="tdHeader" align="center"

colspan="3" runat="server">

경고 &gt; 삭제 관련

</td>

</tr>

<tr style="height: 50px" valign="middle">

<td style="width: 1%; height: 50px">

</td>

<td style="width: 98%; height: 50px; background-color: white" align="center">

삭제하시려면 비밀번호를 입력해주세요^^< br />

비밀 번호 :&nbsp;<asp:TextBox ID="User_PassWord" runat="server" TextMode="Password"></asp:TextBox>

</td>

<td style="width: 1%; height: 50px">

</td>

</tr>

<tr style="height: 2px" valign="middle">

<td style="width: 100%" align="center" colspan="3">

</td>

</tr>

<tr style="height: 2px" valign="middle">

<td style="width: 100%" align="center" colspan="3"></td>

</tr>

<tr style="height: 30px" valign="middle">

<td style="width: 1%">

</td>

<td style="width: 98%; background-color: white" align="center">

<asp:Button ID="btn_OK" runat="server" Text="삭제" OnClick="content_Deldete" />

<input type="button" value="취소" onclick="cancel()" />

</td>

<td style="width: 1%">

</td>

</tr>

<tr style="height: 2px" valign="middle">

<td style="width: 100%" align="center" colspan="3">

</td>

</tr>

</tbody>

</table>

</asp:Panel>

<cc1:dragpanelextender id="DragPanelExtender2" runat="server" draghandleid="pnl_delete"

targetcontrolid="pnl_delete">

</cc1:dragpanelextender>

<%-- ########################## 삭제 관련 창 끝 ########### --%>


위 코드에서 중간 생략 부분은 AJAX 방명록 만들기[8] 부분에 자세하게 코드가 나와 있습니다. 참고 하실분은 참고 하세요~^^ 코드에 보시면 DataList 컨트롤에 ItemTemplate 안에 img태그가 있습니다. img 태그는 onclick Event를 가지고 있는 것을 볼 수 있습니다. 그럼 이벤트가 호출하는 JavaScript 함수에 대해 알아 보도록 하지요~! 음..인자 값으로 바인딩된 해당글의 번호를 받고 있습니다. 그리고 b_seq 라는 id를 가진 HiddenField 에 value 값으로 설정해 주고 있습니다. 그 다음에 메세지창의 tablestyle 속성인 display block로 설정해주고 있습니다. (메세지창의 table의 display 기본설정은 none 입니다) 이렇게 간단한 style 속성을 이용해서 기본적으로 페이지에는  존재하고 있지만 눈에 보이지 않고, 특정 이벤트가 일어날때 보이는 아주 간단한 구조 입니다.^^;;;; 이제 메세지창이 나타났겠군요~! 이 메세지창에서 삭제를 취소 하려고 버튼을 누루면 위에 JavaScript함수인 cancel함수가 호출이 됩니다. cancel 함수는 위 내용을 잘 읽으셨다면 이해하시리라 생각이 됩니다.^^;; 삭제를 진행하시려면 Textbox에 비밀번호를 입력하고 확인을 클릭하면 됩니다. 이때 일어나는 일들에 대해 알아 보도록 하겠습니다.  위 코드에서 보시면... btn_OK 라는 id를 가진 Button이 하나 있는 것을 볼 수 있을 것입니다. 한번 버튼 이벤트(content_Deldete)대해 알아 보도록 하겠습니다. 아래 코드는 비하인트 코드 부분입니다.

 Guest_Board.aspx.cs페이지

protected void content_Deldete(object sender, EventArgs e)

{

delete_table.Style.Add("display", "none");

bclass.u_pass = this.User_PassWord.Text;

bclass.b_Seq = int.Parse(this.b_seq.Value);

bclass.Procedure(4);

if (bclass.pass_count != 1)

ScriptManager.RegisterStartupScript(this, this.GetType(), "testeste", "alert('비밀번호가 틀렸습니다!!')", true);

else

ScriptManager.RegisterStartupScript(this, this.GetType(), "Text", "alert('정상적으로 삭제되었습니다!!')", true);

ListBind();

}

처음으로 delete_table(메세지창의 table)의 Style 속성을 변경해 주고 있습니다. 비밀보호를 입력하고 나서는 메세지창이 계속 보여질 필요가 없으므로 않보이도록 했습니다. 그리고 bclass에 property를 이용해서 사용자가 입력한 비밀 번호화 해당글의 번호를 넘기고 있습니다. 삭제 하기 위해서는 필요한값들이지요~^^;; 아래는 property 코드 입니다.

 boardClass.cs페이지

private int seq;

private string U_Pass;


public string u_pass

{

        get { return U_Pass; }

        set { U_Pass = value; }

}

public int b_Seq

{

        set { seq = value; }

}


이렇게 값을 넣겨주고 나서는 bclass(boardclass)의 Procedure메소드를 호출하고 있습니다.이부분은AJAX 방명록 만들기 거의 모든 부분에서 다루었던 코드이므로 따로 설명 하지 않도록 하겠습니다~^^;; 인자 값으로 4를 넘기고 있습니다. 해당 코드는 아래와 같습니다~^^

 boardClass.cs페이지 

public void Procedure(int num)

{

 

중간 생략

 

else if (num == 4)

{

query = "gb_password";

Db_Parameters(false);

Count = dcon.GetCheck(query);

if (Count != 0)

{

dcon.Comm.Parameters.RemoveAt(0);

query = "gb_Delete";

dcon.ExecuteNon(query);

}

}

}


gb_password
라는 프로시져를 query의 값으로 설정하고 있네요~
프로시져 내용은 아래와 같습니다.

gb_password Procedure

 create proc gb_password

(

@b_seq int,

@b_pass varchar(20)

)

as

select count(*) from guest_board where b_seq = @b_seq and b_pass = @b_pass

 

GO


그리고 나서 Db_Parameters 메소드를 호출하고 있습니다. 인자값으로는 bool 값을 넣겨 주고 있네요. Db_Parameters메소드는 AJAX 방명록 만들기[7] 부분에서도 다루었던 내용 입니다. 간단하게 설명하자면 받은 인자 값으로 해당 조건을 확인하고, 해당 프로지셔의 Parameter를 만듭니다.(Db_Parameters메소드의 자세한 코드는 AJAX 방명록 만들기[7]를 참고 해주세요)
그 다음 코드는 dbclassGetCheck 메소드를 호출하고 있습니다. 인자값으로 프로지져를 넘기고 있네요. 코드 쓰임새를 보아하니 return 값이 있는 메소드인듯 합니다. GetCheck메소드는 AJAX 방명록 만들기[8] 에서 다루었던 내용입니다. 삭제부분에서쓰여진 목적은 해당 글번호에 있는 비밀번호가 일치하는 게있는지 확인하기 위함 입니다. 일치하는 내용이 있다면 return 값이 1 이고 아니면 0 이 겠지요~^^; (GetCheck메소드의 자세한 코드는AJAX 방명록 만들기[8] 를 참고 해주세요~^^) 조건문을 확인해 보면 0이 아니라면 이니깐...1이면 삭제가 된다는 의미겠군요^^;;그럼 자시 query를 만들고 Parameter를 만들어야 하겠군요~! 프로시져는 아래와 같습니다.

gb_Delete Procedure

 create proc gb_Delete

(

        @b_seq int

)

as

delete from guest_board where b_seq = @b_seq

 

GO


Parameter는 해당 글 번호 하나만 만들면 되겠군요~^^ 하지만 위에서 비밀번호와 해당글번호에 관련된 Parameter를 만들어 두었지 않습니까~!그럼 필요없는 비밀번호 Parameter만 없애 주면 되겠군요~그래서 RemoveAt메소드를 이용했습니다. 0번째를 지우는 거지요. 아까 비밀번호파라미터를 만들고 나서 글 번호 파라미터를 만들었기 때문에 0번째를 지우면 되겠지요.이렇게 지우고나서 dbclassExecuteNon 메소드를 호출합니다. ExecuteNon메소드AJAX 방명록 만들기[7] 에서 다루었던 내용 입니다. 간단하게 설명하자면 ExecuteNonQuery메소드를 호출하도록 정의한 메소드 입니다. 이렇게 하면 데이터베이스에서 삭제가 일어 나겠군요~^^ 자 다시 이벤트 부분 코드로 돌아 와서...ㅋㅋ조건문이 하나 있군요~ 보아하니 bclass에서 property를 이용해서 Count값을 가지고와서 그 값이 1 이 맞는지 확인하는 것 같습니다. 맞습니다~! 확인하는 것입니다. 그래서RegisterStartupScript메소드를 통해서 Alert창을 뛰우는 것이지요. 그리고 나서 삭제도 되었으니깐 리스트부분을 다시 바인딩해야 하지 않겠습니까..그래서 코드 마지막에 ListBind()메소드를 호출하도록 했습니다. (ListBind 메소드는 AJAX 방명록 만들기[8]를 참고하세요~^^)
여기까지 제가 만들고자했던 AJAX 방명록이 다 만들어 졌습니다. 초보인 저 또한 이렇게 Ajax Control Toolkit를 이용해서 Ajax 방명록을 만들수 있을 알려드리려고 했는데... 도움이 되셨는지 모르겠습니다. 다소 제 설명이 너무나 미흠해서 이해가 않가실수도 있고...또는 애가 무슨소리하는거야...하는 생각이 들으 셨다면 죄송합니다. 그리고 제가 쓴 내용중에 제가 잘 못 알고 있는 부분이 있다면 서슴없이 따끔한 한마디 부탁드립니다~^^

제가 만든 소스도 올려 놓도록 하겠습니다. 혹시 소스를 보고 잘못된 부분이나 에러 같은 게있다면 말씀해 주세요~^^부족한 저에게 힘이 되어 주세요~ㅋㅋ^^
아무튼 지금까지 제가 나름 쓴 강좌를 읽어 주셔서 감솨합니다~

오늘 하루도 즐거고 행복한 하루되세요~^^홧팅~

Posted by happydong
, |



AJAX 방명록 만들기[8]

날씨도 쌀쌀해 지고 있네요.. 감기들 조심하세요~^^
AJAX 방명록 만들기[7] 부분에서 데이터를 DB에 넘기는 부분을 다루어 봤습니다^^ 이번에는 DB에 있는 데이터를 리스트 형식으로 보여주는 코드를 알아보려고 합니다~! 저는 DataList를 사용해서 만들어서 페이징을 따로 구현을 해야합니다. 그래서 먼저 페이징 구현소스를 먼저 보고, DataList 관련 소스를 보도록 하겠습니다~^^;;

제 말이 잘이해가 않되시더라도 코드를 보면서 하나하나 따라해 보세요~^^; 그리고 제가 항상 말하는 거지만 저 또한 초보개발자 입니다~!그래서 저와 같은 방식으로 만드는 것이 꼭 옮은 것은 아닐수도 있음을 기억해주세요~!ㅋ 우리 같이 더 넓은 미래를 향해 달려가자구요~ㅋㅋ 자~이제 헛소리는 그만하고 아래 코드를 보도록 하겠습니다.  

 .aspx페이지

 function DoPage(current)

{

document.getElementById("<%= hiddenPage.ClientID %>").value = current;

<%= Page.ClientScript.GetPostBackEventReference(pageBind, "") %>

}

<asp:LinkButton ID="pageBind" runat="server" OnClick="pageBind_Click">

</asp:LinkButton>

<asp:HiddenField ID="hiddenPage" runat="server" Value="1" />

위 코드를 보시면 JavaScript 함수도 있고... LinkButton도 있고....HiddenField도 있는 것을 볼 수있습니다. JavaScript 함수는 사용자가 페이지를 이동할 때 클릭 이벤트에서 사용 되어질 함수이며, 간단하게 설명하자면 사용자가 선택한 페이지의 번호로를 HiddenField 에Value 값으로 넣게되면서 임의적으로 LinkButton에 이벤트를 주는 것입니다. 자~ 그럼 이제는 비하인드 코드에서 어떻게 코드가 구성이 되는지 알아 보도록 하겠습니다.  

Guest_Board.aspx.cs페이지

private int currentPageIndex; //보여질 페이지

 

protected void Page_Load(object sender, EventArgs e)

{

currentPageIndex = int.Parse(hiddenPage.Value);

Page_Number();

}


위 코드는 페이징에 필요한 변수들을 선언해 두었구요~그리고 Page_Load 이벤트에서 일어
날 행위들을 정의한 부분입니다. Page_Load 이벤트 설명으로는 위에 선언한 변수 currentPageIndexHiddenField의 Value 값(기본값 1로지정했음)을 넣어주고 있고요!! Page_Number 라는 메소드를 호출하고 있습니다. 그럼 Page_Number 메소드의 소스를 보도록 하겠습니다.

 Guest_Board.aspx.cs페이지

protected void Page_Number()

{

bclass.Procedure(2);

totalCount = bclass.total;

 

Page_List();

 

//바인딩 부분

ListBind();

}


Page_Number
라는 메소드가 어떤 행위를 하는지 살펴보면,
처음에는 boardClass에 있는 Procedure라는 메소드를 호출하고 있습니다. 인자 값으로 2를 넘기고 있고요. boardClass 와 Procedure 메소드는 지난 강좌부분에서 다루었으므로 따로 설명하지 않도록 하겠습니다~^^그래도 혹 제가 이런말을 한다고 해서 상처 받는 사람이 있으면 안되기 때문에 Procedure 메소드에 대해 살짝 말하자면 그저 메소드 이름에서도 알 수 있듯이 Procedure를 정의한 메소드입니다. 인자값은 해당 Procedure를 사용하기위한  조건의 값이 되겠구요~^^ 자 아래 코드는 해당 Procedure에 조건 부분만 간추려온 소스 입니다. 지난 강좌 부분에 해당 소스가 있기때문에 이해안가시면 지난 강좌를 참고해 주세요~^^;;

Guest_Board.aspx.cs페이지

private int total_Count; // boardClass의 전연변수 선언

....중간 생략...

else if (num == 2)

{

query = "total_count";

total_Count = dcon.GetCheck(query);

}


역시 위에서 설명한데로 Procedure 명을 정의하고있지요~^^;;그럼 total_count 프로시져에 대
해서는 아래와 같습니다. 

total_count Procedure

create proc total_count

as

select count(*) bSeq from guest_board

 

GO


간단합니다..ㅋ 너무 간단해서 부끄럽네요~^^;;;
그 다음 코드를 보니깐 dbclassGetCheck 라는 매소드를 호출하고 있고요, 호출한 값을 전역 으로 선언해둔 total_Count 변수에 할당을 하고 있네요..대충 추측해 보시면 알겠지만 반환값이 있는 메소드인듯 하지요~인자값은 query(프로시져명)라는 값을넘기고 있네요. 그럼 GetCheck 메소드의 소스를 보도록 하겠습니다.

 dbclass.cs 페이지

public int GetCheck(string procedure)

{

Comm.Connection = Conn;

Comm.CommandText = procedure;

Comm.CommandType = CommandType.StoredProcedure;

return (int)Comm.ExecuteScalar();

}


역시 int 형의 return 값이 있네요..ㅋㅋ 위 코드는 데이터베이스에 연결하는 코드이겠죠!^^
위 코드의 일부는 지난 강좌에서도 다루었던 내용이므로 따로 설명하지 않도록 하겠습니다. 위에 있는 ExecuteScalar 함수는 쿼리를 실행하고 쿼리에서 반환된 결과 집합의 첫번째 행의 첫번째 열을 반환하는 역활을 해줍니다.(MSDN 참고). 리턴된 값은 위에서 와 같이 변수에 할당이 됩니다. 자~그럼 다시 제일 위로 올라가서... 보시면 totalCount 변수에 bclass 의 total을 호출하네요 보니깐 Property 인것 같은데요.아래 코드를 보도록 하시죠~^^ 

 boardClass.cs페이지

 public int total

{

get { return total_Count; }

}

아까 db에 연결해서 총수를 가지고 와서 그걸 boardclass에 있는 total_Count 변수에 넣었잖아요!이제는 그값을 Page 쪽으로 값을 넘기고 있네요.^^ 그 다음 코드를 보도록 하겠습니다. 변수에 총수를 할당하고 나서는 Page_List라는 메소드를 호출하고 있는 것을 볼 수 있습니다. 코드는 아래와 같습니다.

 Guest_Board.aspx.cs페이지

private int totalCount = 1; //총게시물 수

private int pageSize = 5; //한페이지 출력할 게시물 수

private int startGroup = 1;

private int group = 10;

private int pageCount = 0;//총 페이지 수


public void Page_List()

{

string page = null;

 

pageCount = (int)Math.Ceiling((double)totalCount / pageSize);

startGroup = ((currentPageIndex - 1) / group) * group + 1;

 

//처음으로

if (startGroup != 1)

{

page = String.Format("<a href='javascript:DoPage({0})'>{1}</a>",1,"처음");

}

 

//이전 버튼

if (startGroup != 1)

{

page += String.Format("<a href='javascript:DoPage({0})'>{1}</a>",startGroup - group,"이전");

}

//페이지 있는곳까지 돌아라

int loop = 1;

while (loop <= group && startGroup <= pageCount)

{

if (startGroup == currentPageIndex)

{

page += String.Format("<span>{0}</span>", startGroup);

}

else

{

page += String.Format("<a href='javascript:DoPage({0})'>{1}</a>",startGroup,startGroup);

}

 

loop++;

startGroup++;

}

 

//현재 페이지의 뒷 페이지로

if (startGroup <= pageCount)

{

page += String.Format("<a href='javascript:DoPage({0})'>{1}</a>",startGroup,"다음");

}

 

// 마지막 페이지로

if (startGroup < (pageCount + 1))

{

page += String.Format("<a href='javascript:DoPage({0})'>{1}</a>",pageCount, "마지막");

}

Label lblPage = new Label();

lblPage.Text = page;

pnlPageNumber.Controls.Add(lblPage);

}


코드가 참 길죠~^^;;;;; 
위에 보시면 pageCount, startGroup 머리를 아프게하는 녀석들이 있죠~!그러나 우리가 페이징을 구현하기위해서 많이 사용하고 있는 공식이라 어쩌면 편하게 느껴질수도 있겠네요~ㅋ 모~쉽게 이해 하시리라 생각이 됩니다~! 총 페이지 수를 알아내기 위해서 (전체 레코드 수 - 1) / 한 페이지의 크기 + 1 이라는 연산을 수행하는 부분인 것이지요. 그리고 그 밑으로 쭈욱~나왔는 조건들..ㅋ 딱 보시면 아하~하실것입니다. 아님.."왜 이렇게 지저분하게 했냐"라는 느낌이 들수도 있는 부분이겠네요~! 그러나 저는 부끄러워 하지 않겠습니다. 저같이 머리 나뿐 초보개발자가 이렇게라도 표현을 했다는것이...정말 대견스럽지 않습니까..ㅋㅋ^^;;(죄송합니다) 아~다시 돌아와서 위에 String 형식의 변수를 선언해서 해당 조건에 걸리면 <a>크로 만들고 있습니다. 그리고 마지막 부분에 보시면 Label를 동적으로 생성을해서 Text값을 지정하고 있이요.대충 감이 오셨겠군요 그리고 나서pnlPageNumber라는 Label에 추가 해주고 있습니다. pnlPageNumber는 어디붙은 녀석이나면요. 아래 코드를 참고해주세요~

.aspx페이지

 <%-- ###################### 방명록 리스트 시작 ##################### --%>

<asp:Panel runat="server" ID="pnl_dataList" Style="width: 100%;">

<asp:DataList ID="DataList1" runat="server" OnItemDataBound="DataList_databound">

<HeaderTemplate>

<table border="0" cellpadding="0" cellspacing="0" style="width: 600px;">

<tr><td colspan="5">

<div id="list_title" style="color: #CC6666; text-align: center; font-size: 18pt;

background-color: #CCCCCC;">방명록 List 입니다~^^</div></td>

</tr></table>

</HeaderTemplate>

<ItemTemplate>

<table border="0" cellspacing="0" cellpadding="0" style="width: 600px; border: 1px solid #959695;">

<tr><td class="td_img" rowspan="3"><span id="list_icon" runat="server"></span></td>

</tr>

<tr style="height: 50px;"><td class="td_txt">&nbsp;닉네임</td>

<td class="td_Box"><%# Eval("b_name") %></td>

<td class="td_txt">작성시간</td>

<td class="td_Box"><%# Eval("b_time") %></td>

</tr><tr style="height: 150px;"><td colspan="4" style="padding: 5px;">

<table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 100%;">

<tr><td colspan="3" style="border: 1px solid #959695; width: 95%;">

<span id="span_content" runat="server"></span></td></tr>

<tr><td class="td_txt" style="width: 50px; height: 20px;">아이피</td>

<td><%# Eval("b_ip") %></td><td>

<img alt="" style="cursor: pointer;" src="images/btn/imgDel.gif" id="Imgbtn_Delete"

onclick="content_Delete('<%# Eval("b_seq")%>')" />

</td></tr></table>

</td></tr>

</table>

</ItemTemplate>

</asp:DataList>

 <asp:Label ID="pnlPageNumber" runat="server"></asp:Label>


</asp:Panel>

<%-- ################# 방명록 리스트 끝 ####################### --%>


이렇게 하면 페이징이 리스트 아래부분에 나타나겠지요~!그리고 javascritp 함수를 호출하도록 했기때문에 클릭하면 javascript 함수가 호출하겠지요. 소스는 제일위에 있내요.DoPage(current)라는 인자값으로 보여질페이지의 번호를 넘기도록 합니다. 그래서HiddenField에 값을 지정(currentPageIndex 변수값이됨)하고 해당 링크 이벤트를 발생하게 합니다. 이벤트 코드는 아래와 같습니다.

Guest_Board.aspx.cs페이지

protected void pageBind_Click(object sender, EventArgs e)

{

        this.ListBind();

}


간단하게도 ListBind 메소드를 호출하고 있습니다. 아까 위에서도 마지막 부분에 ListBind를 호출하는 소스를 보셨을 텐데요 그럼 ListBind 메소드 코드를 보도록 하시지요~!

Guest_Board.aspx.cs페이지

 protected void ListBind()

{

int sum = (currentPageIndex - 1) * pageSize;

string query = String.Format("SELECT TOP {0} b_seq,b_name,b_content,b_ip,b_time,b_icon FROM guest_board WHERE b_seq NOT IN (SELECT TOP {1} b_seq FROM guest_board ORDER BY b_seq DESC)ORDER BY b_seq DESC", pageSize.ToString(), sum);

bclass.Query = query;

bclass.Procedure(3);

this.DataList1.DataSource = bclass.dataset;

this.DataList1.DataBind();

}

페이징을 위한 쿼리를 만들어서 날리는 부분이네요.(그냥 프로지져로만들면 편하겠네요) 켁~!부끄럽네요. 너무 허접해서리..ㅋ지금까지 보오셨던 데이터베이스 연결 구분과 똑같습니다. 따로 설명하지 않아도 지금까지 제가 썼던..강좌(!? 강좌라고 하는 좀 부족하죠..ㅋ)를 보시면 bclass는 이해하시리라 생각이 됩니다.^^; 코드 마지막쯤에 보시면 DataList DataSource는 정의하고 있네요. 그에 관련된 소스들을 그냥 한번 보도록 하겠습니다.

boardClass.cs 페이지

private DataSet ds = new DataSet();

public string Query

{

set { query = value; }

}

 

public void Procedure(int num)

{

      .. 중간 생략 ..

else if (num == 3)

{

ds = dcon.GetDataSet(query);

}

 

}

public DataSet dataset

{

get { return ds; }

set { ds = value; }

}

dbclass.cs페이지

public DataSet GetDataSet(string procedure)

{

public SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = new SqlCommand(procedure, Conn);

DataSet ds = new DataSet();

adapter.Fill(ds);

return ds;
}


위 코드와 Property를 이용해서 DataSet 형식을 받아서 DataSource 를 지정해주게
됩니다.그리고나서 DataBind를 시키면 다시 새로운 원하는 페이지의 글들이 나타나게 되는 거지요~^^휴~이렇게 긴 내용을 다루려고 하니깐 정말 힘드네요~! 저도 배우는 입장에서 어떻게 설명을 해야할지.. 마구 막히는 부분이 있던것 같 습니다. 이 글을 읽으시는 분들의 넓으신 아량으로 이해해 주세요~!

Posted by happydong
, |