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

[VB.Net] Combobox SelectedItem vs Text

Pagina: 1
Acties:

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
In VB.Net was het in vroegere versies zo dat je om de geselecteerde waarde van een ComboBox te krijgen, je dit diende te gebruiken:
Visual Basic .NET:
1
cboLijstje.SelectedItem
Als ik dat vergelijk met de huidige versies (als ik me niet vergis is het zo sinds Visual Studio 2008, maar zeker ben ik niet), dan krijg ik met
Visual Basic .NET:
1
cboLijstje.Text
net hetzelfde.

Ok, niet volledig hetzelfde, want SelectedItem is van type Object en kan ook Nothing zijn, terwijl Text een String is.
De facto, komt het volgens mij echter op hetzelfde neer (en is Text net wat minder werk):
Visual Basic .NET:
1
2
3
4
5
If Not IsNothing(cboLijstje.SelectedItem) Then
    strReturnValue = cboLijstje.SelectedItem.ToString()
Else
    strReturnValue = ""
End If
tegenover
Visual Basic .NET:
1
strReturnValue = cboLijstje.Text
MSDN geeft me geen uitsluitsel:
ComboBox.SelectedItem Property: The object that is the currently selected item or Nothing if there is no currently selected item.
ComboBox.Text Property:The text associated with this control.
Bij de remarks van de Text-property lees ik het volgende:
Setting the Text property to Nothing or an empty string ("") sets the SelectedIndex to -1. Setting the Text property to a value that is in the Items collection sets the SelectedIndex to the index of that item. Setting the Text property to a value that is not in the collection leaves the SelectedIndex unchanged.
Toch grijp ik om een of andere reden (waarschijnlijk "ouderdom" <+:) )nog steeds gemakkelijker naar SelectedItem... als ik de uitleg op MSDN correct interpreteer, dan spreekt daaruit geen voorkeur (of eerder nog voor Text voor de situatie zoals ik ze hier schets).

Mag ik even vragen hoe jullie het interpreteren? thx!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 23-11 16:52

Haan

dotnetter

Ik moet eerlijk bekennen dat ik die Text property helemaal niet kende.. Maar die is verrekte handig voor het zetten van een specifieke waarde obv het label. Dat heb ik tot nu toe gedaan door eerst de index op te zoeken met FindString, en dan de index te zetten (wat ook precies het voorbeeld van die functie op MSDN is..).
Maar volgens mij is er inderdaad niet echt een groot verschil tussen de twee.
Overigens is er ook nog de SelectedText property om het helemaal overzichtelijk te houden :P

Alle genoemde properties bestaan trouwens al sinds .NET 1.1 (VS2003) (kies bovenin voor 'other versions' om te zien welke framework versies beschikbaar zijn)

Kater? Eerst water, de rest komt later


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
edeboeck schreef op dinsdag 27 november 2012 @ 19:17:
Mag ik even vragen hoe jullie het interpreteren? thx!
Precies zoals 't er staat; een SelectedItem geeft een Object, (Selected)Text geeft ... text:

Uit de losse pols:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
    class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        //...rest 

        public override string ToString()
        {
            return LastName + ", " + FirstName;
        }
    }



Als je nu je dropdown vult met Persons dan krijg je bij SelectedText bijv. "Janssen, Rob" terug:
C#:
1
var name = myDropDown.SelectedText;

Console.WriteLine(name);
Een SelectedItem (if any) kun je "terug"casten naar een object:
C#:
1
2
var customer = (Person)myDropDown.SelectedItem
Console.WriteLine(customer.id);


