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

[VB.Net] Hoe een un-select uit te voeren op een Combobox

Pagina: 1
Acties:
  • 158 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Bij het initeele vullen van een combobox (winforms application), bind ik een combobox aan een table, aldus:

Visual Basic:
1
2
3
        cbReleaseNumbers.DataSource = dsWorkData.Tables("ReleaseNumbers")
        cbReleaseNumbers.ValueMember = "Release"
        cbReleaseNumbers.DisplayMember = "Release"


Dat werk op zich prima, maar de bovenste optie is automatisch geselecteerd - en ik wil dat het control gevuld word, maar nog niets geselecteerd.

cbReleaseNumbers.SelectedItem = -1 of .SelectedText = "Iets wat sowieso niet voorkomt" helpt niet - het levert hooguit een 'leeg' veld op in de combobox (boven de toegevoegde opties). Het is puur een vormgeving kwestie, ik wil gewoon een combobox waar nog niets in geselecteerd is, en de eerste optie 'zichtbaar' is, zonder dat de optie gehighlight is. Gegoogled, geprobeerd om het comboboxcontrol met een loop te vullen, maakt niet uit. De ge-highlighte text blijft zichtbaar.

Heeft iemand suggesties?

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 07:41
Zelf een combobox schrijven?
Het is puur een vormgeving kwestie, ik wil gewoon een combobox waar nog niets in geselecteerd is, en de eerste optie 'zichtbaar' is, zonder dat de optie gehighlight is
Dit vind ik op zich wel heel raar. Als er iets in een combobox te zien is verwacht ik ook dat de toepassing deze waarde gebruikt. Wat jij wilt bereiken lijkt me heel ongebruiksvriendelijk. Ik ben dus ook niet verbaasd als je dit nergens in .Net of andere 3rd party control gaat vinden.

[edit]
Laat me raden: Je zit in de knoei met de SelectedIndexChanged event?

[ Voor 7% gewijzigd door Vedett. op 20-07-2007 09:29 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Dus een <select value> als eerste optie is geen optie?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
Vedett. - Het lijkt erop dat het een natuurlijke gedraging van de combobox is in Winforms. Ik dacht aan webforms waar een pulldownmenu wel de geselecteerde optie laat zien (bij default de eerste, de bovenste van de lijst, zeg maar), en deze niet highlight (zolang er geen focus op rust).

In winforms toont ie de bovenste ook bij default, maar de text van de optie is gehighlight. In mijn geval is het uberhaupt niet interessant wat er gekozen is, aangezien het een historie is van de vorige releases, en zal het alleen als naslagwerk gebruikt worden door de gebruiker. Het feit dat de option gehighlight is is afleiding op het formulier. Er is blijkbaar geen makkelijke manier om het highlighten uit te zetten. (Misschien met een ander control?)

Vreemd genoeg is het zetten van de focus op een ander control op de pagina niet genoeg - de combobox blijft gehighlight.

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 28-11 11:15

sopsop

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

Wat is de tabindex van die combo?

Als ik een ander control tabindex = 0 meegeef heeft mijn combo geen focus en laat hij gewoon een lege regel zien.

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Je zou het zo kunnen doen:

Maak een eventHandler onder Focus -> Enter

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            BindCombobox();
        }

        public void BindCombobox()
        {
            int[] data = new int[] { 10, 20, 30, 40 };
            comboBox1.DataSource = data;
            comboBox1.Focus();
            
        }

        private void comboBox1_Enter(object sender, EventArgs e)
        {
            SendKeys.Send("{HOME}");
        }
}


Nu stuurt hij een keystroke van de Home knop naar de comboBox zodat hij gedeselecteerd wordt :)

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
SendKeys ieuw. Alle items in de lijst afgaan en op selected = false zetten, helpt dat wellicht?

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Er is geen andere manier.

Let er trouwens op dat je de SendKeys in de eventhandler Enter zet, en vergeet de comboBox1.Focus() niet, anders werkt het niet.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:52
code:
1
combobox.SelectedIndex = -1;

