Entwickler-Ecke

WinForms - Setzen der Auswahl in ListBoxen


Nuckey - So 04.09.11 10:50
Titel: Setzen der Auswahl in ListBoxen
ich möchte die auswahl der listbox von "Aussen" setzen.
bisher habe ich 2 möglichkeiten gefunden einmal setselect(index,bool), kann ich aber so nicht verwenden, da die objekte die zur auswahl herangezogen werden sollen, nicht als index vorliegen.

die zweite variante, wäre direkt in die selecteditems liste per Add zu schreiben

Quelltext
1:
listbox.SelectedItems.Add( object);                    

es funzt soweit, frage mich aber ob es noch einen anderen weg gibt um dieses zu bewerkstelligen?
mfg nuckey

Moderiert von user profile iconTh69: Titel geändert.


Kha - So 04.09.11 11:25

Das solltest du uns noch sagen, was dir an Add nicht passt.
Und natürlich liegen die Objekte mit Index vor, nämlich in der ListBox selbst, und darin kann man auch suchen ;) .


pdelvo - So 04.09.11 11:42

Was willst du denn mehr als eine funktionierende Lösung?


Nuckey - So 04.09.11 12:31

kha: ebend nicht ,so wie du denkst !
muss ich doch das ganze weit ausholen.
bin gerade dabei ein steuerelement zu basteln wo 2 listboxen und ein button enthalten sind.
dieses nenne ich selectbox ;)
die aufgabe ist es das in der linken listbox ,eine liste mit objecten (meist strings) zur auswahl dargestellt werden und die ausgewählten elemente rechts angezeigt werden.die elemente die selektiert wurden werden in einer classe mit gespeichert.
um diese was man sich denken kann ,zu laden und bei bedarf die gespeicherten selektierten daten wieder in die linke listbox zu prügeln.
um aber wie kha vorgeschlagen hat, dehn index der listbox selbst zu nutzen ,müsste ich die objecte erst in der listbox suchen um dehn index zubekommen um dann mit setselect zu markieren ,könnte man mit 2-3 objecten machen aber bei 20-30 einträgen,nee is mir bischen zu aufwändig


kann ja sein das es da noch einen weg gibt eleganter,schöööner ;)

is das,das optimum ?

mfg nuckey


stes - So 04.09.11 14:20

Hi,

Ich habe mal probiert dich zu verstehen^^ und ein kleines Beispielprojekt gebastelt. Code für Interaktion:


C#-Quelltext
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:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        private object[] savedSelection;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            // adding some sample data
            for (int i = 0; i < 30; i++)
            {
                listBox1.Items.Add("string object #" + i);
            }
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // clear left box
            listBox2.Items.Clear();
            // adding selected items to right box
            foreach (object o in listBox1.SelectedItems)
                listBox2.Items.Add(o);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // saving
            savedSelection = new object[listBox2.Items.Count];
            listBox2.Items.CopyTo(savedSelection, 0);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // loading
            if (savedSelection == null)
            {
                MessageBox.Show("No data available");
                return;
            }
            // selecting items in left box (right one will be updated
            // automatically)
            foreach (object o in savedSelection)
                listBox1.SelectedItems.Add(o);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // clear
            listBox1.SelectedItems.Clear();
        }
    }
}


Im Anhang das komplette Projekt.

Warum genau möchtest du nicht mit Add arbeiten bzw. was versprichst du dir von einem alternativen Lösungsweg? (betreffende Codezeile: 58)

Gruß
stes


Nuckey - So 04.09.11 14:39

danke erstmal an alle.
ihr missversteht mich,habe nix gegen add ,wollte nur wissen ob es andere lösungswege gibt oder ob es das optimum wäre ;)

nicht mehr und nicht weniger, narf.
bin jetz bei meiner letzen lösung geblieben.

C#-Quelltext
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:
 public Object[] SelectedItems
        {
            get
            {
                _selectedobjlist = new object[lbOut.Items.Count];
              
                 lbOut.Items.CopyTo(_selectedobjlist, 0); 
              
                return _selectedobjlist;
            }

            set
            {
                lbIn.Update();
                lbOut.Update();
                lbOut.BindingContext[lbIn.SelectedItems].SuspendBinding();
                lbOut.DisplayMember = lbIn.DisplayMember;
                lbOut.ValueMember = lbIn.ValueMember;
                lbIn.ClearSelected();

                foreach (object obj in value)     //Danke Stes fürn tip
                {
                    lbIn.SelectedItems.Add(obj);
                }
                //int count = value.Length;
                //for (int x = 0; x < count; x++)
                //{
                //    lbIn.SelectedItems.Add(value[x]); //<-- Hier das was ich meinte (solldas schon alles sein) ;)
                // }
                lbOut.BindingContext[lbIn.SelectedItems].ResumeBinding();
                lbIn.EndUpdate();
                lbOut.EndUpdate();
            }
        }


mfg nuckey

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Th69 - Mo 05.09.11 09:41

Hallo Nuckey,

noch eleganter geht es mittels AddRange (da du ja schon eine Collection übergibst):

C#-Quelltext
1:
lbIn.SelectedItems.AddRange(value);                    

d.h. die eigene for-Schleife entfällt.

Und statt Update() meinst du sicherlich BeginUpdate(), oder?


Nuckey - Sa 24.09.11 18:47

hio th69 :
sry das ich erst jetz antworte.

nein update ist eine eigne funktion ,die aber unteranderem beginupdate enthält.

die addrange macht intern auch nix anderes ,als alles mit einer for schleife einzulesen ;)

diese frage hat sich auch soweit erledigt ;)

danke nochmal

mfg nuckey