Write.aspx 재 편집
글을 수정할 수 있도록 하려면 글 수정 페이지가 있어야 겠는데요, 어차피 UI 가 글쓰기 페이지와 거의 같아서 첫 강좌에서 만든
Write.aspx 를 약간 수정해서 글 수정 기능을 넣으려 합니다.
앞선 글 보기 페이지 강좌에서, 글 보기 페이지에서 수정 링크가 다음처럼 되도록 했었습니다.
Write.aspx?m=1&n=글번호
글쓰기 페이지를, m 이라는 파라메터에 1을 주고, n 에는 글번호를 주어 호출하도록 했었죠. 그럼 글 쓰기 페이지에선 m 이라는 파라메터 값이
1인지 확인해서, 1이라면 글 수정이니 글 수정하기 처리를 하고, 아니라면 그냥 일반 글쓰기로 실행되도록 하면 되겠습니다.
Write.aspx 를 열고, 비밀번호 TextBox 바로 옆에 도구상자 Web Forms 란의 Label을 하나 추가합니다. 추가하신후
속성란에서 (ID)를 lblPwdMessage 로 하시고, Text란 내용을 지웁니다.

그림에서 화살표로 표시한 부분입니다. 그 라벨은, 일반 글쓰기일때는 안나타나다가, 글 수정일때는 '* 글을 쓸때 입력했던
비밀번호 입력' 이라 표시해주려고 합니다. 그리고 글 수정시 비밀번호가 일치하지 않으면 '* 비밀번호가 일치하지 않습니다' 라고 빨간색 글씨로
표시해주려 합니다.
DB 관련 개체 추가
다음은 DB 명령객체를 추가할 차례입니다. 글 수정을 구현하려면, 처음 로드할때는 컨트롤에 원래의 글이 입력되어야 겠죠 ? 그리고 사용자가 글을
변경하고, 버튼을 눌렀을때는 실제로 테이블의 레코드를 변경해야 겠고요. 그 두 작업을 위한 명령객체를 추가합시다. 도구상자, 데이터란에서
SqlCommand 두개를 페이지에 추가합니다.
첫번째 SqlCommand는 처음 로드할때, 원래의 글의 내용을 가져오기 위한 것입니다. 다음처럼 설정합니다.
-
(Name) : dbCommandGetArticleForModify
-
Connection : dbConnection
-
CommandText :
select writer, email, title, content, mode
from cstVSBoard
where seq = @seq
-
Parameters : 하나 추가
ParameterName :@seq
SqlDbType : int
두번째 SqlCommand는, 내용을 입력한 후에 그 내용대로 테이블의 레코드를 변경하기 위한 것입니다. 다음처럼 설정합니다.
-
(Name) : dbCommandModifyArticle
-
Connection : dbConnection
-
CommandText :
update cstVSBoard set
writer = @writer,
email = @email,
title = @title,
content = @content,
mode = @mode
where seq = @seq and pwd = @pwd
-
Parameters : 7개 추가
ParameterName |
SqlDbType |
Size |
@writer |
VarChar |
10 |
@email |
VarChar |
50 |
@title |
VarChar |
100 |
@content |
Text |
(입력안함) |
@mode |
TinyInt |
(입력안함) |
@seq |
Int |
(입력안함) |
@pwd |
VarChar |
20 |
소스 편집
그리고 코드 보기로 전환해서, 클래스에 int형의 seq, writeMode 라는 필드 두개, GetParameters() 라는 메서드를 하나 추가하고, Page_Load 이벤트 부분과,
btnSubmit_Click 부분을 교체합니다. 다음 소스 파란색 부분입니다.
...(생략)...
int seq;
int writeMode;
private void GetParameters()
{
seq=0;
try
{
seq=int.Parse(Request.QueryString["n"]);
writeMode=int.Parse(Request.QueryString["m"]);
}
catch(Exception)
{
seq=0;
writeMode=0;
}
if(writeMode<0||writeMode>1||seq<1)
writeMode=0;
}
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
GetParameters();
if(writeMode==1)
{
// 글 수정
dbConnection.Open();
dbCommandGetArticleForModify.Parameters["@seq"].Value=seq;
System.Data.SqlClient.SqlDataReader dr =
dbCommandGetArticleForModify
.ExecuteReader( CommandBehavior.SingleRow );
if(dr.Read())
{
txtWriter.Text=(string)dr["writer"];
txtEmail.Text=(string)dr["email"];
txtTitle.Text=(string)dr["title"];
txtContent.Text=(string)dr["content"];
rdoMode.SelectedIndex=(byte)dr["mode"];
}
dr.Close();
lblPwdMessage.Text="* 글을 쓸때 입력했던 비밀번호 입력";
btnSubmit.Text="글수정";
}
}
}
...(생략)...
private void btnSubmit_Click(object sender, System.EventArgs e)
{
if(IsValid)
{
GetParameters();
if(writeMode==1)
{
dbCommandModifyArticle.Parameters["@writer"].Value = txtWriter.Text;
dbCommandModifyArticle.Parameters["@pwd"].Value = txtPassword.Text;
dbCommandModifyArticle.Parameters["@email"].Value = txtEmail.Text;
dbCommandModifyArticle.Parameters["@title"].Value = txtTitle.Text;
dbCommandModifyArticle.Parameters["@content"].Value = txtContent.Text;
dbCommandModifyArticle.Parameters["@mode"].Value =
rdoMode.SelectedIndex;
dbCommandModifyArticle.Parameters["@seq"].Value = seq;
dbConnection.Open();
int rowAffected=dbCommandModifyArticle.ExecuteNonQuery();
dbConnection.Close();
if(rowAffected>0)
{
Response.Redirect("List.aspx");
}
else
{
lblPwdMessage.Text="<font color=red>* 비밀번호가 일치하지 않습니다";
}
}
else
{
dbCommandAddArticle.Parameters["@writer"].Value = txtWriter.Text;
dbCommandAddArticle.Parameters["@pwd"].Value = txtPassword.Text;
dbCommandAddArticle.Parameters["@email"].Value = txtEmail.Text;
dbCommandAddArticle.Parameters["@title"].Value = txtTitle.Text;
dbCommandAddArticle.Parameters["@content"].Value = txtContent.Text;
dbCommandAddArticle.Parameters["@mode"].Value = rdoMode.SelectedIndex;
dbConnection.Open();
dbCommandAddArticle.ExecuteNonQuery();
dbConnection.Close();
Response.Redirect("list.aspx");
}
}
}
글 수정일 때는 원래 입력했던 내용을 텍스트박스에 보여줄 필요가 있습니다. Page_Load 이벤트 부분에 넣어두었는데요, 글 수정인 경우(
즉, Request.QueryString["m"]==1 일때 ), 앞서 정의한
dbCommandGetArticleForModify 개체를 이용해서 해당 글의 내용을 가져와서, 컨트롤에 입력합니다. 수정 모드이므로 앞서
추가한 라벨에도 원래의 비밀번호를 입력하라는 메시지를 나오게 하고, 글쓰기 버튼도 '글수정'으로 바꾸어 주었습니다.
버튼을 클릭했을때는( btnSubmit_Click 메서드 ), 수정모드일때는 dbCommandModifyArticle 을 이용해서 글을
수정합니다. 만약 비밀번호가 일치한다면, 앞의 Delete.aspx 강좌에 설명했던 것처럼, ExecuteNonQuery() 메서드가 0
이상인 값을 리턴할 것입니다. 그에 따라, 비밀번호가 일치하지 않았다면 에러메시지를 보여주고, 아니라면 목록 페이지로 이동합니다.
일반 글쓰기 부분은 원래의 소스와 같습니다.
이제 글 수정하는 부분도 완성되었습니다. 비밀번호를 아무렇게나 입력하면서 테스트해보세요. 다음 강좌에선 목록 부분에, 이전/다음 페이지 대신
페이지 번호로 직접 이동할 수 있는 기능을 넣어 보겠습니다.