【问题标题】:ASP.NET delete specific rows from gridviewASP.NET 从 gridview 中删除特定行
【发布时间】:2018-12-08 03:32:12
【问题描述】:

我需要帮助解决以下问题。 我尝试从 gridview 中删除特定的行。 下面的代码运行良好,但是当页面加载时,它会显示数据库中的所有数据。 如何过滤数据?我的意思是当页面加载时它什么都不显示,但是在文本框中输入一些文本后,它会显示带有该文本的行,我可以通过选中复选框和按钮从文本框中删除一些带有文本的行。

这是我的代码。请帮助我。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    If IsPostBack Then
        GetData()
    End If
    BindGrid()
End Sub

Private Sub BindGrid()
    Dim constr As String = ConfigurationManager _
                .ConnectionStrings("conString").ConnectionString()
    Dim query As String = "select * from TestCustomers"
    Dim con As New SqlConnection(constr)
    Dim sda As New SqlDataAdapter(query, con)
    Dim dt As New DataTable()
    sda.Fill(dt)
    gvAll.DataSource = dt
    gvAll.DataBind()
End Sub

Protected Sub OnPaging(ByVal sender As Object, ByVal e As GridViewPageEventArgs)
    gvAll.PageIndex = e.NewPageIndex
    gvAll.DataBind()
    SetData()
End Sub

Private Sub GetData()
    Dim arr As ArrayList
    If ViewState("SelectedRecords") IsNot Nothing Then
        arr = DirectCast(ViewState("SelectedRecords"), ArrayList)
    Else
        arr = New ArrayList()
    End If
    Dim chkAll As CheckBox = DirectCast(gvAll.HeaderRow _
                .Cells(0).FindControl("chkAll"), CheckBox)
    For i As Integer = 0 To gvAll.Rows.Count - 1
        If chkAll.Checked Then
            If Not arr.Contains(gvAll.DataKeys(i).Value) Then
                arr.Add(gvAll.DataKeys(i).Value)
            End If
        Else
            Dim chk As CheckBox = DirectCast(gvAll.Rows(i).Cells(0) _
                                        .FindControl("chk"), CheckBox)
            If chk.Checked Then
                If Not arr.Contains(gvAll.DataKeys(i).Value) Then
                    arr.Add(gvAll.DataKeys(i).Value)
                End If
            Else
                If arr.Contains(gvAll.DataKeys(i).Value) Then
                    arr.Remove(gvAll.DataKeys(i).Value)
                End If
            End If
        End If
    Next
    ViewState("SelectedRecords") = arr
End Sub

Private Sub SetData()
    Dim currentCount As Integer = 0
    Dim chkAll As CheckBox = DirectCast(gvAll.HeaderRow _
                    .Cells(0).FindControl("chkAll"), CheckBox)
    chkAll.Checked = True
    Dim arr As ArrayList = DirectCast(ViewState("SelectedRecords") _
                                    , ArrayList)
    For i As Integer = 0 To gvAll.Rows.Count - 1
        Dim chk As CheckBox = DirectCast(gvAll.Rows(i).Cells(0) _
                                        .FindControl("chk"), CheckBox)
        If chk IsNot Nothing Then
            chk.Checked = arr.Contains(gvAll.DataKeys(i).Value)
            If Not chk.Checked Then
                chkAll.Checked = False
            Else
                currentCount += 1
            End If
        End If
    Next
    hfCount.Value = (arr.Count - currentCount).ToString()
End Sub

Protected Sub btnDelete_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim count As Integer = 0
    SetData()
    gvAll.AllowPaging = False
    gvAll.DataBind()
    Dim arr As ArrayList = DirectCast(ViewState("SelectedRecords") _
                                , ArrayList)
    count = arr.Count
    For i As Integer = 0 To gvAll.Rows.Count - 1
        If arr.Contains(gvAll.DataKeys(i).Value) Then
            DeleteRecord(gvAll.DataKeys(i).Value.ToString())
            arr.Remove(gvAll.DataKeys(i).Value)
        End If
    Next
    ViewState("SelectedRecords") = arr
    hfCount.Value = "0"
    gvAll.AllowPaging = True
    BindGrid()
    ShowMessage(count)
End Sub

Private Sub DeleteRecord(ByVal CustomerID As String)
    Dim constr As String = ConfigurationManager _
                    .ConnectionStrings("conString").ConnectionString
    Dim query As String = "delete from TestCustomers where" & _
                            " CustomerID=@CustomerID"
    Dim con As New SqlConnection(constr)
    Dim cmd As New SqlCommand(query, con)
    cmd.Parameters.AddWithValue("@CustomerID", CustomerID)
    con.Open()
    cmd.ExecuteNonQuery()
    con.Close()
