IT정보

GridView에서 Update관련 이벤트 사용방법(DataSet이용)

YUNOLAND 2009. 4. 16. 16:32

다른 건 생략하고 중요 소스만 붙여 놓겠습니다.

<ASP페이지>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            DataKeyNames="emp_no" onrowediting="GridView1_RowEditing"
            AllowSorting="true" onsorting="GridView1_Sorting"
            onrowcancelingedit="GridView1_RowCancelingEdit"
            onrowupdating="GridView1_RowUpdating" >
            <Columns>
                <asp:BoundField DataField="emp_no" HeaderText="社員番号" ReadOnly="True"
                    SortExpression="emp_no" />
                <asp:TemplateField HeaderText="プロジェクト種別" SortExpression="pj_kind">
                    <ItemTemplate>
                        <%# Eval("pj_kind")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                       <asp:textbox id="pj_kind_edit" text='<%#Eval("pj_kind")%>' width="60"
                       runat="server"/>
                    </EditItemTemplate>
                </asp:TemplateField>  
                <asp:CommandField ButtonType="Button" ShowEditButton="true"
                    EditText="修正" UpdateText="完了" CancelText="取消"/>
            </Columns>
        </asp:GridView>

빨간 색으로 칠한 부분이 내가 수정을 하고 싶은 부분입니다.
<asp:CommandField>의 ShowEditButton을 true로 주시면 해당 CommandField에 수정 버튼이 달리게 됩니다..
그러나 클릭을 해보면 에러가 발생 할 것입니다.. 해당 이벤트가 안 달려 있기 때문에...
수정버튼 클릭, 수정 후 확인, 수정 취소의 세 가지의 이벤트가 필요 할 것입니다..
onrowediting="GridView1_RowEditing"
onrowupdating="GridView1_RowUpdating"
onrowcancelingedit="GridView1_RowCancelingEdit"
각 각의 아이들 입니다.. 위에 소스를 보면 GridView 선언부분에 선언 되어 있습니다.

이제 에러 제어는 되고 이런 이런 이벤트를 줄 것이다- 라고는 했는데 구체적으로 어떤 기능을 할 것인지 써나가야겠죠?

그럼 cs단의 코딩입니다.

세 개의 이벤트를 각각 나눠서 보죠..

<cs단 C#>
- onrowediting="GridView1_RowEditing"
        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            this.GridView1.EditIndex = e.NewEditIndex;
            DBind();
        }

이런 코딩이 나오게 됩니다.
현재 그리드뷰의 에디트인덱스에 새로운 에디트 인덱스를 발생시키죠.
DBind()는 DB연결부분을 메서드로 만들어 놓은 건데 글 맨 밑에 붙여 놓겠습니다..

- onrowupdating="GridView1_RowUpdating"
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            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");

            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;
                        break;
                    }
                }

                using (TransactionScope scope = new TransactionScope())
                {
                    tableAdapterManager.UpdateAll(pmSystemDataSet);
                    scope.Complete();
                }
            }

            this.GridView1.EditIndex = -1;

            DBind();
        }

우선 데이터를 바인딩 시킨 다음에
현재행과 -> GridViewRow thisrow = GridView1.Rows[e.RowIndex];

디비 업데이트시 where 절에 갈 프라이머리 키를 구합니다.
-> string rowpk = GridView1.DataKeys[e.RowIndex].Value.ToString();

그 다음에 아래 소스와 같이 텍스트창에 수정해 넣은 값을 구합니다.
TextBox pj_kind_edit = (TextBox)thisrow.FindControl("pj_kind_edit");

FindControl의 괄호 안에 들어가는 아이는 EditItemTemplate의 아이디가 됩니다...

그 이후에 Row가 있으면 하고 if문 안으로 들어가서 연결되있는 DB를 확인해서 같은 프라이머리 키가 확인 되면 해당 하는 아이를 업데이트 시킵니다..

그리고 트랜젝션을 발생 시키는 작업인데..
TransactionScope <- 이 아이를 사용하려면 프로젝트의 References폴더를 우클릭해서 Add_References를 클릭합니다.. 거기서 System.Transactions 라는 아이를 추가 시켜 주면 됩니다. 그리구선 현재 cs페이지위에 사용하겠다하고 임포팅 시켜줘야겠죠

using System.Transactions;

이런 식으로 말이죠..

- onrowcancelingedit="GridView1_RowCancelingEdit"
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            this.GridView1.EditIndex = -1;
            DBind();
        }

보시면 다 아실 듯 합니다만.. 현재 인덱스의 바로 전으로가는 코딩이죠.. 편집화면 전으로 이동이죠.. 하지만 마지막으로 데이터바인딩은 꼭 할 것.

그럼 소스에서 계속 붙어 있는 DBind() 메서드 입니다.
DataSet을 만들어서 AdapterManager를 이용해 연결해 주는 방식이죠..


private PMSystemDataSet pmSystemDataSet = new PMSystemDataSet();
private TableAdapterManager tableAdapterManager = new TableAdapterManager();

private void DBind()
        {
            tableAdapterManager.ProjectManagerTableAdapter =
                    new ProjectManagerTableAdapter();
            tableAdapterManager.ProjectManagerTableAdapter.GetProjectInfo(pmSystemDataSet.ProjectManager);

            this.GridView1.DataSource = pmSystemDataSet.ProjectManager;
            this.GridView1.DataBind();
        }