Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] SelectedValueChanged eventhandler is maf

Pagina: 1
Acties:

  • siepeltjuh
  • Registratie: Maart 2003
  • Niet online
Tijdens het starten en stoppen van de applicatie die ik maak heb ik problemen met de eventhandler SelectedValueChanged van een combobox.

Via de designer een combo box gemaakt en gehangen aan een adapter werkt prima.

Als ik vervolgens die eventhandler gebruik:
code:
1
SeasonSelector.SelectedValueChanged += new System.EventHandler(this.SeasonSelectorChanged);


Dan krijg ik bij het opstarten direct al een error, over een niet bestaande nullreference toestand. Die error komt voor binnen de methode die geschopt wordt door de eventhandler.

Dit heb ik opgelost door if (SeasonSelector.Items.Count != 0) te gebruiken voor de gehele methode. Hieruit bleek dat het event al getriggered werd als er nog niets in de combobox stond.

Echter nu kom ik opnieuw een error tegen, maar dan bij het afsluiten van de applicatie.

Hij geeft dan aan dat SeasonSelector.Items.Count de waarde 2 heeft
Maar in de regel er na krijgt ik een error omdat SeasonSelector.SelectedValue leeg is. ?! dan kan de count toch ook niet op 2 staan, immers word de app gesloten en de selected value niet aangepast.

Nu is mijn vraag. Waarom gaat hij bij de start en bij het afsluiten dit event triggeren? In de lijst met events kan ik niet een event vinden die wel getriggert wordt bij een andere selectie, maar niet bij het starten / sluiten van de app.

Hoe voorkom ik dat hij bij het afsluiten het event triggert danwel hoe krijg ik een goeie check die voorkomt dat ie die error geeft.

Can`t live without the mods


  • Ruudjah
  • Registratie: November 1999
  • Laatst online: 06-09 20:58

Ruudjah

2022

DIT BERICHT IS PREVENTIEF VERWIJDERD DOOR DE GEBRUIKER

[ Voor 119% gewijzigd door Ruudjah op 01-12-2009 22:15 ]

TweakBlog


  • siepeltjuh
  • Registratie: Maart 2003
  • Niet online
De eventhandler wordt na InitializeComponent gekoppelt.
De eerste null reference exception krijg ik doordat de box nog niet gevuld is, maar het event wel al geraised word.Dat is tijdens het opstarten. Dit heb ik opgelost door de eventhandler pas te koppelen na de dataset <- adapter koppeling:
code:
1
2
this.seasonTableAdapter.Fill(this.dataDataSet.Season);
this.SeasonSelector.SelectedValueChanged += new System.EventHandler (this.SeasonSelectorChanged);


So far so good. Maar waarom wordt het event getriggerd bij het afsluiten?

Het afsluiten gaat gewoon via een menu item die een methode aanroept waar alleen application.close() in staat. Geen aparte zaken die nog gesaved of gesloten of wat dan ook worden.

Het lijkt erop dat hij dus bij het afsluiten bepaalde componenten leegt en daarbij het event triggert, maar waarom. Doet moet helemaal niet.

Ik los het nu op met een simpele controle op de null reference omdat dit me teveel tijd kost om uit te zoeken, maar het blijft niet netjes, en mijn code gaat dan ook vol staan met dergelijke checks, omdat ik veel van die boxen gebruik
code:
1
if (SeasonSelector.SelectedValue != null)

Can`t live without the mods


  • Ruudjah
  • Registratie: November 1999
  • Laatst online: 06-09 20:58

Ruudjah

2022

DIT BERICHT IS PREVENTIEF VERWIJDERD DOOR DE GEBRUIKER

[ Voor 112% gewijzigd door Ruudjah op 01-12-2009 22:15 ]

TweakBlog


  • siepeltjuh
  • Registratie: Maart 2003
  • Niet online
Bedankt voor de link, maar daar staat niet echt iets wat k nog niet wist.
Het gaat daar vooral om het opstart stukje, op die site wordt ook vertelt dat je de eventhandler pas moet binden nadat de inhoud geladen is omdat ie anders x keer getriggert wordt.

Dat heb ik nu dus opgelost, blijft het afsluiten over. Ik kan nergens in de designer code brij iets vinden wat dit verklaart. Er wordt verder niets gedaan bij het afsluiten met de combobox of zijn bindingsource waardoor de data en dus de selector.value gewijzigd zouden kunnen worden.

Ik begrijp dat er genoeg situaties zijn waarbij je als de gebruiker op het kruisje ramt de boel netjes wilt afslutien en evt handlers nog wilt kunen raisen, maar ook zijn er genoeg situaties dat je dat niet wil, waaorm kan je dat dan niet ergens aan of uit zetten in VS 2008 of whatever voor property.

