IT정보

GridView 하나만으로 프로젝트를 하면서...

YUNOLAND 2009. 4. 28. 15:51

프로젝트가 끝나가는 무렵, GridView에 대해 정리해뒀던 하나하나를 꺼내볼까 한다..

개인적으로 HOONS, TAEYO에서 고수분들에게 물어가며 만들어냈다.. HOONS에서는 레벨이 2주만에 노란장갑 손가락 세개가 되어버렸다...

본론으로 가서,, 코딩 정리를 해보자..

수정화면으로 넘어가는 버튼을 클릭하면 그 행의 데이터는 기본, TextBox로 변하게 된다..
이 아이를 드롭다운 형식으로 바꿔서 편집화면에 보여주는 코딩이다..

ASPX
<asp:TemplateField HeaderText="進行状況" SortExpression="pj_status_no">
    <ItemTemplate>
        <%# Eval("pj_status_no")%>
    </ItemTemplate>
    <EditItemTemplate>
        <asp:DropDownList ID="pj_status_no_edit" runat="server">                            
        </asp:DropDownList>
    </EditItemTemplate>

</asp:TemplateField>

TemplateField안에 EditItem Template를 만들어 강제로 드롭다운리스트형식으로 바꿔준다..
cs코드에서 사용하니 ID는 반드시 지정할 것..

cs코드
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    DBind();

    foreach (PMSystemDataSet.ProjectManagerRow pmRow in 
    pmSystemDataSet.ProjectManager)
    {
        if (pmRow.emp_no == this.GridView1.Rows[e.NewEditIndex].Cells[0].Text)
        {
            //ドロップダウンで変換させる
            DropDownList pjstatus = 
              (DropDownList)GridView1.Rows[e.NewEditIndex].FindControl("pj_status_no_edit");
            
            //ドロップダウンのアイテムをクリアする
            pjstatus.Items.Clear();
            
            //プロジェクト状況テーブルと連結
            tableAdapterManager.ProjectStatusTableAdapter = new ProjectStatusTableAdapter();
            tableAdapterManager.ProjectStatusTableAdapter.Fill
            (pmSystemDataSet.ProjectStatus);

            foreach (PMSystemDataSet.ProjectStatusRow row in
            pmSystemDataSet.ProjectStatus)
            {
                //状況番号のValue値を状況名で表示するアイテムの追加
                pjstatus.Items.Add(
                    new ListItem(row.pj_status_name, row.pj_status_no.ToString()));
             }
             for (int i = 0; i < pjstatus.Items.Count; i++)
             {
                  //選択されている状況番号を格納する
                  if (pjstatus.Items[i].Value == pmRow.pj_status_no.ToString())
                  {
                       pjstatus.Items[i].Selected = true;
                       break;
                   }
              }
              break;
        }
    }
}

드롭다운 컴퍼넌트만 뽑아서 정리해봤다..
ASPX파일에서 작성한 DropdownList의 아이디를 FindControl을 이용해서 찾고 Dropdownlist를 만든다. 그리고 list를 담는데 add메서드에 ListItem을 이용 밸류(뒤의 값)으로 이름(앞의 값)을 추가한다.

다음은 수정화면에서 값을 바꾼 뒤 확인 버튼을 눌렀을 때의 이벤트이다....

Gridview의 속성에 onrowupdating이벤트를 추가한다.
ASPX에서는 이걸로 끝이다.

의미는 현재(수정 후) 텍스트박스나 드롭다운에 들어있는 값을 DB로 업데이트하는 것이다.

cs코드
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    //ProjectManagerテーブルとの連結
    tableAdapterManager.ProjectManagerTableAdapter = new ProjectManagerTableAdapter();
    tableAdapterManager.ProjectManagerTableAdapter.GetProjectInfo
    (pmSystemDataSet.ProjectManager);

    //選択された行を探す
    GridViewRow thisrow = GridView1.Rows[e.RowIndex];

    //アップデートするのにキーになるデータを格納する
    string rowpk = GridView1.DataKeys[e.RowIndex].Value.ToString();

    //修正した内容を格納する
    TextBox pj_kind_edit = (TextBox)thisrow.FindControl("pj_kind_edit");
    DropDownList pj_status_no_edit = (DropDownList)thisrow.FindControl("pj_status_no_edit");
    TextBox last_visit_date_edit = (TextBox)thisrow.FindControl("last_visit_date_edit");

     //ProjectManagerにデータが入っているのを判断する
     if (pmSystemDataSet.ProjectManager.Rows.Count > 0)
     {
         foreach (PMSystemDataSet.ProjectManagerRow row in
         pmSystemDataSet.ProjectManager)
         {
              //同じ主キーになるのを判断する
              if (row.emp_no == rowpk)
              {
                  //修正したものを該当する行に格納する
                  row["pj_kind"] = pj_kind_edit.Text;
                  row["pj_status_no"] = pj_status_no_edit.SelectedItem.Value;
   
                   //データが入ってない場合Nullを設定する
                   if (last_visit_date_edit.Text != "")
                   {
                       row["last_visit_date"] = last_visit_date_edit.Text;
                   }
                   else
                   {
                       row["last_visit_date"] = DBNull.Value;
                   }
                   break;
               }
           }
  
           //トランザクション処理
           using (TransactionScope scope = new TransactionScope())
           {
               tableAdapterManager.UpdateAll(pmSystemDataSet);
               scope.Complete();
            }
        }

        //照会画面に遷移
        this.GridView1.EditIndex = -1;
        DBind();
}

현재 의 값을 불러와 해당 행의 데이터에 값을 업데이트 하는 트랜젝션 처리까지이다..
SQL쿼리를 생각해보면 되지만 pk키가 되는 아이를 구한 다음 그 아이의 행에 헤더의 이름에 맞춰 데이터를 넣는 식으로 생각하면 이해하기 편하다..

아직 정리 할 게 너무 많지만 페이지 압박의 예상으로 나중에...