[asp.net] Select row bij meerdere pagina's in een gridview

Pagina: 1
Acties:

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 14:29

sopsop

[v] [;,,;] [v]

Topicstarter
Ik heb op mijn pagina een gridview en een detailsview staan.
De gridview heeft als datasourde "membership.getallusers" en de detailsview heeft als datasource een GetUser met als command parameter de selected value van de gridview (die als datakeyname "UserName" heeft).

Nu kan ik via de detailsview een nieuwe gebruiker aanmaken. Na het opslaan wordt die nieuwe gebruiker -uiteraard- niet automatisch geselecteerd.

Hoe kan ik nu a.d.h.v. een datakeyname een row in een gridview selecteren? En dan gaat het mij met name om het selecteren van een row die niet in de huidige 'page' zit.

gridview.selectedrow, gridview.selectedDataKey, gridview.selectedDataValue zijn allemaal readonly, dus waarschijnlijk zal ik van de gridview.selectedindex gebruik moeten maken.

Maar het volgende loopje werkt ook niet, want de page wordt niet aangepast als ik die in dit loopje wijzig:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
                Dim bFoundTheUser As Boolean = False
                For j As Integer = 0 To grdUsers.PageCount - 1
                    grdUsers.PageIndex = j
                    For i As Integer = 0 To grdUsers.Rows.Count - 1
                        Dim lnk As LinkButton = grdUsers.Rows(i).Cells(0).Controls(0)
                        If lnk.Text = UserName Then
                            grdUsers.SelectedIndex = i
                            bFoundTheUser = True
                            Exit For
                        End If
                    Next
                    If bFoundTheUser Then Exit For
                Next

NB: indien de nieuw ingevoegde gebruiker op de eerste pagina staat, wordt deze wel gevonden.

Verwijderd

Ik heb met hetzelfde probleem gezeten, en ben er na een hoop gegoole / trial-and-error er achter gekomen, dat zonder een DataBind() (als ik me goed herinner om de data van de betreffende page op te halen) het idd niet werkt als de gewenste rij niet op de huidige pagina voorkomt.

Ik heb deze code welke ontzettend veel lijkt op de jouwe welke bij mij wel werkt:
Deze code zit bij mij onder de Page_PreRender van de pagina:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string NewIDLast = string.Empty;
        bool bfound = false;
        if (ViewState["NewID"] != null)
        {
            int NewID = (int)ViewState["NewID"];
            NewIDLast = NewID.ToString();

            for (int iPage = 0; iPage<VGridViewClients.PageCount; iPage++)
            {
                if (!bfound)
                {
                    VGridViewClients.PageIndex = iPage;
                    VGridViewClients.DataBind();
                    for (int iRows = 0; iRows < VGridViewClients.Rows.Count; iRows++)
                    {
                        if (!bfound)
                        {
                            string ID = VGridViewClients.Rows[iRows].Cells[1].Text;
                            if (ID.Equals(NewIDLast))
                            {
                                VGridViewClients.SelectedIndex = iRows;
                                ViewState["NewID"] = null;
                                bfound = true;
                            }
                        }
                    }
                }
            }
        }


Hoop dat het je nu wel lukt!

[ Voor 1% gewijzigd door Verwijderd op 16-07-2007 13:50 . Reden: typotjes ;) ]


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 14:29

sopsop

[v] [;,,;] [v]

Topicstarter
Dit lijkt me toch redelijke basis functionaliteit, het kunnen 'springen' naar een record in een datagrid. Een hele grid doorlopen met voor iedere pagina een databind lijkt me niet echt efficiënt. Nu is de efficiëntie in dit specifieke geval niet echt van curciaal belang, maar toch.

=edit=
Het werkt iig wel als een tierelier :) Maar mochten er betere suggesties zijn.....

[ Voor 14% gewijzigd door sopsop op 17-07-2007 08:45 ]


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Als je in regel 13 toch een DataBind doet, kun je beter in de RowDataBound van die grid maken en dan
C#:
1
2
3
4
5
6
protected void grdUsers_RowDataBound(object sender, GridViewRowEventArgs e)
{
LinkButton btn = e.Row.Controls[0] as LinkButton;
if ( btn != null && btn.Text == UserName)
            e.Row.RowState = DataControlRowState.Selected;
}

[ Voor 7% gewijzigd door Mastermind op 17-07-2007 09:46 ]


Verwijderd

sopsop schreef op dinsdag 17 juli 2007 @ 08:31:
Dit lijkt me toch redelijke basis functionaliteit, het kunnen 'springen' naar een record in een datagrid. Een hele grid doorlopen met voor iedere pagina een databind lijkt me niet echt efficiënt. Nu is de efficiëntie in dit specifieke geval niet echt van curciaal belang, maar toch.

=edit=
Het werkt iig wel als een tierelier :) Maar mochten er betere suggesties zijn.....
De andere optie die je hebt is tijdens het ophalen van de records er door middel van de de "aantal records welke er voor zitten" (count van de id's tot dat id) en de pagina grootte proberen uit te rekenen op welke pagina de bewuste record valt en dan "direct" naar de juiste pagina springen.
Mastermind schreef op dinsdag 17 juli 2007 @ 09:43:
Als je in regel 13 toch een DataBind doet, kun je beter in de RowDataBound van die grid maken en dan
C#:
1
2
3
4
5
6
protected void grdUsers_RowDataBound(object sender, GridViewRowEventArgs e)
{
LinkButton btn = e.Row.Controls[0] as LinkButton;
if ( btn != null && btn.Text == UserName)
            e.Row.RowState = DataControlRowState.Selected;
}
En dat is het hele probleem nou juist _alleen_ de huidige pagina van de gridview wordt gebind en als je record niet op de huidige pagina staat gaat het niet werken helaas.

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 14:29

sopsop

[v] [;,,;] [v]

Topicstarter
Verwijderd schreef op donderdag 19 juli 2007 @ 08:15:
[...]
En dat is het hele probleem nou juist _alleen_ de huidige pagina van de gridview wordt gebind en als je record niet op de huidige pagina staat gaat het niet werken helaas.
Op zich werkt dit wel, je hoeft dat niet meer door de rows heen te loopen, maar alleen door de afzonderlijke pagina's.

Indien je geen custom paging gebruikt, zou je zelfs de paging uit kunnen zetten, het record opzoeken en de paging weer aan. Maar ik denk dat dit weinig tot geen performance winst oplevert.

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Inderdaad, want de RowDataBound eventhandler van de afzonderlijk grid wordt immers opgeroepen in de gedatabounde pagina? Dit scheelt performance.
Pagina: 1