https://fgheysels.github.io/


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Dat weet ik, en gebruik ik ook altijd, maar dat is niet wat hij wil. Hij wil het eerste item tonen zonder dat deze geselecteerd is, who am i.

Anyway wij hebben de UltraComboBox die heeft wat meer properties waarbij dat wel op een normale manier kan :P

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:52
Hm, ok, niet goed gelezen.
Hoedanook, dit is dan geen std gedrag, en dan zal je een custom ctrl moeten schrijven. Maar ik maak me dan wel de bedenking hoe je gaat aangeven of iets geselecteerd is of niet. Als je iets toont, maar het is nie geselecteerd, wat is het dan ? Hoe ga je dat aangeven ? 'Gewoon' highlighten kan alleen als dat control de focus heeft.

https://fgheysels.github.io/


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Hij wilde de combobox louter gebruiken als lijstje volgens mij, verder niks.

Maar 9 van de 10 keer wordt er nooit meer gereageerd in PRG door de TS van een topic, zelfs als ik rond de 10-15 minuten tijd erin gestoken heb om het probleem te testen of op te lossen dus ik twijfel sterk of nog wel langer doorga moeite te doen mensen te helpen in dit subforum. Laatst met die gridview ook al waar die jongen geen waarde in de label kreeg. Tien minuten bezig geweest het programma na te bouwen en te testen, en gewoon niet meer reageren. :| Ik denk dat veel meer users dat vervelend vinden, maar ik maak even van de gelegenheid gebruik dat even te melden.

[ Voor 70% gewijzigd door Mastermind op 21-07-2007 00:28 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Doe dat dan even in Feedback op moderatie binnen de Devschuur en liefst ook met concrete topics erbij :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Voldoet het niet als je de DropDownStyle instelt op DropDownList? Dan ziet het er zo uit bij mij: Afbeeldingslocatie: http://manuel.filternet.nl/GoT/dropdown.png

En als ik de TabIndex omdraai, dus de Button index 0 en de ComboBox index 1 ziet het er zo uit: Afbeeldingslocatie: http://manuel.filternet.nl/GoT/dropdown2.png

[ Voor 32% gewijzigd door riezebosch op 21-07-2007 01:08 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Topicstarter
Dank Mastermind ( _/-\o_ ) - dat doet precies waar ik naar op zoek was. Makkelijk en overzichtelijke oplossing (alhoewel er vast mensen zijn die gruwen van het gebruik van sendkeys. (Weer wat geleerd! :))

Ik had het er nog met een collega over, en die meldde (terecht) dat het highlighten een default behaviour is voor windows (klopt ook wel). Hiermee kan ik iig een combobox gebruiken om de gehele historie te laten zien zonder dat het veel ruimte inneemt op het formulier. ;)

Ik zal ook eens kijken of dat ultracombobox control bruikbaar is - dank voor de suggestie.

[ Voor 139% gewijzigd door Verwijderd op 21-07-2007 11:38 . Reden: Rewording, typoes, etc. ;D ]


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Hey no problem! ;)

Soms is er geen andere oplossing dan een SendKeys.
Bij een MaskedTextBox die "nnnn" accepteert, numerieke waarden dus, heb je bijvoorbeeld het probleem dat als je op zo'n lege maskedtextbox klikt, hij de cursor zet op de plek waar je selecteert. Dat wil je niet, de cursor moet vooraanstaan. Oplossing: Een SendKeys "{HOME}" bij de Click.

Of als je bij een KeyPressed wil dat hij ook een TAB doet als je op Enter druk, een SendKeys "{TAB}" sturen. 't Maakt de GUI soms een stuk gebruikersvriendelijker. :)
BtM909 schreef op zaterdag 21 juli 2007 @ 00:30:
Doe dat dan even in Feedback op moderatie binnen de Devschuur en liefst ook met concrete topics erbij :)
Hmm het valt ook wel mee als ik zo terug kijk.

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Mastermind schreef op zaterdag 21 juli 2007 @ 12:55:
Hey no problem! ;)

