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
Th69: 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); for (int i = 0; i < 30; i++) { listBox1.Items.Add("string object #" + i); } }
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { listBox2.Items.Clear(); foreach (object o in listBox1.SelectedItems) listBox2.Items.Add(o); }
private void button1_Click(object sender, EventArgs e) { savedSelection = new object[listBox2.Items.Count]; listBox2.Items.CopyTo(savedSelection, 0); }
private void button2_Click(object sender, EventArgs e) { if (savedSelection == null) { MessageBox.Show("No data available"); return; } foreach (object o in savedSelection) listBox1.SelectedItems.Add(o); }
private void button3_Click(object sender, EventArgs e) { 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) { lbIn.SelectedItems.Add(obj); } lbOut.BindingContext[lbIn.SelectedItems].ResumeBinding(); lbIn.EndUpdate(); lbOut.EndUpdate(); } } |
mfg nuckey
Moderiert von
Christian 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!