Laden...

ListView - Spalten autom. auf ganze Breite verteilen

Erstellt von antoschka vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.695 Views
A
antoschka Themenstarter:in
371 Beiträge seit 2007
vor 16 Jahren
ListView - Spalten autom. auf ganze Breite verteilen

Hallo,

ich kämpfe noch mit einem Listview. Es ist durch Splitter von anderen Controls abgetrennt.

Jetzt würde ich gern die zwei Spalten des Listviews immer über die ganze Breite verteilen, auch dann wenn sich die Breite des Listviews ändert oder die Breite der Spalten verändert wird.

Irgendwie finde ich dazu nichts. Gibt´s da eine schicke Lösung.

Besten Dank antoschka

139 Beiträge seit 2006
vor 16 Jahren

Selbst ausrechnen beim Resize Event der Listview...

Gruss Ari
Wer lesen kann ist klar im vorteil!
MSDN
Dein Feund in allen fragen

K
72 Beiträge seit 2007
vor 16 Jahren

Hallo antoschka,

Ich hoffe ich hab verstanden was du meinst.

Probiers mal mit:

listView1.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

für die zweite Spalte:

listView1.Columns[1].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

Oder über Graphics.MeasureString (mit ItemText) die längste Breite auslesen und als ColumnWidth setzen.

mFg

Mädels die sich die wimpern pinseln, sind auch die die beim pimpern winseln 😉

Frauen sind wie Wolken, wenn sie weg sind wird es schön

A
antoschka Themenstarter:in
371 Beiträge seit 2007
vor 16 Jahren

Besten Dank für die Antworten.

Es ist etwas komplizierter. Ich habe zu einem ListView eine DataSource hinzugefügt. Wenn die Daten fertig geladen sind soll die Breite beider Spalten identisch sein.


            this.Columns[0].Width = this.Width/2 -1;
            this.Columns[1].Width = -2;

Wenn ich die Spaltenbreite verändere (ColumnWidthChanged event) soll die andere Spalte den Rest ausfüllen:


            foreach (ColumnHeader column in this.lvwEmployee.Columns)
            {
                if (column.Index != e.ColumnIndex) column.Width = -2;
            }

Dumm nur, dass durch den ersten Code-Schnippsel auch das Event ausgelöst wird - somit wird die erste Spalte wieder zusammengeschoben und die zweite füllt den Rest aus 🙁

Wie kann ich oben verhindern, dass das event ausgelöst wird?

Besten Dank

antoschka

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo antoschka,

brauchst du gar nicht. Frage am Anfang des EventHandler einfach eine boolsche Variable ab und verlasse den EventHandler, wenn sie gesetzt ist. Setze die boolsche Variable vor der Codestelle, die den Event unerwünschterweise auslöst, und setze sie danach zurück.

herbivore

A
antoschka Themenstarter:in
371 Beiträge seit 2007
vor 16 Jahren

Besten Dank. Der Tipp brachte die Lösung. Dummerweise habe ich noch einen Sorter implementiert und der hat auch noch die events ausgelöst.
Ich musste also das changed event immer unterdrücken mit Ausnahme wenn jemand wirklich die Spaltenbreite im Form geändert hat - und dann wird ja changing ausgelöst, wo ich die Variable setzen konnte.
MIt Resize gabe es den gleichen Ärger. Hier mal die Lösung


private void lvwEmployee_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
        {
            if (this.lvwEmployee.isDataSourceMyOrigin == false)
            {
                foreach (ColumnHeader column in this.lvwEmployee.Columns)
                {
                    if (column.Index != e.ColumnIndex) column.Width = -2;
                }
            }
            
        }

        private void lvwEmployee_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
        {
            this.lvwEmployee.isDataSourceMyOrigin = false;
        }

        private void lvwEmployee_Resize(object sender, EventArgs e)
        {
            bool firstColumn = true;
            foreach (ColumnHeader currentColumn in this.lvwEmployee.Columns)
            {
                if (firstColumn != true)
                {
                    firstColumn = false;
                }
                else
                {
                    this.lvwEmployee.isDataSourceMyOrigin = true;
                    currentColumn.Width = -2;
                }
            }

        }

Besten Dank noch mal antoschka