Autor Beitrag
Nuckey
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: So 04.09.11 10:50 
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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 11



BeitragVerfasst: So 04.09.11 11:42 
Was willst du denn mehr als eine funktionierende Lösung?
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36
Erhaltene Danke: 6

Win 95, Win XP, Win 7 64-bit
C# (VS 2010, #Develop), Java (eclipse)
BeitragVerfasst: So 04.09.11 14:20 
Hi,

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

ausblenden volle Höhe 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
Einloggen, um Attachments anzusehen!
_________________
"Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann." Joseph Weizenbaum


Zuletzt bearbeitet von stes am So 04.09.11 14:46, insgesamt 1-mal bearbeitet
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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.
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4808
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 05.09.11 09:41 
Hallo Nuckey,

noch eleganter geht es mittels AddRange (da du ja schon eine Collection übergibst):
ausblenden C#-Quelltext
1:
lbIn.SelectedItems.AddRange(value);					

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

Und statt Update() meinst du sicherlich BeginUpdate(), oder?
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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