Home > .NET, C# > Get RowIndex from edit LinkButton in GridView

Get RowIndex from edit LinkButton in GridView

Mình đang viết chức năng quản lý nhân viên trong một dự án web nhỏ. Chức năng này gồm liệt kê danh sách các nhân viên, form update/insert nhân viên, … Với ý tưởng là trên gridview chứa danh sách nhân viên, user chọn edit linkbutton thì gridview sẽ invisible và form edit sẽ được visible. FB thực hiện như sau:

  1. Create User Web control ucManageStaff.ascx
  2. Add 1 gvStaffList (gridview control) vào ucManageStaff để liệt kê danh sách nhân viên. Setup datasource cho gvStaffList  và set DataKeyNames = StaffID (field key of Staff table)
  3. Add fvStaffEdit (formview control) vào ucManageStaff với mục đích edit hoặc insert thông tin nhân viên. fvStaffEdit  này được set thuộc tính visible = false. Setup datasource cho fvStaffEdit và set DataKeyNames = StaffID (field key of Staff table), datasource này được thiết lập phương thức select(int staffid) với selectparameter staffid này được gán cho thuộc tính SelectedValue của gvStaffList. Như vậy khi gvStaffList select 1 row thì key field của row đó sẽ truyền sang cho fvStaffEdit

FB tạo linkbutton trên gvStaffList  để thực thi việc editing

...
<asp:TemplateField>
    <ItemTemplate>
          <asp:LinkButton ID="LinkButton1" runat="server"
                 CausesValidation="false" CommandName="Edit">
              <asp:Image ID="Image1" ImageUrl="~/img/reply.gif" />
          </asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>
...

Khi user click vào linkbutton trên 1 row nào đó, gvStaffList sẽ thực hiện việc select row này. Để làm điều đó ta cần xử lý sự kiện RowCommand của gvStaffList như sau:

protected void gvStaff_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // get index of row
    int rowIndex = Convert.ToInt32(e.CommandArgument);

    switch (e.CommandName.ToLower())
    {
        case "edit":
            // set selected row is editing row
            gvStaff.SelectedIndex = rowIndex;
            // show fvStaffEdit
            // hide gvStaffList
            break;
        ....
    }
}

Gặp lỗi ngay tại dòng underline đầu tiên, lỗi thông báo “Input string was not in a correct format.” !!! What’s happen??? Đó là do e.CommandArgument là empty, do vậy không thể convert to int được. Chú ý: nếu bạn sử dụng CommandField thay vì dùng TemplateField với LinkButton trong gridview thì lỗi này sẽ không xảy ra bởi asp.net đã thiết lập sẵn CommandArgument cho bạn. Vậy how to solve it???

Tớ biết có 2 cách giải quyết việc này: cách 1 là bind data of StaffID field vào CommandArgument att của LinkButton control, cách 2 là dùng BindingContainer att của LinkButton trong Gridview để lấy được curent row (clicked row)

Cách 1, ta cần sửa gvStaffList như sau:

...
<asp:TemplateField>
    <ItemTemplate>
          <asp:LinkButton ID="LinkButton1" runat="server"
                 CausesValidation="false" CommandName="Edit"
                 CommandArgument="<%#Eval(”StaffID”) %>">
              <asp:Image ID="Image1" ImageUrl="~/img/reply.gif" />
          </asp:LinkButton>
    </ItemTemplate>
</asp:TemplateField>
...

Lúc này hàm RowCommand của gvStaffList sẽ thực hiện mà không gặp lỗi.

Cách 2, sửa hàm RowCommand của gvStaffList:

protected void gvStaff_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // get index of row
    // int rowIndex = Convert.ToInt32(e.CommandArgument);

    // get command control
    if (!(e.CommandSource is LinkButton)) return;
    LinkButton link = (LinkButton)e.CommandSource;

    // Get data container of LinkButton
    GridViewRow row = (GridViewRow)link.BindingContainer;
    switch (e.CommandName.ToLower())
    {
        case "edit":
            // set selected row is editing row
            gvStaff.SelectedIndex = row.RowIndex;

            // show fvStaffEdit
            // hide gvStaffList
            break;
        ....
    }
}

Chỉ có 1 công đoạn nhỏ để truyền tham số thôi nhưng nó rất quan trọng và gây khá nhiều rắc rối cho người mới bắt đầu. Hy vọng bài viết này sẽ giúp ích cho các bạn. Thanks!!!

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: