webForumDet fria alternativet

GridView Multiselect

13 svar · 1 845 visningar · startad av ConnyFox

ConnyFoxMedlem sedan aug. 20011 201 inlägg
#1

Har en gridview där jag vill kunna välja flera rader och göra något med dom raderna, t.ex ta bort dom ur databasen. Har lagt till en checkbox men vet inte hur jag skall få det att fungera, checkboxes fungerar ju så konstigt i asp.net..

hur kopplar man ett värde och gemensamt namn till checkboxarna?
verkar ju inte gå men det borde ju gå att lösa på någotvis.

har kollat runt på olika ställen men inte fått något utav exemplen att fungera med min kod.

tacksam för hjälp!

[Default.asp]

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
    
</head>
<body>
    <form id="form1" runat="server">
        <ajaxToolkit:ToolkitScriptManager ID="ScriptManager1" runat="server" />
        <div>
        <asp:TextBox ID="Search_title" runat="server"></asp:TextBox>
        <asp:Button ID="Search_submit" runat="server" Text="Sök" />
        
        
<asp:GridView id="MySQLDataGrid" runat="server" AutoGenerateColumns="true" AllowPaging="True" PageSize="4" AllowSorting="True">
        <Columns>
             <asp:TemplateField >
                <HeaderStyle HorizontalAlign="left" />
                <HeaderTemplate >
                    <asp:CheckBox id="chkSelectAll" ToolTip="Click here to select/deselect all rows" runat="server"  />
                </HeaderTemplate>
                <ItemTemplate>
                    <asp:CheckBox ID="chkSelect" runat="server"   />
                </ItemTemplate>
              
             </asp:TemplateField>
        </Columns>

        </asp:GridView>   
            <asp:Button ID="btnDelete" runat="server" OnClick="btnDelete_Click" Text="Delete Selected Records" />
    
        </div>
    </form>
</body>
</html>

Default.aspx.vb

Imports System.Data
Imports MySql.Data.MySqlClient

Partial Class _Default
    Inherits System.Web.UI.Page
    Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    End Sub

    Protected Sub Search_submit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Search_submit.Click
        bindgrid()
    End Sub

    Private Sub bindgrid()
        ' Define data objects
        Dim conn As MySqlConnection
        Dim adapter As MySqlDataAdapter
        Dim dataset As New DataSet
        If ViewState("MySQLDataSet") Is Nothing Then
            ' Read the connection string from Web.config
            Dim strsearch As String = Search_title.Text
            conn = New MySqlConnection("server=localhost; database=jmdb; pooling=false;")
            Dim strSQL As String = "SELECT * FROM movies where title like '%" & strsearch & "%'"
            ' Create adapter
            adapter = New MySqlDataAdapter(strSQL, conn)
            ' Fill the DataSet
            adapter.Fill(dataset, "movies")
            ' Store the DataSet in view state
            ViewState("MySQLDataSet") = dataset
        Else
            dataset = ViewState("MySQLDataSet")
        End If
        ' Prepare the sort expression using the gridSortDirection and
        ' gridSortExpression properties
        Dim sortExpression As String
        If gridSortDirection = SortDirection.Ascending Then
            sortExpression = gridSortExpression & " ASC"
        Else
            sortExpression = gridSortExpression & " DESC"
        End If
        ' Sort the data
        dataset.Tables("movies").DefaultView.Sort = sortExpression
        ' Bind the grid to the DataSet
        MySQLDataGrid.DataSource = dataset.Tables("Movies").DefaultView
        MySQLDataGrid.DataBind()

    End Sub

    Protected Sub MySQLDataGrid_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles MySQLDataGrid.PageIndexChanging
        ' Retrieve the new page index
        Dim newPageIndex As Integer = e.NewPageIndex
        ' Set the new page index of the GridView
        MySQLDataGrid.PageIndex = newPageIndex
        ' Bind the grid to its data source again to update its contents
        bindgrid()
    End Sub

    Protected Sub MySQLDataGrid_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles MySQLDataGrid.Sorting
        ' Retrieve the name of the clicked column (sort expression)
        Dim sortExpression As String = e.SortExpression
        ' Decide and save the new sort direction
        If (sortExpression = gridSortExpression) Then
            If gridSortDirection = SortDirection.Ascending Then
                gridSortDirection = SortDirection.Descending
            Else
                gridSortDirection = SortDirection.Ascending
            End If
        Else
            gridSortDirection = WebControls.SortDirection.Ascending
        End If
        ' Save the new sort expression
        gridSortExpression = sortExpression
        ' Rebind the grid to its data source
        bindgrid()
    End Sub

    Private Property gridSortDirection()
        Get
            ' Initial state is Ascending
            If (ViewState("GridSortDirection") Is Nothing) Then
                ViewState("GridSortDirection") = SortDirection.Ascending
            End If
            ' Return the state
            Return ViewState("GridSortDirection")
        End Get
        Set(ByVal value)
            ViewState("GridSortDirection") = value
        End Set
    End Property
    Private Property gridSortExpression()
        Get
            ' Initial sort expression is DepartmentID
            If (ViewState("GridSortExpression") Is Nothing) Then
                ViewState("GridSortExpression") = "title"
            End If
            ' Return the sort expression
            Return ViewState("GridSortExpression")
        End Get
        Set(ByVal value)
            ViewState("GridSortExpression") = value
        End Set
    End Property