Je object moet (uit m'n hoofd) de ToString implementeren/overriden om getoond te kunnen worden. In dit geval zie je in de dropdown dus "<lastname>, <firstname>".

Disclaimer: details kunnen verschillen; heb dit even vlug tussen-de-soep-en-de-aardappelen door gepost :P

[ Voor 27% gewijzigd door RobIII op 27-11-2012 21:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
Haan schreef op dinsdag 27 november 2012 @ 20:16:
(...)
Alle genoemde properties bestaan trouwens al sinds .NET 1.1 (VS2003) (kies bovenin voor 'other versions' om te zien welke framework versies beschikbaar zijn)
Sorry, ik was even te lui om mijn uitspraak te verifiëren :o ... het zal dus toch in vergelijking met VB 6 geweest zijn.
RobIII schreef op dinsdag 27 november 2012 @ 20:19:
[...]
Precies zoals 't er staat; een SelectedItem geeft een Object, (Selected)Text geeft ... text:
(...)
Je object moet (uit m'n hoofd) de ToString implementeren/overriden om getoond te kunnen worden. In dit geval zie je in de dropdown dus "<lastname>, <firstname>".

Disclaimer: details kunnen verschillen; heb dit even vlug tussen-de-soep-en-de-aardappelen door gepost :P
Ok, tot zover was ik mee... maar ik bedoelde eigenlijk of er naar praktisch gebruik een te verkiezen was boven de ander.... ik heb de indruk dat dat dus niet zo is.
Even als aanvulling voor een "siesjaurper" (8> : Object is een gegevenstype in VB.Net en heeft de ToString() methode al geïmplementeerd.
kwam zelf van C++ vooraleer ik aan VB, en later VB.Net, begon en af en toe voelde dat wel eens raar aan ;)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
edeboeck schreef op dinsdag 27 november 2012 @ 20:29:
Ok, tot zover was ik mee... maar ik bedoelde eigenlijk of er naar praktisch gebruik een te verkiezen was boven de ander.... ik heb de indruk dat dat dus niet zo is.
Tuurlijk wel; wat als er twee "Janssen, Rob"'s zijn? Dan is 't wel handig als je (bijv.) op het Id nog een onderscheid kunt maken (los van 't feit dat de gebruiker problemen zal hebben onderscheid te maken, maar wie weet is 't SelectedItem wel geset via een omweg (zeg, een wizard ofzo)).
edeboeck schreef op dinsdag 27 november 2012 @ 20:29:
Even als aanvulling voor een "siesjaurper" (8> : Object is een gegevenstype in VB.Net en heeft de ToString() methode al geïmplementeerd.
Da's leuk, maar dan staat je combobox vol met "Person Person Person" oid. (en dat geldt ook voor een vee-bee'er) ;) Hoe moet de combobox anders weten welk property (bijvoorbeeld) weergegeven moet worden?
(** Overigens kun je dat wel specificeren als je wil door de DisplayMember en ValueMember te specificeren, zometeen meer daarover)

Even wat concreter (wel C#, maar da's puur syntax verschil):
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = new List<Person>()
            {
                new Person() { Id = 123, FirstName = "Rob", LastName = "Janssen"},
                new Person() { Id = 456, FirstName = "Bill", LastName = "Gates"},
                new Person() { Id = 789, FirstName = "Bill", LastName = "Clinton"}
            };
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Console.WriteLine(comboBox1.Text);
            Console.WriteLine(comboBox1.SelectedItem.GetType());
            Console.WriteLine(((Person)comboBox1.SelectedItem).Id);
        }
    }

    class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        //...rest 

        public override string ToString()
        {
            return LastName + ", " + FirstName;
        }
    }
}

Bij 't selecteren van een item in de combobox krijg je nu (bijvoorbeeld) als output:
Gates, Bill
WindowsFormsApplication1.Person
456


Als je ToString() niet implementeerd (en je de display/value member(s) niet specificeert, zie ** hierboven) ziet je dropdown er zo uit:
Afbeeldingslocatie: http://tweakers.net/ext/f/oFgfi3HI1y5UNGZqYtXKRZYy/full.png
Niet heel erg praktisch :Y) :+

Ikzelf ben niet zo weg van 't gebruik van de DisplayMember en ValueMember property (again; zie **) omdat bij refactoren er kans is dat de zooi breekt omdat je de members als string definieert. Vaak gebruik ik een specifiek "wrapper"-type voor dropdown items a-la zoiets:
C#:
1
2
3
4
5
6
7
8
9
10
11
class PersonComboboxItem {
    public Person { get; private set; }

