在GridView行上执行操作的最佳方法

时间:2013-05-03 08:04:36

标签: c# asp.net .net gridview

我正在尝试对GridView中的行执行操作。根据我在线阅读的内容,有几种方法可以执行此类操作。所有这些方法看起来都很复杂,涉及到如此多的手动管道。

例如,为了从GridView“删除”某个项目,我遇到了以下方法:

1:使用GridView RowCommand事件:

protected void GridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
    GridViewRow gridviewRow = 
        CoordinateFilesGridView.Rows[Convert.ToInt32(e.CommandArgument)];
    MyEntity entity = (MyEntity)gridviewRow.DataItem;

    if(e.CommandName.Equals("Delete"))
    {
        // Perform delete action
        Delete(entity);
    }
}

2:向“删除”按钮提供OnClick事件

public void Delete_Clicked(Object sender, System.EventArgs e)
{
    var item = ((sender as WebControl).NamingContainer as DataListItem);
    var rowID = int.Parse(((HiddenField)item.FindControl("rowID")).Value);

    GridViewRow gridviewRow = CoordinateFilesGridView.Rows[rowID];
    MyEntity entity = (MyEntity)gridviewRow.DataItem;

    // Perform delete action
    Delete(entity);
}

3:链接到网址并在Page_Load

中打破查询字符串
if (queryString != null && queryString["action"] != null)
{
    if (queryString["action"].Equals("delete") && queryString["rowID"] != null)
    {
        GridViewRow gridviewRow = 
            CoordinateFilesGridView.Rows[(int)queryString["rowID"]];
        MyEntity entity = (MyEntity)gridviewRow.DataItem;

        // Perform delete action
        Delete(entity);
    }
}

您将如何执行此类操作?有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

你有一个Gridview来执行删除或更新等操作,因为我知道最简单的方法是使用gridview右侧的quicktasks菜单。

1)单击编辑列
2)单击commandField
3)然后向gridview添加删除更新和取消按钮以删除行。

在youtube上查看asp.net的智能方法课程..希望这很有用..

答案 1 :(得分:1)

根据您的喜好选择1或2。

我通常会选择选项1,因为它是内置的GridView按钮处理程序,所以如果你的行中有多个按钮,你有一个处理这些按钮的方法,你正在重用代码 - < / p>

GridViewRow gridviewRow = 
    CoordinateFilesGridView.Rows[Convert.ToInt32(e.CommandArgument)];
MyEntity entity = (MyEntity)gridviewRow.DataItem;

不是添加多个点击事件,而是可能将以下代码添加到单个点击方法中。

var item = ((sender as WebControl).NamingContainer as DataListItem);
var rowID = int.Parse(((HiddenField)item.FindControl("rowID")).Value);

但是,在一天结束时,这只是你自己的偏好。我多次使用过1和2。我看不出你为什么要使用3的原因。

答案 2 :(得分:1)

您是否查看了GridView的RowDeleting事件?只有在单击行的“删除”按钮时才会触发,因此您可以跳过当前正在检查e.CommandName的步骤。 此外,您将能够检查e.Keys以获取要删除的实体的ID(假设您已设置GridView的DataKeyNames属性)。

<asp:GridView ID="CoordinateFilesGridView" runat="server" DataKeyNames="Id" OnRowDeleting="CoordinateFilesGridView_RowDeleting">
    <Columns>
    </Columns>
</asp:GridView>


protected void CoordinateFilesGridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    var entityId = int.Parse(e.Keys["Id"].ToString());

    DeleteEntity(entityId);
}

答案 3 :(得分:1)

In short, whatever works for you in the current situation.

如果使用带有装饰方法的数据访问层进行插入,更新,删除,则可以避免使用管道代码。您只需在数据源和数据源上指定方法即可。一切都应该开箱即用。

在我的业务逻辑层中,我有这些方法达到了DAL

    [DataObjectMethod(DataObjectMethodType.Update, true)]
    public static int UpdateItem(EmployeeItem myItem)
    {
        return EmployeeDB.UpdateItem(myItem);
    }

    [DataObjectMethod(DataObjectMethodType.Delete, true)]
    public static bool DeleteItem(EmployeeItem myItem)
    {
        return EmployeeDB.DeleteItem(myItem.EmployeeID);
    }

在我的表示层上,我将对象数据源绑定到这些

 <asp:ObjectDataSource ID="odsSecCh" runat="server" DataObjectTypeName="myCompany.myProject.BO.EmployeeItem"
  DeleteMethod="DeleteItem" InsertMethod="SaveItem" OldValuesParameterFormatString="original_{0}"
 SelectMethod="GetListById" TypeName="myCompany.myProject.BLL.EmployeeManager">
  <SelectParameters>
      <asp:Parameter Name="empId" Type="Int32" />
  </SelectParameters>
</asp:ObjectDataSource>

这样,在使用相同gridview控件的其他aspx页面上不需要管道代码。