End Class
CatZMedlem sedan jan. 20022 341 inlägg
#2
    Function deletestuff()
        Dim CheckBox As CheckBox
        Dim IDToDelete As Int32

        For Each GridViewRow As GridViewRow In GridView1.Rows

            CheckBox = CType(GridViewRow.FindControl("MyCheckBox"), CheckBox)

            If CheckBox.Selected Then

                IDToDelete = CType(GridView1.DataKeys.Item(GridViewRow.RowIndex).Value, Int32)

                ' Gör din delete

            End If
        Next
    End Function
ConnyFoxMedlem sedan aug. 20011 201 inlägg
#3

hmm ok funkar detta så är det ju hur bra som helst om det fungerar som jag vill.

Dock så undrar jag följande.. man kan ju inte ge flera checkbox:ar samma ID (vilket i ditt exempel isåfall skulle vara mycheckbox) eftersom id nummer måste vara unika ? så hur gör jag för att ge alla ett gemensamt namn (mycheckbox) och sedan kunna plocka ut ett annat värde från dom än namnet (id´t man vill radera)?

Förstår inte riktigt :)

CatZMedlem sedan jan. 20022 341 inlägg
#4

Då rekommenderar jag att du läser på lite!

GridView1.DataKeys.Item(GridViewRow.RowIndex).Value

Används för att hämta det unika ID't på just den raden i din gridview som för tillfället körs i din

For Each GridViewRow As GridViewRow In GridView1.Rows

Alltså behöver du inte ange något annat än myCheckbox eller i ditt fall vill du kanske ändra till chkSelect.

Givetvis måste du modifiera namnet på GridViewn också så att det då blir MySQLDataGrid istället för GridView1.

Du kan också hitta ID't från valfri kolumn och ta bort på det istället.

For Each gr In MySQLDataGrid.Rows
	Dim chk As CheckBox = CType(gr.FindControl("chkSelect"), CheckBox)
	If Not chk Is Nothing Then
		If chk.Checked Then
			Dim CustomerID As String = MySQLDataGrid.DataKeys(gr.RowIndex)("IDTODELETE").ToString
			demos.DeleteCustomerRecord(CustomerID)
		End If
	End If
Next
MySQLDataGrid.DataBind()
ConnyFoxMedlem sedan aug. 20011 201 inlägg
#5

Hmm ja men asså hur vet den vilken data jag vill plocka ut?

såhär hade jag t.ex viljat ha det om det vart html.

<input type="text" name="mina" value="hans" />
<input type="text" name="mina" value="greta" />
<input type="text" name="mina" value="stoffe" />

där hans,greta,stoffe är värderna som jag vill använda.
Det går ju inte att ha två värden i en asp:checkbox (name och value) utan bara ID.
hur din kod plockar ut alla mina checkboxar med ID´t chkselect förstår jag, men hur vet din kod sedan vilket värde jag vill ha ut?