Can`t live without the mods


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-11 22:54
Welke fout krijg je bij het afsluiten ?
Wat zegt de stacktrace ?

Desnoods kan je nog altijd bij het afsluiten van je applicatie die eventhandler loskoppelen van het event.

https://fgheysels.github.io/


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Wat voor adapter gebruik je?

Waarschijnlijk is het adapter object null voordat de combobox gedisposed is bij het closen.
Als dat zo is, is dit een oplossing:
C#:
1
2
3
4
5
6
7
private void SeasonSelectorChanged(object sender, EventArgs e)
{
   if (((ComboBox)sender).DataSource != null)
   {
        // je code
   }
}

Beter is te zorgen dat die adapter niet null wordt bij het closen.

  • siepeltjuh
  • Registratie: Maart 2003
  • Niet online
Ik heb zoals hierboven aangegeven ongeveer dezelfde code gebruikt als Mastermind om het op te lossen. @whoami het gaat om een null reference error, wat ook hierboven staat.

Inmiddels ben ik er ook achter dat hij het event raised omdat de databinding gedisposed wordt.
Erg vervelend gedrag, hij zou dan ook mijn inziens eerst die combobox + eventhandler moeten wegmikken voordat hij de rest wegmikt. Althans dat is in mijn situatie de bedoeling, snap alleen niet dat je dat neit zou kunnen aangeven, als jezelf te veel gaat wroeten in de vs form gegenereerde code wordt het ook niet beter met de designer :(

Iig begrijip ik dat er niet een 'hidden' vinkje kunt aanpassen in VS2008 waarmee je dat gedrag kan beinvloeden.

De oplossing met een if statement om te checken op een null reference is dan ook de beste oplossing.

Can`t live without the mods


  • Piels
  • Registratie: Maart 2001
  • Laatst online: 27-11 14:22
Kun je niet, als je DataSource gedisposed wordt, je event unreggen?

C#:
1
this.SeasonSelector.SelectedValueChanged += new System.EventHandler (this.SeasonSelectorChanged);


En auto generated code, is niet om in te "wroeten".

Windows Phone Apps: Belstatus, Pinautomaten


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Probeer eens SelectedIndexChanged event eens. Deze wordt pas getriggert als iemand ook daadwerkelijk op een item heeft geklikt of een item programmatisch is gezet.

Daarnaast SelectedValueChanged wordt ook afgevuurt als iemand zijn selectie ongedaan maakt! Je mag dan wel twee items in je lijst hebben staan, maar geen is dan geselecteerd. Echter via SelectedItems.Count kun je eenvoudiog achterhalen hoeveel items daadwerkelijk zijn geselecteerd.

If it isn't broken, fix it until it is..


  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 26-11 15:50
Als je alleen het event wilt krijgen als de user de selectie wijzigt, kun je het event SelectionChangeCommitted gebruiken. Quote van MSDN:
SelectionChangeCommitted is raised only when the user changes the combo box selection. Do not use SelectedIndexChanged or SelectedValueChanged to capture user changes, because those events are also raised when the selection changes programmatically.

You can create a SelectionChangeCommitted event handler to provide special handling for the ComboBox when the user changes the selected item in the list.

Whatever


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
^^

Wat Niemand_Anders zegt. Zie hier in de code op mijn werk dat ik overal SelectedIndexChanged heb staan :) (Had zelf dat probleem namelijk niet terwijl ik wel veel comboboxes gebruik ;))

  • barfieldmv
  • Registratie: Maart 2004
  • Laatst online: 10-10 12:36
siepeltjuh schreef op woensdag 05 december 2007 @ 19:36:
Bedankt voor de link, maar daar staat niet echt iets wat k nog niet wist.
Het gaat daar vooral om het opstart stukje, op die site wordt ook vertelt dat je de eventhandler pas moet binden nadat de inhoud geladen is omdat ie anders x keer getriggert wordt.

Dat heb ik nu dus opgelost, blijft het afsluiten over. Ik kan nergens in de designer code brij iets vinden wat dit verklaart. Er wordt verder niets gedaan bij het afsluiten met de combobox of zijn bindingsource waardoor de data en dus de selector.value gewijzigd zouden kunnen worden.

Ik begrijp dat er genoeg situaties zijn waarbij je als de gebruiker op het kruisje ramt de boel netjes wilt afslutien en evt handlers nog wilt kunen raisen, maar ook zijn er genoeg situaties dat je dat niet wil, waaorm kan je dat dan niet ergens aan of uit zetten in VS 2008 of whatever voor property.
Met het aanmaken van je eventhandler ben je te vroeg.
Met het verwijderen van je eventhandler ben je te laat.

maw.
Maak de eventhandler pas aan als je component goed gevuld bestaat
Verwijder de eventhandler! voordat je component verwijderd word.

De if count == 0 of object == null checks werken altijd ook.
Pagina: 1