Soms is er geen andere oplossing dan een SendKeys.
Bij een MaskedTextBox die "nnnn" accepteert, numerieke waarden dus, heb je bijvoorbeeld het probleem dat als je op zo'n lege maskedtextbox klikt, hij de cursor zet op de plek waar je selecteert. Dat wil je niet, de cursor moet vooraanstaan. Oplossing: Een SendKeys "{HOME}" bij de Click.

Of als je bij een KeyPressed wil dat hij ook een TAB doet als je op Enter druk, een SendKeys "{TAB}" sturen. 't Maakt de GUI soms een stuk gebruikersvriendelijker. :)
Beide voorbeelde zijn volgens mij echt beter zonder SendKeys te bereiken. Als je bijvoorbeeld bij een keypress enter een tab wil doen (ik neem aan dat je een andere veld wil selecteren) kan je control.setFocus() doen.

Verwijderd

Verwijderd schreef op vrijdag 20 juli 2007 @ 09:16:
cbReleaseNumbers.SelectedItem = -1 of .SelectedText = "Iets wat sowieso niet voorkomt" helpt niet - het levert hooguit een 'leeg' veld op in de combobox (boven de toegevoegde opties).
Ik ben al heel de middag bezig om op MSDN, Google en GOT een oplossing te vinden voor iets wat ik nu in dit topic tegenkom en wat de TS blijkbaar wel voor elkaar heeft gekregen, nl. het het tonen van een leeg veld (ipv de eerste keuze) in een combobox die gebind is aan een collectie objecten.

Hier: BUG: ComboBox does not clear when you set SelectedIndex to -1 staat nl. dat dit een bug is in het .Net 1.0 framework (ik gebruik overigens 1.1) en dat je de toekenning Combobox.SelectedIndex = -1 een keer zou moeten herhalen om dit te omzeilen. Hoe dan ook, ik krijg het met geen mogelijkheid voor elkaar. Dus ik vraag me af hoe de TS (of iemand anders) dit wel voor elkaar krijgt.

Overigens gebeurd de toekenning van SelectedIndex = -1 bij mij in de Constructor van het Form na het binden van de data. Als ik die toekenning in welk ander event dan ook (dat vuurt na de Form.Show()) plaatst dan wordt er een Exception gegooid (bij mij is dat OutOfMemoryExcepction).

Shoot!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
De TS heeft het, zover ik begrijp, uiteindelijk ook niet voor elkaar gekregen dat er wel een item geselecteerd is. Wat hij uiteindelijk bereikt had, imho niet een hele mooie oplossing, was dat er wel een item geselecteerd is maar het control niet de focus heeft/het geselecteerde item niet gehighlight is. Ik weet niet hoe het met XP zit, maar zoals de screenshots in mijn eerdere post is het onder Vista al standaard zo als het control niet de eerste tabindex heeft of als je de dropdownstyle anders instelt.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Ontspannen
  • Registratie: Februari 2007
  • Laatst online: 11-10 10:33
Verwijderd schreef op woensdag 05 september 2007 @ 14:08:Ik ben al heel de middag bezig om op MSDN, Google en GOT een oplossing te vinden voor iets wat ik nu in dit topic tegenkom en wat de TS blijkbaar wel voor elkaar heeft gekregen, nl. het het tonen van een leeg veld (ipv de eerste keuze) in een combobox die gebind is aan een collectie objecten.
Het tonen van een leeg veld, ipv de eerste keuze... Null toewijzen aan de teksteigenschap van de combobox?

Verwijderd

Ontspannen schreef op woensdag 05 september 2007 @ 19:24:
[...]
Het tonen van een leeg veld, ipv de eerste keuze... Null toewijzen aan de teksteigenschap van de combobox?
Het nadeel is dat alles wat je toewijst aan de SelectedIndex, SelectedValue, SelectedItem, Text om ervoor te zorgen dat het eerste element niet wordt getoond, perfect werkt voor dat Form.Show() wordt aangeroepen. (Je ziet nl in een Watch ook dat je SelectedIndex bijvoorbeeld -1 is voor de Form.Show() en 0 wordt na de Form.Show())