Hur vet din kod värdet stoffe? jag menar hur vet den vilken databas-cell den skall koppla ihop med radens id?

möjligt att jag e trög bara men jag förstår inte hur din kod fungerar om den nu gör som jag vill.

ConnyFoxMedlem sedan aug. 20011 201 inlägg
#6

får

Index låg utanför intervallet. Det får inte vara negativt och måste vara mindre än mängdens storlek.
Parameternamn: index

på raden
Dim CustomerID As String = MySQLDataGrid.DataKeys(gr.RowIndex)("IDTODELETE").ToString

CatZMedlem sedan jan. 20022 341 inlägg
#7

En checkbox ska inte användas till något annat än sant/falskt. Du har ett namn på alla checkboxar i en gridview och sedan ett värde som antingen är sant eller falskt.

MySQLDataGrid.DataKeys(gr.RowIndex)

säger åt ramverket att det är på exakt den här raden den ska välja om checkboxen är ikryssad. Då sätter den ID't från valfri kolumn eller nyckeln på raden i gridviewn.

Det känns som om du missat lite av grunderna här. Det vore nog bra att kika lite i en bok. Kan rekommendera ASP.NET Unleashed.

Finns även lite info på följande länkar:
http://download.microsoft.com/download/5/B/E/5BE27139-088F-4F94-A505-8901EF5897FA/08 - Working with the GridView and FormView Controls_vb.wmv
http://www.asp.net/learn/data-access/tutorial-52-vb.aspx

Det går att göra så som du efterfrågar också med icke-serverkontroller då får du konkatenera chkSelect med tex ID

chkSelect.ID = "chkSelect" + CType(GridView1.DataKeys.Item(GridViewRow.RowIndex).Value, String)

Men varför göra sånt man inte måste? ;)

CatZMedlem sedan jan. 20022 341 inlägg
#8

ConnyFox skrev:

får

Index låg utanför intervallet. Det får inte vara negativt och måste vara mindre än mängdens storlek.
Parameternamn: index

på raden
Dim CustomerID As String = MySQLDataGrid.DataKeys(gr.RowIndex)("IDTODELETE").ToString

Anledningen till felmeddelandet är att IDTODELETE inte är någon giltig kolumn i din gridview... simple as that, du får byta ut den mot namnet på den kolumnen vars id du vill använda till att köra din

mySql = ("delete from myTable where ID = " & myID)
ConnyFoxMedlem sedan aug. 20011 201 inlägg
#9

Får det inte att fungera även om jag byter ut IDTODELETE mot en kolumn som finns. får samma fel som tidigare och på samma rad!

här är min fullständiga kod

Protected Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click
        For Each gr As GridViewRow In MySQLDataGrid.Rows
            Dim chk As CheckBox = CType(gr.FindControl("chkSelect"), CheckBox)
            If Not chk Is Nothing Then
                If chk.Checked Then
                    Dim CustomerID As String = MySQLDataGrid.DataKeys(gr.RowIndex)("movieid").ToString()
                    Label1.Text = CustomerID
                End If
            End If
        Next

    End Sub
CatZMedlem sedan jan. 20022 341 inlägg
#10

Tittar på det imorn efter bilprovningen ;)

ConnyFoxMedlem sedan aug. 20011 201 inlägg
#11

tackar ;)

CatZMedlem sedan jan. 20022 341 inlägg
#12

Du ska inte byta ut mot vilken kolumn som helst, du ska byta ut mot namnet på din DataKey. En datakey är det unika ID på varje rad i en gridview. Det som skiljer raderna åt och som inte kan finnas dubletter av.

Vill du använda dig av en annan kolumn får du köra en findcontrol eller liknande.

CatZMedlem sedan jan. 20022 341 inlägg
#13

Finns det inte dubletter av movieID och du vill använda den som datakey kan du ange det i properties på din gridview.

ConnyFoxMedlem sedan aug. 20011 201 inlägg
#14

Ok låter bra.. hur gör jag det då? :)

Genererad på 978 ms · cache AV · v20260730165559-full.f96bc7eb