[C#] listbox hidden variabele

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

  • fdv99
  • Registratie: Mei 2004
  • Laatst online: 01-12 12:21

fdv99

Penguin power

Topicstarter
Ben bezig met het schrijven van een Windows programma in C# in Visual studio 2005. Ben al een tijd aan het prutsen en kom er maar niet uit, terwijl het volgens mij vast een simpel probleem is.

Ik heb een programma met daarin een listbox, deze box wordt door middel van een database query gevuld. De tabel bestaat uit 2 velden, “idnr” en “naam”

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#region Haal de relaties uit de database en plaats ze in de listbox
//SQL Commando cmd1
SqlCommand cmd1 = Conn.CreateCommand();
cmd1.CommandText = "SELECT idnr, naam FROM " + table_Relaties + " WHERE ProjectNr = '" + textBoxOffertenummer.Text + "'";
SqlDataReader rdr1 = cmd1.ExecuteReader();

while (rdr1.Read())
{
    // Haal de waardes uit de datareader en plaats ze in de listbox

    string relatienaam = rdr1.GetString(rdr1.GetOrdinal("naam"));
    listBox1.Items.Add(relatienaam).ToString();
}
#endregion


Dit haalt dus de relatienamen uit de database en plaatst ze in de listbox.

Het probleem is dat ik verder op in het programma de relatie wil gebruiken die de gebruiker heeft geselecteerd, maar dan niet de naam (die de gebruiker heeft geselecteerd) maar het bijbehorende idnr. Ik moet dus ergens een “hidden” waarde bij elk item in de listbox kunnen opgeven zodat ik later kan kijken welke de gebruiker heeft geselecteerd, en daarvan de “hidden” waarde uitlezen.

Ik hoop dat mijn probleem een beetje duidelijk is.

Ik ben bezig geweest om een aparte class aan te maken en met “get” en “set” een variabele op te slaan en later weer uit te kunnen lezen maar ik denk niet dat dit de goede weg is. Dit omdat ik niet van te voren weet natuurlijk welke geselecteerd wordt en dus kan ik nog niks opslaan.

Ik hoop dus dat er een methode is om een extra variabele aan een listbox item te hangen.

  • Daspeed
  • Registratie: Maart 2001
  • Laatst online: 11:37
- Had een listitem geen tag-property?
- Kun je niet overerven van listitem en zelf properties toevoegen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Een ListBox accepteert objecten van het type 'object'. Er is dus niet zoiets als een 'voorgedefinieerd ListItem', en deze heeft dus bijgevolg ook geen 'Tag'.
Wat ik gedaan heb, is m'n eigen 'ListItem' class maken, die ik dan gebruik om items aan een listbox toe te voegen. Bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
public class ListItem
{
   private object _key;
   private string _value;

   ....

   public string override ToString()
   {
        return _value;
   }
}


code:
1
aListBox.Items.Add (new ListItem (3, "bliep"));

https://fgheysels.github.io/


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Je kunt gewoon DisplayMember en ValueMember gebruiken.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
DataSet data = new DataSet();

DataAdapter adapter = new DataAdapter();
adapter.SelectCommand = new SqlCommand("SELECT idnr, naam FROM " + table_Relaties + " WHERE ProjectNr = '" + textBoxOffertenummer.Text + "'");

adapter.Fill(data, table_Relaties);

ListBox box = new ListBox();

box.DisplayMember = "naam";
box.ValueMember = "idnr";

box.DataSource = data.Tables[0];

en dan vervolgens gewoon het SelectedValue property gebruiken om de waarde van idnr eruit te halen.

Als je de ListBox gaat databinden kun je zelfs SelectedItem(s) gebruiken om de onderliggende objecten te kunnen benaderen. Dus als je een DataTable gebruikt krijg je via SelectedItem(s) gewoon een DataRowView terug met daarin de originele waarden.

[ Voor 18% gewijzigd door MTWZZ op 13-03-2007 09:16 ]

Nu met Land Rover Series 3 en Defender 90


  • fdv99
  • Registratie: Mei 2004
  • Laatst online: 01-12 12:21

fdv99

Penguin power

Topicstarter
Bedankt voor de reacties,
whoami schreef op dinsdag 13 maart 2007 @ 08:58:
Een ListBox accepteert objecten van het type 'object'. Er is dus niet zoiets als een 'voorgedefinieerd ListItem', en deze heeft dus bijgevolg ook geen 'Tag'.
Wat ik gedaan heb, is m'n eigen 'ListItem' class maken, die ik dan gebruik om items aan een listbox toe te voegen. Bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
public class ListItem
{
   private object _key;
   private string _value;

   ....

   public string override ToString()
   {
        return _value;
   }
}


code:
1
aListBox.Items.Add (new ListItem (3, "bliep"));
Whoami, ik krijg een foutmelding op "public string overide ToString()"
Krijg de volgende melding:
code:
1
2
Error   1   Member modifier 'override' must precede the member type and name    C:\Documents and Settings\Administrator\Mijn documenten\Visual Studio 2005\Projects\TestListbox\TestListbox\Form1.cs    26  18  TestListbox
Error   2   Class, struct, or interface method must have a return type  C:\Documents and Settings\Administrator\Mijn documenten\Visual Studio 2005\Projects\TestListbox\TestListbox\Form1.cs    26  27  TestListbox
MTWZZ schreef op dinsdag 13 maart 2007 @ 09:08:
en dan vervolgens gewoon het SelectedValue property gebruiken om de waarde van idnr eruit te halen.

Als je de ListBox gaat databinden kun je zelfs SelectedItem(s) gebruiken om de onderliggende objecten te kunnen benaderen. Dus als je een DataTable gebruikt krijg je via SelectedItem(s) gewoon een DataRowView terug met daarin de originele waarden.
Werken de Displaymember en ValueMember ook met de connectie die ik nu heb? Ben er wel een tijd mee aan het klooien geweest maar zoals jij de datatable opbouwd lukt mij niet, ik denk wel dat je SQLDataAdapter (in mijn geval) bedoelde toch? Want anders krijg ik meteen al een foutmelding.
Het lukt me maar niet om met een dataAdapter die listbox (listbox1 in mijn geval) te vullen, ik hoop dat je me nog een beetje verder opweg kan helpen.

  • BM
  • Registratie: September 2001
  • Laatst online: 11:23

BM

Moderator Spielerij
fdv99 schreef op dinsdag 13 maart 2007 @ 12:32:
Bedankt voor de reacties,
[...]
Whoami, ik krijg een foutmelding op "public string overide ToString()"
code:
1
public override string ToString()

;)

