Toon posts:

[c#] zoeken naar een item in een datagrid.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb in een dataGrid met paging een overzicht van diverse activiteiten.
Het overzicht kan wel 1000 activiteiten bevatten, om de performance te versnellen heb ik dus gebruik gemaakt van Paging. Doordat er nu een hoop pagina's ontstaan wil ik een zoekfunctie inbouwen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
DataView dv = (DataView)Session["overzicht"];
for(int i = 0; i< dv.Table.Rows.Count; i++)
{

  string zoektekst = tb_zoektekst.Text;
  if(zoektekst.CompareTo(dv.Table.Rows[i][0].ToString()) == 0)
 {
    int pagina =  i/int.Parse(dg_overzicht.PageSize.ToString());        
    dg_overzicht.CurrentPageIndex = pagina;
    VulGrid.VulDataGrid(dv,dg_overzicht);
    break;
  }             
}


Nu kan ik dus zoeken en lijkt er geen probleem. echter wanneer ik het grid opnieuw sorteer en de dataview dus ook is aangepast en dan ga zoeken op een item, dan vind hij het item nog op de oude locatie. dus de locatie voro het sorteren.

Ik heb ook geprobeerd om te zoeken vanuit het datagrid, maar dan zoekt deze alleen in de huidige page van het grid.

Hoe kan ik dit oplossen? Of is er misschien een andere manier voor een duidelijk overzicht?

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Is het niet handig om ipv te zoeken, te gaan filteren?

Verwijderd

Topicstarter
Riegstar schreef op 10 mei 2004 @ 15:26:
Is het niet handig om ipv te zoeken, te gaan filteren?
Dus een query met een like erin? en alleen de activiteiten ophalen die erop lijken.
Een zoekfunctie leek mij beter.

  • whoami
  • Registratie: December 2000
  • Laatst online: 25-05 23:56
Kijk eens naar de Find method van de datatable die je aan de grid gebinded hebt.

https://fgheysels.github.io/


  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Dus als ik het goed begrijp, wil je na sortering op de pagina terecht komen van de opgezochte item?

Verwijderd

Topicstarter
Riegstar schreef op 10 mei 2004 @ 15:48:
Dus als ik het goed begrijp, wil je na sortering op de pagina terecht komen van de opgezochte item?
Nee dat niet. bovenstaande code werkt, totdat ik gesorteerd heb, dan verwijst deze naar de pagina waar het gezochte item stond voor de sortering.

Ik zal eens kijken naar de methode find.

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Voordat je de grid bind:
code:
1
dg_overzicht.CurrentPageIndex = -1


Of wil je nu de nieuwe paginanummer hebben, na sorteren?

[ Voor 29% gewijzigd door Riegstar op 10-05-2004 16:01 ]


Verwijderd

Topicstarter
whoami schreef op 10 mei 2004 @ 15:47:
Kijk eens naar de Find method van de datatable die je aan de grid gebinded hebt.
De find method werkt inderdaad ook (ook na sorteren), het nadeel is echter dat je de precieze omschrijving moet weten dus niet ("een like") en er moet op 2 kolommen gezocht worden, maar alleen op de 1e wordt gezocht.


code:
1
2
3
4
5
6
7
8
9
10
11
12
DataView dv = (DataView)Session["overzicht"];
if(dv.Sort == "")
{
               dv.Sort = "omschr_tua asc";  
}
else
{
    dv.Sort = dv.Sort;
}   
int pagina =  dv.Find((tb_zoektekst.Text)/int.Parse(dg_overzicht.PageSize.ToString());      
dg_overzicht.CurrentPageIndex = pagina;
VulGrid.VulDataGrid(dv,dg_overzicht);

[ Voor 5% gewijzigd door Verwijderd op 11-05-2004 09:49 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 25-05 23:56
Ik denk dat je, als je een Like nodig hebt, dat je dan ook de 'Select' method kunt gebruiken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 11 mei 2004 @ 09:51:
Ik denk dat je, als je een Like nodig hebt, dat je dan ook de 'Select' method kunt gebruiken.
Je bedoelt dat ik dan een nieuwe query moet aanroepen met die Like erin?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 11:53

gorgi_19

Kruimeltjes zijn weer op :9

Bestond er ook niet zoiets als een RowFilter? In het slechtste geval kan je trouwens ook een eigen Iterator maken. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 25-05 23:56
Verwijderd schreef op 11 mei 2004 @ 09:57:
[...]


Je bedoelt dat ik dan een nieuwe query moet aanroepen met die Like erin?
neen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
gorgi_19 schreef op 11 mei 2004 @ 09:58:
Bestond er ook niet zoiets als een RowFilter? In het slechtste geval kan je trouwens ook een eigen Iterator maken. :)
Ik geloof niet dat mijn kennis zo optimaal is om een eigen Iterator te maken, de rowfilter, daar zal ik eens naar kijken

Verwijderd

Topicstarter
Wat dan wel als ik vragen mag?

  • whoami
  • Registratie: December 2000
  • Laatst online: 25-05 23:56
De select method van de datatable, zoals ik al in m'n eerdere reply gezet heb.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 11 mei 2004 @ 10:01:
De select method van de datatable, zoals ik al in m'n eerdere reply gezet heb.
Ik heb het inmiddels werkende, bedankt daarvoor, maar het nadeel is dat er alleen gezocht kan worden op de letterlijke activiteit in de datagrid. en wil op "act" kunnen zoeken wanneer activiteit bedoelt word.

  • whoami
  • Registratie: December 2000
  • Laatst online: 25-05 23:56
Ik zie in de .NET help dat je bij de Select method wel degelijk de LIKE operator kunt gebruiken, en dat je dus ook gebruik kunt maken van wildcards.
Je moet dan wel * nemen als wildcard character, en niet %

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 11 mei 2004 @ 13:47:
Ik zie in de .NET help dat je bij de Select method wel degelijk de LIKE operator kunt gebruiken, en dat je dus ook gebruik kunt maken van wildcards.
Je moet dan wel * nemen als wildcard character, en niet %
Ow okee, dat is zeer belangrijk, thanx.

Verwijderd

Topicstarter
Verwijderd schreef op 11 mei 2004 @ 13:58:
[...]


Ow okee, dat is zeer belangrijk, thanx.
ik heb nu het volgende:

code:
1
2
3
4
5
string exp = "omschr_tua like '*ouw s*'";
string sort = "omschr_tua desc";
            
DataRow [ ] foundRows = dt.Select(exp,sort);
string i = foundRows[0].newRecord; --> dit werkt niet


en dit werkt perfect. De datarow FoundRows heeft een propertie newrecord en geeft de postitie van het item weer in de datatable.
Deze positie heb ik nodig om de plaats in het datagrid te kunnen bepalen.
Dit is echter een private method, op welke manier kan ik dit gegeven toch uitlezen?

ik wil namelijk het volgende doen:

code:
1
2
3
int pagina =  int.Parse(i)/int.Parse(dg_overzicht.PageSize.ToString());     
dg_overzicht.CurrentPageIndex = pagina;
VulGrid.VulDataGrid(dt.DefaultView,dg_overzicht);

[ Voor 8% gewijzigd door Verwijderd op 11-05-2004 15:04 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 25-05 23:56
Er bestaan truukjes om een private method aan te roepen, maar dit kan nooit de bedoeling zijn.

Maareh, ik vind niets terug over een method/property newrow ? :?
De enige 'NewRow' die ik me kan indenken is een public method van een DataTable.

[ Voor 21% gewijzigd door whoami op 11-05-2004 15:16 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 11 mei 2004 @ 15:15:
Er bestaan truukjes om een private method aan te roepen, maar dit kan nooit de bedoeling zijn.

Maareh, ik vind niets terug over een method/property newrow ? :?
De enige 'NewRow' die ik me kan indenken is een public method van een DataTable.
Deze zie je staan als je gebruik maakt van de watch in vs.net.
Wanneer je de dataRow hierin plaatst zie je dat deze een methode newRecord heeft en deze zou ik graag willen gebruiken, want dit is precies de waarde die ik nodig heb, maar deze is dus private.

Wat is dat truukje als ik vragen mag?

  • whoami
  • Registratie: December 2000
  • Laatst online: 25-05 23:56
Verwijderd schreef op 11 mei 2004 @ 15:25:
[...]

Deze zie je staan als je gebruik maakt van de watch in vs.net.
Wanneer je de dataRow hierin plaatst zie je dat deze een methode newRecord heeft en deze zou ik graag willen gebruiken, want dit is precies de waarde die ik nodig heb, maar deze is dus private.
Ik snap nog steeds niet waarom je die waarde nodig hebt?
Wat is dat truukje als ik vragen mag?
Die method of property zal wel niet voor niks private zijn. Het is niet de bedoeling om het hele ding te gaan vernaggelen.
Daarbij komt nog dat dat ook geen juiste werking garandeerd.

[ Voor 12% gewijzigd door whoami op 11-05-2004 15:34 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 11 mei 2004 @ 15:29:
[...]

Ik snap nog steeds niet waarom je die waarde nodig hebt?

[...]
Zoals aangegeven maak ik gebruik van DataTable.Select om een bepaalde select uit te voeren. Deze levert een 100 tal hits op. en staat in een datarow.
deze datarow bevat in de private method newrecord de positie in het datagrid.

met deze positie kan ik uitrekenen op welke page de omschrijving zich bevind.
code:
1
2
3
int pagina =newrecord/dg_overzicht.PageSize;
dg_overzicht.CurrentPageIndex = pagina;
VulGrid.VulDataGrid(dt.DefaultView,dg_overzicht);


Nu staat de pagina open waar de omschrijving zich bevind en middels een knop volgende wordt de DataRow met 1 opgehoogd waardoor ik de positie weet van de volgende gevonden item en dan springt hij weer naar de pagina waar deze staat.

Begrijp je een beetje het principe, waar ik naartoe wil?
Pagina: 1