    public PersonComboboxItem (Person person) {
        this.Person = person;
    }

    public override string ToString() {
        return this.Person.LastName + ", " + this.Person.FirstName;
    }
}

Dergelijke dingen doe ik bijvoorbeeld ook met ListviewItems waar ik dan een bepaald object erin mik en het ListviewItem weet dan meteen welk property (oid) in welke subitems (kort door de bocht: kolom) getoond moet worden.

De ToString is dan specifiek (en zo hoort 't) een verantwoordelijkheid van de WhateverComboboxItem; je wil (zoals ik eerder wat kort door de bocht postte) natuurlijk niet de ToString overriden in Person zélf enkel zodat 't weergegeven wordt zoals je wil in een dropdown.

[ Voor 94% gewijzigd door RobIII op 27-11-2012 21:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
RobIII schreef op dinsdag 27 november 2012 @ 20:33:
[...]

Tuurlijk wel; wat als er twee "Janssen, Rob"'s zijn? Dan is 't wel handig als je (bijv.) op het Id nog een onderscheid kunt maken (los van 't feit dat de gebruiker problemen zal hebben onderscheid te maken, maar wie weet is 't SelectedItem wel geset via een omweg (zeg, een wizard ofzo)).
Ik heb me onduidelijk uitgedrukt: ik bedoelde voor het uitlezen en tonen van de waarde die te zien is (dus los van het hele DisplayMember en ValueMember verhaal).
[...]

Da's leuk, maar dan staat je combobox vol met "Person Person Person" oid. (en dat geldt ook voor een vee-bee'er) ;) Hoe moet de combobox anders weten welk property (bijvoorbeeld) weergegeven moet worden?
(** Overigens kun je dat wel specificeren als je wil door de DisplayMember en ValueMember te specificeren)

Even wat concreter (wel C#, maar da's puur syntax verschil):
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = new List<Person>()
            {
                new Person() { Id = 123, FirstName = "Rob", LastName = "Janssen"},
                new Person() { Id = 456, FirstName = "Bill", LastName = "Gates"},
                new Person() { Id = 789, FirstName = "Bill", LastName = "Clinton"}
            };
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Console.WriteLine(comboBox1.Text);
            Console.WriteLine(comboBox1.SelectedItem.GetType());
            Console.WriteLine(((Person)comboBox1.SelectedItem).Id);
        }
    }

    class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        //...rest 

        public override string ToString()
        {
            return FirstName + ", " + LastName;
        }
    }
}

Bij 't selecteren van een item in de combobox krijg je nu (bijvoorbeeld) als output:
Bill, Gates
WindowsFormsApplication1.Person
456


Als je ToString() niet implementeerd (en je de display/value member(s) niet specificeert, zie ** hierboven) ziet je dropdown er zo uit:
[afbeelding]
Niet heel erg praktisch :Y) :+

Ikzelf ben niet zo weg van 't gebruik van de DisplayMember en ValueMember property (again; zie **) omdat bij refactoren er kans is dat de zooi breekt omdat je de members als string definieert. Vaak gebruik ik een specifiek "wrapper"-type voor dropdown members a-la zoiets:
C#:
1
2
3
4
5
6
7
8
9
10
11
class PersonComboboxItem {
    public Person { get; private set; }

    public PersonComboboxItem (Person person) {
        this.Person = person;
    }

    public override string ToString() {
        return this.Person.FirstName + ", " + this.Person.LastName;
    }
}