Had je ook wel uit de foutmelding kunnen halen, denk ik?

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Ok ik heb nu even een compleet voorbeeldje gemaakt.
Form1.cs
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
46
47
48
49
50
51
52
53
54
55
56
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

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

            SqlConnection connection = new SqlConnection();

            // Vul hieronder je connectionstring in
            connection.ConnectionString = String.Empty;

            SqlCommand selectCommand = connection.CreateCommand();
            selectCommand.CommandText = "SELECT idnr, naam FROM relatieTabel WHERE ProjectNr = @projectNr";
            
            SqlParameter param = new SqlParameter("projectNr", SqlDbType.VarChar);
            param.Value = textBoxOffertenummer.Text.Trim();
            
            selectCommand.Parameters.Add(param);

            SqlDataAdapter adapter = new SqlDataAdapter(selectCommand);

            DataSet data = new DataSet();

            adapter.Fill(data, table_Relaties);

            box.DisplayMember = "naam";
            box.ValueMember = "idnr";

            box.DataSource = data.Tables[table_Relaties];
        }

        private void btnClickMe_Click(object sender, EventArgs e)
        {
            if (box.SelectedIndex == -1)
            {
                MessageBox.Show("Niets geselecteerd");
                return;
            }

            object selectedItem = box.SelectedItem;

            MessageBox.Show("SelectedValue: " + box.SelectedValue + " SelectedItem type: " + selectedItem.GetType().Name);
        }
    }
}


Op je form moet je even een ListBox maken met als naam "box" en dan de code kopieeren.
De code compiled bij mij maar je moet zelf nog even de ConnectionString aanpassen.

offtopic:
Zo dan RobIII? :P

[ Voor 8% gewijzigd door MTWZZ op 13-03-2007 13:41 ]

Nu met Land Rover Series 3 en Defender 90


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
offtopic:
* RobIII mompelt iets over SQL injection

[ Voor 38% gewijzigd door RobIII op 13-03-2007 13:18 ]

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


  • Plopeye
  • Registratie: Maart 2002
  • Laatst online: 13-08 07:00
Ook het hardcoden van je SQL connectionstring is niet echt netjes... die zou ik in een config file zetten... web.config bijvoorbeeld.

Unix is user friendly, it's only selective about his friends.....


  • fdv99
  • Registratie: Mei 2004
  • Laatst online: 01-12 12:21

fdv99

Penguin power

Topicstarter
Super, het werkt!! Bedankt MTWZZ voor het hapklare antwoord. Ik krijg nu netjes het idnr terug als je er op klikt. Eindelijk na 1 week stoeien!!

Alleen nog 1 probleempje, als hij de listbox vult (op deze manier) selecteert hij automatisch het bovenste item, wat dus weer de trigger activeert van indexchanged, en dus het programma vanzelf doorloopt zonder dat de gebruiker iets selecteert. Is het ook mogelijk om op te geven dat als hij de listbox vult hij standaard geen een selecteert?

Moet uitkijken of ik ga het nog leuk vinden ook ;)
BM schreef op dinsdag 13 maart 2007 @ 12:41:
[...]


code:
1
public override string ToString()

;)

Had je ook wel uit de foutmelding kunnen halen, denk ik?
Dit geeft mijn expertise met C# wel aan :>
Pagina: 1