login register Sysop! about ME  
qrcode
    최초 작성일 :    2002년 10월 15일
  최종 수정일 :    2002년 10월 15일
  작성자 :    cassatt
  편집자 :    Taeyo (김 태영)
  읽음수 :    31,452

강좌 목록으로 돌아가기

필자의 잡담~

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 이상인 값을 리턴할 것입니다. 그에 따라, 비밀번호가 일치하지 않았다면 에러메시지를 보여주고, 아니라면 목록 페이지로 이동합니다.
일반 글쓰기 부분은 원래의 소스와 같습니다.

이제 글 수정하는 부분도 완성되었습니다. 비밀번호를 아무렇게나 입력하면서 테스트해보세요. 다음 강좌에선 목록 부분에, 이전/다음 페이지 대신 페이지 번호로 직접 이동할 수 있는 기능을 넣어 보겠습니다.


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})