Dergelijke dingen doe ik bijvoorbeeld ook met ListviewItems waar ik dan een bepaald object erin mik en het ListviewItem weet dan meteen welk property (oid) in welke subitems getoond moet worden.
Je (mooie) voorbeelden maken me duidelijk dat er wel nog wat aan mijn TS schortte (bedankt trouwens voor dat "wrapper"-idee!). Het ging eigenlijk over een heel basic situatie waarin verschillende Strings in de Listbox staan... waar ik wel van uitging, maar wat jullie natuurlijk niet konden weten... |:(
* edeboeck moet volgende keer wat duidelijker uitleggen

Dus als afsluiter en bewaarder voor het nageslacht :+ :
Stel dat we een listbox hebben met daarin enkel strings (en waarvoor dus geen Display-/ValueMember gespecifieerd is)... maakt het dan uit of we de property SelectedItem (dat we dan wel nog moeten converteren naar een String) of Text gebruiken (ik bedoel niet naar effect - want dat zal hetzelfde zijn als we die conversie doen - maar naar de geest van de properties)?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik zou, maar zo anaal ben ik :+, voor (voornamelijk) consistentie de SelectedItem blijven gebruiken, ook voor strings. Als je later zou besluiten alsnog (zeg) persons in de combobox te gooien dan zoek je je iig niet suf bij een bug bij 't wijzigen van de selectie naar de oorzaak omdat de cast niet zal lukken :) (Then again; je zult toch alle of de meeste code die met die combobox te maken heeft moeten nalopen).

[ Voor 24% gewijzigd door RobIII op 27-11-2012 21:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 21:57

Mavamaarten

Omdat het kan!

Voor zover ik weet is Text de tekst die er in de combobox getypt is (en dus niet per sé een item is dit in je collectie zit)
Afbeeldingslocatie: http://i.imgur.com/BERrx.png

SelectedItem is de item die selected is, Text is de tekst die er op de control zelf komt.
In het geval van hierboven zal SelectedItem nothing weergeven, en text "tekst hierzow".

Vaak is Text gelijk aan SelectedItem omdat de tekst op de control de tekst van je item weergeeft bij aanklikken. Dit is altijd zo als je combobox ingesteld staat op DropDownList, anders kan Text ook iets anders zijn dan SelectedItem.

[ Voor 11% gewijzigd door Mavamaarten op 27-11-2012 21:50 ]

Android developer & dürüm-liefhebber


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Mavamaarten schreef op dinsdag 27 november 2012 @ 21:49:
Vaak is Text gelijk aan SelectedItem omdat de tekst op de control de tekst van je item weergeeft bij aanklikken. Dit is altijd zo als je combobox ingesteld staat op DropDownList, anders kan Text ook iets anders zijn dan SelectedItem.
Klopt; helemaal gelijk (en my bad). Ik werk doorgaans in 9 v.d. 10 gevallen met een DropDownList en dan gaat mijn verhaaltje wel (aardig :P ) op. Maar dit is wel inderdaad een flinke omissie mijnerzijds :X O-)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 20-11 12:23

edeboeck

mie noow noooothing ...

Topicstarter
RobIII schreef op dinsdag 27 november 2012 @ 21:51:
[...]

Klopt; helemaal gelijk (en my bad). Ik werk doorgaans in 9 v.d. 10 gevallen met een DropDownList en dan gaat mijn verhaaltje wel (aardig :P ) op. Maar dit is wel inderdaad een flinke omissie mijnerzijds :X O-)
Idem dito hier omdat ik de laatste keer dat ik hem niet instelde op DropDownList zo ongeveer een jaar of 10 geleden moet zijn.
Mavamaarten schreef op dinsdag 27 november 2012 @ 21:49:
Voor zover ik weet is Text de tekst die er in de combobox getypt is (en dus niet per sé een item is dit in je collectie zit)
[afbeelding]

SelectedItem is de item die selected is, Text is de tekst die er op de control zelf komt.
In het geval van hierboven zal SelectedItem nothing weergeven, en text "tekst hierzow".
En blijkbaar toch ook na mijn aanpassing nog niet duidelijk genoeg geformuleerd 8)7
* edeboeck had blijkbaar gisteren zijn dagje niet om iets duidelijk geformuleerd te krijgen
Het is correct wat je zegt, maar het geval waar ik aan dacht, richt zich specifiek naar de SelectedIndexChanged-event handler (waardoor je dus de initiële instelling van Text kwijtspeelt).
Pagina: 1