Laden...

Listbox während Laufzeit Größe verändern

Erstellt von Merkur76 vor 18 Jahren Letzter Beitrag vor 18 Jahren 5.001 Views
Merkur76 Themenstarter:in
104 Beiträge seit 2005
vor 18 Jahren
Listbox während Laufzeit Größe verändern

Hallo!

Mein Problem ist folgendes:

Ich muss eine MultiColumn Listbox zur Laufzeit vergrößern.

Am Anfang ist die MultiColumn Listbox einzeilig, sobald jedoch mehr als
6 Items in der Listbox sind (wird durch Drag&Drop hinzugefügt), soll
die Listbox 2-zeilig werden.

Bisher mein Versuch geht nicht.


private void lstXAchse_DragDrop(object sender, DragEventArgs e)
        {
            ......

            if (lstXAchse.Items.Count > 6)
                lstXAchse.Height = 40;
        }

Kann mir jemand bitte nen Denkanstoß/Hilfe geben?

=) Wir leben alle unter dem gleichen Sternenhimmel, haben aber nicht alle den gleichen Horizont. =)
2.921 Beiträge seit 2005
vor 18 Jahren

Definier mal dein Problem bitte etwas genauer. Hast Du ein Darstellungsproblem an sich (Grafik?) oder geht es um die Textboxen aus denen die MultiColumn-ListBox besteht?

Und was willst du vergrößern, die ListBox, damit richtig angezeigt wird, oder die einzelnen Items in der ListBox? Tritt dabei sonst noch ein Problem auf, dass du lösen müßtest?

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

P
939 Beiträge seit 2003
vor 18 Jahren

Vielleicht lässt der Container (Panel oder sonstiges) nicht genug Raum für Größenänderungen. Dein Steuerelement wird dann am Container-Rand einfach abgeschnitten.

2.921 Beiträge seit 2005
vor 18 Jahren

Wenn man die OnDraw Methode überschreibt, kann man das Ding zu fast allem zwingen, wenn dann die Textboxen immer noch zu klein sein sollten, dann halt scrolling einbauen. geht alles.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Merkur76 Themenstarter:in
104 Beiträge seit 2005
vor 18 Jahren

@dr4gOn76
Also grundsätzlich geht es mir darum, das die einzelnen Items in der ListBox NICHT in der Größe verändert werden.

Nur die Listbox an sich, soll sobald mehr als 6 Items darin aufgenommen wurden, die Größe verändern (quasi zweizeilig werden), damit ich nicht dann automisch eine Scrollbar habe.

Werde das mal mit der OnDraw Methode probieren...

@Pulpapex
Der Container ist groß genug. Es ist noch sehr viel Platz vorhanden.

=) Wir leben alle unter dem gleichen Sternenhimmel, haben aber nicht alle den gleichen Horizont. =)
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Merkur76,

also bei mir geht es und es sollte auch problemlos gehen. Probier mal, ob es mit mehr als 40 geht. Außerdem kannst du testweise mal ListBox.IntegralHeight auf false setzen. Ansonsten könnte es sein, dass 'lstXAchse.Height = 40;' vielleicht gar nicht ausgeführt wird.

Da fällt mir auf: Meinst du mit MultiColumn Listbox eine ListBox mit ListBox.MultiColumn = true? Oder was anderes?

OnDraw o.ä. solltest du dir (erstmal) sparen.

herbivore

Merkur76 Themenstarter:in
104 Beiträge seit 2005
vor 18 Jahren

Hi Herbivore!

Ja, mit MultiColumn Listbox meine ich eine ListBox mit ListBox.MultiColumn = true?

Werde das mit der ListBox.IntegralHeight = false mal auspropieren. Danke!

=) Wir leben alle unter dem gleichen Sternenhimmel, haben aber nicht alle den gleichen Horizont. =)
Merkur76 Themenstarter:in
104 Beiträge seit 2005
vor 18 Jahren
Funktioniert leider noch nicht.

Hallo!

Hab jetzt folgende Sachen ausprobiert:

ListBox.IntegralHeight = false;
lstXAchse.Height = 50; (und auch noch andere Werte)

Leider immer noch kein Erfolg X(

Folgende Einstellungen hat meine Listbox:

DrawMode: OwnerDrawFixed
ItemHeight: 20
MultiColumn: true
Size: 441, 20

Die Listbox sieht am Anfang einzeilig aus, und soll sobald mehr als 6 Items drin sind, zweizeilig werden. Sprich sich verdoppeln.

Führe das ganze im DragDrop-Event aus.
Auch beim Debuggen meldet er keinen Fehler sondern, er zeigt an das lstXAchse.Height = 50, aber am Bildschirm sehe ich etwas anderes.
Er schiebt die Daten immer an dem einzeiligen an und dann bekomme ich auch einen Scrollbalken anstatt wie gewünscht, das es mehrzeilig wird.

OnPaint brachte übrigens auch keinen Erfolg.

=) Wir leben alle unter dem gleichen Sternenhimmel, haben aber nicht alle den gleichen Horizont. =)
P
939 Beiträge seit 2003
vor 18 Jahren

Jetzt fällt es mir auch auf. Es geht gar nicht um mehrere Zeilen, sondern um mehrere Spalten, die mit MultiColumn nicht angezeigt werden! Das kam überhaupt nicht rüber.

Das Problem wird DrawMode.OwnerDrawFixed zusammenhängen. Vielleicht geht dabei irgendetwas schief (wer weiss was du da hinkrakelst 😉 ). Stell es zum Testen mal aus.