Dit betekent dus dat het zetten van het eerste item gebeurd in code van het .NET framework. Helaas lukt het niet om iets aan deze properties toe te wijzen na Form.Show() (bijvoorbeeld in de Form_Load) omdat er dan een exceptie wordt gegooid (in mijn geval is dat OutOfMemory).

Edit:
Volgens mij is de enige oplossing om een leeg record mee te binden aan de combobox, maar wij gebruiken hier een collectie met objecten (die IBindingList implementeren) en dus zou je op de eerste positie van de List een 'leeg' object moeten plaatsen.

Dit lijkt me alleen nogal bewerkelijk voor zoiets simpels, ik neem aan dat er meer programmeurs zijn over de hele wereld die niet willen dat het eerste item getoond wordt. Het heeft uiteindelijk voor gevolg dat het eerste item altijd te zien is en een gebruiker wellicht niet de neiging heeft om een item in de combobox te wisselen. Waardoor er geen SelectedIndexChange event optreedt en waardoor de uiteindelijke property in het betreffende business object niet gezet wordt.

PFFFF!

(Ik zit me overigens wel te bedenken om, als dat property niet gezet is (null is), het property sowieso gelijk te maken aan het eerste item van de combobox. Maar echt gebruikersvriendelijk lijkt me dat niet.)

[ Voor 35% gewijzigd door Verwijderd op 06-09-2007 09:04 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Verwijderd schreef op donderdag 06 september 2007 @ 08:56:
Waardoor er geen SelectedIndexChange event optreedt en waardoor de uiteindelijke property in het betreffende business object niet gezet wordt.
Dan moet je zorgen dat het zetten van de properties in je BO niet afhankelijk is van dat event.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Heel vreemd. Als je zelf in de Form_Load met een for-loop items toevoegd aan de combobox is er standaard geen item geselecteerd, maar zodra je het via binding doet wél...

Dit werkt bij mij:
C#:
1
2
3
4
5
6
7
8
9
private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 15; i++)
    {
        bindingSource1.Add("asdf" + i);
    }

    comboBox1.SelectedItem = null;
}

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

riezebosch schreef op donderdag 06 september 2007 @ 09:59:
Heel vreemd. Als je zelf in de Form_Load met een for-loop items toevoegd aan de combobox is er standaard geen item geselecteerd, maar zodra je het via binding doet wél...
[/quote]

Inderdaad, dat zeggen ze ook MSDN. Maar om nu voor elke combobox een for-loop te maken (of een generieke methode hoe dan ook) vind ik overkill voor zoiets simpels. Dat is juist het voordeel van binding.
farlane schreef op donderdag 06 september 2007 @ 09:53:
[...]
Dan moet je zorgen dat het zetten van de properties in je BO niet afhankelijk is van dat event.
En dat heb ik nu uiteindelijk maar gedaan. In de constructor wordt gekeken of dat property van het business object een waarde heeft en wordt die gezet in de combobox (dat werkt dan weer wel) anders wordt het eerste item uit de combobox toegekend aan de property van het business object.

Het is alleen minder gebruiksvriendelijk, omdat een gebruiker van de betreffende applicatie gewend is om iets te selecteren en in de nieuwe versie is dat al geselecteerd. Soms wil je dit gedrag graag en dan vind ik het raar dat het niet in het .NET framework zit. (Overigens is dat 1.1, wellicht dat het wel ondersteund wordt in 2.0 daar heb ik niet naar gekeken)

In ieder geval toch bedankt allemaal.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Verwijderd schreef op donderdag 06 september 2007 @ 10:09:
Inderdaad, dat zeggen ze ook MSDN. Maar om nu voor elke combobox een for-loop te maken (of een generieke methode hoe dan ook) vind ik overkill voor zoiets simpels. Dat is juist het voordeel van binding.
[...]
Het ging me ook meer om de essentie. Waarschijnlijk als je kunt inprikken op een event ná de binding en daar de SelectedItem op null zet zal het werken.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1