End Sub

Private Sub ShowMessage(ByVal count As Integer)
    Dim sb As New StringBuilder()
    sb.Append("<script type = 'text/javascript'>")
    sb.Append("alert('")
    sb.Append(count.ToString())
    sb.Append(" records deleted.');")
    sb.Append("</script>")
    ClientScript.RegisterStartupScript(Me.GetType(), _
                    "script", sb.ToString())
End Sub

<asp:GridView ID="gvAll" runat="server" 
    AutoGenerateColumns = "false" Font-Names = "Arial" 
    Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B"  
    HeaderStyle-BackColor = "green" AllowPaging ="true"   
    OnPageIndexChanging = "OnPaging" DataKeyNames = "CustomerID"
    PageSize = "10" >
   <Columns>
    <asp:TemplateField>
        <HeaderTemplate>
            <asp:CheckBox ID="chkAll" runat="server" onclick = "checkAll(this);" />
        </HeaderTemplate> 
        <ItemTemplate>
            <asp:CheckBox ID="chk" runat="server" onclick = "Check_Click(this)"/>
        </ItemTemplate>
    </asp:TemplateField> 
    <asp:BoundField ItemStyle-Width = "150px" DataField = "ContactName" HeaderText = "Contact Name"/>
    <asp:BoundField ItemStyle-Width = "150px" DataField = "Country" HeaderText = "Country"/>
    <asp:BoundField ItemStyle-Width = "150px" DataField = "City" HeaderText = "City"/>
   </Columns> 
   <AlternatingRowStyle BackColor="#C2D69B"  />
</asp:GridView> 
    <asp:HiddenField ID="hfCount" runat="server" Value = "0" />
    <asp:Button ID="btnDelete" runat="server" Text="Delete Checked Records" OnClientClick = "return ConfirmDelete();" OnClick="btnDelete_Click" />

【问题讨论】:

    标签: asp.net database vb.net checkbox


    【解决方案1】:

    虽然你的问题不清楚,但我会回答我所理解的。

    你想在页面加载和回发时显示所有数据,你想显示选定的行,对吧?

    如果是的话

    试试这个代码 If IsPostBack Then 获取数据() 结束如果

    否则 绑定网格()

    如果这还没有回答你的问题,请告诉我你到底想做什么。

    【讨论】:

    • 谢谢。我的意思是当页面加载时..datagrid 是空的。所以不显示..在文本框中输入文本然后单击搜索按钮,所有带有文本框中文本的记录都会显示..然后我只需选择我要删除的特定记录,然后单击删除按钮删除选定的行..in我的代码在页面加载时显示所有行..但我想选择我想用特定文本删除的行...而不是像现在这样从所有记录中..
    【解决方案2】:

    这将删除所有已选择的行。

    For Each row As DataGridViewRow In yourDGV.SelectedRows
        yourDGV.Rows.Remove(row)
    Next
    
    
    Private Sub btndelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btndelete.Click
      If DataGridView1.SelectedRows.Count > 0 Then
       DataGridView1.Rows.RemoveAt(DataGridView1.CurrentRow.Index)
      Else
       MessageBox.Show("You must select a row")
      End If
    End Sub
    

    使用它可能对您有所帮助

    Protected Sub btnDelete_Click(ByVal sender As Object, ByVal e As EventArgs)
        For Each gvrow As GridViewRow In gvDetails.Rows
            'Finiding checkbox control in gridview for particular row
            Dim chkdelete As CheckBox = DirectCast(gvrow.FindControl("chkSelect"), CheckBox)
            'Condition to check checkbox selected or not
            If chkdelete.Checked Then
                'Getting UserId of particular row using datakey value
                Dim usrid As Integer = Convert.ToInt32(gvDetails.DataKeys(gvrow.RowIndex).Value)
                Using con As New SqlConnection("YOUR SQL DATABASE CONNECTION")
                    con.Open()
                    Dim cmd As New SqlCommand("delete from UserDetails where UserId=" & usrid, con)
                    cmd.ExecuteNonQuery()
                    con.Close()
                End Using
            End If
        Next
        BindUserDetails()
    End Sub
    

    【讨论】:

    • 感谢您的代码...但我想通过 checkbix 选择行来删除行,然后单击按钮删除所选行
    • 您不应该在页面加载时绑定所有行,在页面加载时您必须显示空网格,编写查询以从 SQL 表中搜索文本并执行查询,现在显示结果带复选框的网格。现在您要删除哪条记录,选择并单击删除按钮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2016-05-25
    • 1970-01-01
    • 2016-01-30
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多