Es gibt noch eine ColumnWidth-Eigenschaft. Die sollte jedoch gute Standardwerte liefern. Denke nicht, dass es daran liegt. Aber kannst ja mal ausprobieren ob sich was tut.

Gruss
Pulpapex

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Merkur76,

das kann doch schon fast nicht mehr sein.

Probier doch beim Vergößern auch mal deutlich mehr als 50.

Was ist denn, wenn du die ListBox von Anfang an größer machst? Kannst du sie dann verkleinern?

Ich denke das ist irgendein blöder Fehler, der u.U. noch ganz wo anderes liegt. Denn die Höhe einer ListBox ändern, ist normalerweise eine der leichtesten Übungen.

herbivore

Merkur76 Themenstarter:in
104 Beiträge seit 2005
vor 18 Jahren

Hallo!

@pulpaplex
Ich denke aber das es sich um Zeilen handelt.

Am Anfang sieht die Listbox folgendermassen aus:

Item1 | Item2 | Item3 | Item4 | Item5 | Item6

Soll dann so aussehen:
Item1 | Item2 | Item3 | Item4 | Item5 | Item6
Item7 | Item8

Sieht jetzt aber so aus (bis Item6 sichtbar und dann Scrollbalken da):
Item1 | Item2 | Item3 | Item4 | Item5 | Item6 | Item7 | Item8

DrawMode.OwnerDrawFixed muss ich leider machen, da ich die Items zeichne, und sie immer die gleiche Größe haben soll.

Column.Width habe ich schon eingestellt, so das die Spaltenbreite zu den gezeichneten Items passt.

@herbifore
Also verkleinern kann ich die Listbox.
Wenn ich lstXAchse.Height = 0 einstelle, ist sie wech.

Wenn ich lstXAchse.Height = 60 einstelle, wird die Listbox auch vergrößert,
sieht aber dann so aus:
Item1 | Item4 | Item7
Item2 | Item5 | Item8
Item3 | Item6

Wenn ich jedoch eine Größe unter 60 nehme, macht er wieder die Listbox einzeilig mit Scrollbalken.

Jedoch, auf jeden Fall schon mal vielen DANK für eure Hilfe!

=) Wir leben alle unter dem gleichen Sternenhimmel, haben aber nicht alle den gleichen Horizont. =)
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Merkur76,

dann funktioniert doch alles richtig (leider nur nicht so, wie du willst). Die von dir angegebene Reihenfolge bei Height = 60 ist die korrekte Reihenfolge in einer MultiColumn-ListBox (eben die gleiche Reihenfolge, wie bei mehrspaltigem Zeitschriftendruck). Man kann sie m.E. auch nicht ändern. Wenn ich es richtig sehe, hat es dann ja auch schon bei Height = 40 korrekt funktioniert, nur dass eben die zusätzliche Höhe gleich vom Scrollbar okkupiert wurde.

Ich fürchte die Sortierung, die dir vorschwebt, bekommst du nicht so ohne weiteres hin.

herbivore

Merkur76 Themenstarter:in
104 Beiträge seit 2005
vor 18 Jahren

Hallo Herbivore!

Na gut, danke! Werd ich mir halt einen anderen Weg ausdenken müssen.
🤔

Trotzalledem VIELEN DANK!

=) Wir leben alle unter dem gleichen Sternenhimmel, haben aber nicht alle den gleichen Horizont. =)
2.921 Beiträge seit 2005
vor 18 Jahren

Also Du hast IMHO die Möglichkeit entweder eine ListView zu nehmen (und Spalten hinzuzufügen sobald objListView.Items.Count>6 ist, oder die ListBox zu modifizieren, wie Du ja sagst, im OnDraw. Aber um die Anzeige der Spalten, musst Du dich IMHO selbst kümmern (naja zumindest ein wenig), und das geht so:

Auszug aus MSDN:


	listBox1.MultiColumn = true;

			// Add items to the ListBox.
			for (int x = 0; x < 50; x++)
			{
				listBox1.Items.Add("Items " + x.ToString());
			}
			// Display items in columns.
			listBox1.MultiColumn = true;
			// Determine the width of the items in the list to get the best column width setting.
			int width = (int) listBox1.CreateGraphics().MeasureString(listBox1.Items[listBox1.Items.Count -1].ToString(),
				listBox1.Font).Width;
			// Set the column width based on the width of each item in the list.
			listBox1.ColumnWidth = width;

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Merkur76 Themenstarter:in
104 Beiträge seit 2005
vor 18 Jahren
Danke :o)

Hallo dr4g0n76!

Danke für die Info =)
Ich weiss nur leider nicht was IMHO ist??? 🤔

Habe dieses Problem jedoch inzwischen mithilfe des FlowLayoutPanels und nem UserControll gelöst.

Trotzdem danke!

=) Wir leben alle unter dem gleichen Sternenhimmel, haben aber nicht alle den gleichen Horizont. =)
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Merkur76,

IMHO= In My Humble Opinion = Meiner unmaßgeblichen/bescheidenen Meinung nach

herbivore

Merkur76 Themenstarter:in
104 Beiträge seit 2005
vor 18 Jahren
Danke!

Aha, jetzt bin ich schlauer!
VIELEN DANK herbivore! 😁

=) Wir leben alle unter dem gleichen Sternenhimmel, haben aber nicht alle den gleichen Horizont. =)