【问题标题】:How to remove selected row in a gridview from a Session in VB.NET?如何从 VB.NET 的会话中删除网格视图中的选定行?
【发布时间】:2011-07-09 23:30:32
【问题描述】:

大家好,我正在尝试制作一个网页,其中包含一个页面上的项目列表,该页面显示在启用了自动生成选定按钮的网格视图中,他们可以单击此按钮并将项目加载到一个集合中我已经存储在一个会话中。在另一个页面上,包含他们选择的项目的会话显示在网格视图中。

现在我希望他们能够单击自动生成的删除按钮,以便从 gridview 中删除他们想要删除的项目?这是我遇到麻烦的地方,需要有人来帮助我。

我的索引页面(显示可用产品的页面)中有一个功能,这是它的代码

 Public Function addToCollection() As Collection
    If Session("Order") Is Nothing Then
        colOrder = New Collection
        Session("Order") = colOrder
    Else
        colOrder = Session("Order")
    End If
    Return colOrder
End Function

然后我在页面中加载我的代码以制作如下集合:

         addToCollection()
    Dim gvRow As GridViewRow = gvCDs.SelectedRow
    Dim objOrder As Order = New Order
    objOrder.ID = gvRow.Cells(1).Text
    objOrder.Title = gvRow.Cells(2).Text
    objOrder.Artist = gvRow.Cells(3).Text
    objOrder.Price = gvRow.Cells(5).Text
    colOrder.Add(objOrder)

    Session("Order") = colOrder

然后在我的另一个页面中,我在 gridview 中显示会话如下:

     Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete

    gvOrder.DataSource = Session("Order")
    gvOrder.DataBind()

End Sub

gridview 在每一行旁边都有自动生成的删除按钮,我想要它,以便当单击该按钮时,它会从 gridview 中删除该项目。我不知道该怎么做,但我知道我需要将它放在 gvOrder_DeletedRow 子中,并且我需要从会话中删除项目然后重新加载页面,请帮我解决这个问题,我不确定要写什么代码

【问题讨论】:

  • 能否请您发布您到目前为止所做的代码
  • @Tim - 我在下面更新了我的答案以使用 colOrder,但基本原理与以前相同。

标签: .net asp.net vb.net


【解决方案1】:

您需要处理 GridView.OnRowDeleting 方法。在您的代码隐藏中创建一个方法:

Sub GridView1_RowDeleting(sender As Object, e As GridViewDeleteEventArgs)

    ' Handle the removal of the row here
    ' The index of the row will be in e.RowIndex property

End Sub

在您的 ASPX 页面上,您需要将 onRowDeleting="GridView1_RowDeleting" 添加到 GridView 控件的标记中。

删除行的方式取决于您使用的数据源(例如,如果您有数据库作为数据源,您是否也想更新数据库)。发布您的一些代码将有助于获得更好、更详细的答案 - 但这应该可以为您指明正确的方向。

编辑添加 您发布了一些代码,但随后将其删除,因此我将其发布在下面以继续我的回答:

Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete

    gvOrder.DataSource = Session("Order") 
    gvOrder.DataBind() 

End Sub


Protected Sub gvOrder_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles gvOrder.RowDeleting 

    Session.RemoveAt(gvOrder.SelectedRow.RowIndex) 
End Sub

您的 gvOrder_RowDeleting 方法中的代码不是您想要的;我认为,根据您的 Session 对象中有多少东西,您要么删除该索引处的任何内容,要么获取索引超出范围异常。

试试这个:

Protected Sub gvOrder_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles gvOrder.RowDeleting 

   ' Session stores everything as an object, so its best to cast the object to the type it really is
    colOrder = CType(Session("Order"), colOrder)
    colOrder.RemoveAt(e.RowIndex)
    Session("Order") = colOrder
    gvOrder.DataSource = colOrder
    gvOrder.DataBind()

End Sub

本质上,将对象从 Session 中取出,删除选定的行,将对象放回 Session 中,然后将其绑定到 GridView。

【讨论】:

  • 到目前为止,在我的页面加载中,我有以下代码: gvOrder.DataSource = Session("Order") gvOrder.DataBind() 这正确显示了我想要的内容。现在对于 gridview 中单击自动生成的删除按钮的行,我想从会话集合中删除该项目在 gvOrder_RowDeleting 子中,我有以下内容,但我知道它不正确,我不知道该怎么做? Session.RemoveAt(gvOrder.SelectedRow.RowIndex)
  • 查看我对上面答案的补充。另请注意我关于将 Session 中存储的值从 Object 转换为任何类型的评论。
  • 按顺序排列的类型是我在索引页面上创建的对象的集合,这就是我创建它们的方式。这就是我创建包含超过 1 个对象的集合的方式 addToCollection() Dim gvRow As GridViewRow = gvCDs.SelectedRow Dim objOrder As Order = New Order objOrder.ID = gvRow.Cells(1).Text objOrder.Title = gvRow.Cells (2).Text objOrder.Artist = gvRow.Cells(3).Text objOrder.Price = gvRow.Cells(5).Text colOrder.Add(objOrder) Session("Order") = colOrder
  • 如何像在 cmets 中一样显示我的代码 sn-ps?
  • @Tim SO 将自动将任何以 4 个空格开头的行格式化为代码。不过,我相信它仅适用于问题和答案-不适用于 cmets。所以你需要编辑你的问题以显示格式化的代码。
【解决方案2】:

每当点击 Delete 按钮时,GridView 的 RowCommand 事件就会触发,您可以在那里通过命令名称进行检查,例如..e.CommandName == "Delete"

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Delete")
    {
        Int32 Id = Convert.ToInt32(e.CommandArgument);// this will return the selected 
        //row Id, which help you to identify and helps you to delete particular row
        // Put your deletion code here, that delete the record from list.....     
    }
}

【讨论】:

  • 到目前为止,在我的页面加载中,我有以下代码: gvOrder.DataSource = Session("Order") gvOrder.DataBind() 这正确显示了我想要的内容。现在对于 gridview 中单击自动生成的删除按钮的行,我想从会话集合中删除该项目在 gvOrder_RowDeleting 子中,我有以下内容,但我知道它不正确,我不知道该怎么做? Session.RemoveAt(gvOrder.SelectedRow.RowIndex)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多