글 번호는 게시물의 앞에 표시되는 번호로 글 번호가 없는 게시판들도 있으나 게시물을 사용자가 안내하고자 할 때 몇 번 게시물을 참고하라는 식의 이용사례가 많이 있으므로 게시물 번호를 구현해 보도록 한다. 더불어 삭제 링크를 누를 경우 정말 삭제 할 것인지를 묻는 클라이언트 코드를 붙이는 방법도 보도록 한다.
게시물 번호는 게시판 별로 따로 관리하여야 하므로(이 게시판의 목표는 여러 개의 게시판을 동시적으로 사용할 수 있도록 하는 것에 있음을 잊지 말자) 마지막 게시물의 번호를 기억하고 있을 DB테이블이 필요하게 된다. 이 테이블을 DNBBS라고 부르자. 아래는 테이블의 생성 스크립트이다. 쿼리 분석기에서 실행하면 기존 테이블을 삭제하고 새롭게 만들게 된다.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DNBBS]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[DNBBS]
GO
CREATE TABLE [dbo].[DNBBS] (
[BBSID] [int] IDENTITY (1, 1) NOT NULL ,
[LastPostNo] [int] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[DNBBS] WITH NOCHECK ADD
CONSTRAINT [PK_DNBBS] PRIMARY KEY CLUSTERED
(
[BBSID]
) ON [PRIMARY]
GO
앞으로는 게시판 관리를 위한 다양한 열 들이 추가 되겠지만 현재로선 LastPostNo만 있다. 이 열에 해당 게시판의 마지막 글 번호를 저장해 두는 것이다. 표를 하나 생성했으니 그에 해당하는 DataController를 만들어야 한다. 간단히 다음과 같이 구현하면 된다.
public
class BBSController
{
string myConnString = "Server=localhost;Database=DotNetBBS;uid=lcw;pwd=enter99;";
public BBSController()
{
}
public BBSInfo Get(Int32 BBSID)
{
SqlConnection myConnection = new SqlConnection(myConnString);
myConnection.Open();
string myQuery =
string.Format("select BBSID,LastPostNo from DNBBS where BBSID={0}", BBSID);
BBSInfo bi = new BBSInfo();
SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
SqlDataReader dr = myCommand.ExecuteReader();
while(dr.Read())
{
bi.BBSID = dr.GetInt32(0);
bi.LastPostNo = dr.GetInt32(1);
}
dr.Close();
myConnection.Close();
return bi;
}
public
void Update(BBSInfo bi)
{
SqlConnection myConnection = new SqlConnection(myConnString);
myConnection.Open();
string myQuery = string.Format(
"update DNBBS set " +
"LastPostNo='{0}' " +
"where BBSID={1}", bi.LastPostNo, bi.BBSID);
SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();
myConnection.Close();
}
}
Get과 Update 함수만 구현하였다. 이제 게시물을 추가하는 부분을 수정하도록 하자.
private
void AddNewPost_Click(object source, System.EventArgs e)
{
PostController pc = new PostController();
PostInfo pi = new PostInfo();
pi.Subject = txtSubject.Text;
pi.BodyText = txtBodyText.Text;
pi.CreatorID = 1;
pi.CreatorName = "Tester";
pi.BBSID = 1;
pi.PostIndent = 0;
BBSController bc = new BBSController();
BBSInfo bi = bc.Get(pi.BBSID);
pi.PostNo = ++bi.LastPostNo;
pi.SysPostNo = pi.PostNo * 10000;
bc.Update(bi);
pc.Add(pi);
txtSubject.Text = "";
txtBodyText.Text = "";
Response.Redirect(Request.RawUrl);
}
굵게 된 부분이 추가된 부분이다. DNBBS테이블에서 LastPostNo를 가져와서 하나를 증가 시킨 후 게시글에 넣고 DNBBS테이블에도 업데이트를 해준다. 이로서 이제 게시물은 게시물 번호를 가지고 추가되게 된다. 아래 화면을 참고 하자.
글 번호가 하나씩 증가하면서 추가되고 있다. 화면에 나오는 “정말 삭제 할까요?” 다이얼로그는 삭제 링크버튼을 누를 때 나오는 것인데 삭제 버튼은 DataGrid내에 있으므로 단순히 ascx파일에 클라이언트 스크립트를 작성하는 방법으로는 어렵다. ListPost.ascx.cs 파일에 다음 루틴을 추가한다.
private
void PostList_ItemDataBound(object sender, DataGridItemEventArgs e)
{
LinkButton lb = (LinkButton)e.Item.FindControl("DeletePost");
if(lb != null)
lb.Attributes.Add("onClick", "return confirm('
정말 삭제 할 까요?');");
}
PostList DataGrid의 ItemBound를 잡아 각 삭제 버튼에 Attribute를 추가하는 방법으로 스크립트를 추가 하고 있다. HyperLink의 경우에는 OnClink의 리턴 값이 거짓이면 링크를 클릭하지 않은 것으로 처리하므로 위의 간단한 코드 추가 만으로 삭제 확인 다이얼로그는 완결된다.
프로젝트 소스: http://www.code99.net/tabid/842/ItemID/27/Default.aspx