Hi,
heute habe ich ein ziemlich kniffeliges Problem. Ich hoffe, ihr habt ein wenig Geduld, weil die Sache nicht ganz so einfach zu erklären ist.
Nehmen wir an, wir wollen einen FileBrowser schreiben. dazu benötigen wir zwei DataGrid Views, eine für die Directories und eine für die Files. Die beiden Datagrid Views packen wir in einen Split Container. Fertig ist der Lack. Im Anhang 1 habe ich ein rudimentäres Sample eingestellt.
Die Breite des Containers beträgt 800 Einheiten, das linke Panel ist FIXED und hat eine Breite von 300 Einheiten, das rechte Panel ist VARIABEL und hat eine Breite von 496 Einheiten (weil die SplitterWidth = 4 ist). Der SplitContainer ist an die Form angedockt.
Die Breite der FileName Spalte ist 223 Einheiten, sie ist mit AutosizeMode=Fill definiert. Als Minimale Breite sind 80 Einheiten angegeben, dass FillWeight beträgt 100.
Die anderen Spalten haben feste Längen:
Attr: 50 Einheiten
Size: 80 Einheiten
Last Changed: 140 Einheiten
Wenn man nun die Form durch Ziehen verkleinert, dann wird das Panel2 verkleinert. Zunächst wird dabei die Spalte FileName verkleinert. (s. Anhang2)
Der Container hat jetzt eine Width von 700 Einheiten, folgerichtig ist die Breite der Spalte Filename auf 123 gesunken.
Wenn man die Form weiter verkleinert, wird irgendwann die minimale Breite der Spalte FileName unterschritten. (s. Anhang3)
Der Container ist jetzt 600 Einheiten breit. Die Spalte Filename kann aber nicht auf 23 Einheiten verkleinert werden. Sie bleibt bei 80 Einheiten "stehen" und es können nicht mehr alle Spalten Daten angezeigt werden. Es erscheint am unteren Rand ein "Schieberegler".
Und hier haben wir schon das erste Problem. Dieser Schieberegler funktioniert nicht so wie ich mir das vorstelle. Man kann das Window nur geringfügig verschieben. Daten am rechten Rand des SplitPanels können NICHT angezeigt werden!
Bis hierhin ist die Welt aber trotzdem noch weitgehend in Ordnung. Ich hoffe, ihr habt mir bis dahin folgen können.
Nun möchte ich aber Spalten per Check Box ein- und ausschalten können. Dazu dienen die Kästchen oberhalt des Split Containers.
Zunächst schalten wir die Spalte "ATTR" aus. (s. Anhang4)
Erwartungsgemäß wird der durch Attr freigegebene Platz der Spalte FileName zugeschlagen. Die Breite steigt um 50 Einheiten von 223 auf 273 Einheiten.
Wenn man nun wieder die Form verkleinert, dann ist zunächst alles Palletti (s. Anhang 5)
Die Breite des Containers beträgt jetzt 700 Einheiten und die Breite der Spalte FileName ist wie zu erwarten auf 173 Einheiten gesunken.
Wenn wir aber nun die Breite weiter verkleinern, passiert etwas Merkwürdiges (s. Anhang 6)
Die Container Breite beträgt jetzt 600 Einheiten. Die Breite der Spalte FileName sinkt aber nicht auf 80 Einheiten, sondern bleibt aber bei 127 Einheiten stehen ! Das scheint mir ein FEHLVERHALTEN zu sein. Obwohl damit die effektive minimale Breite der Spalte massiv verändert wird, bleibt die EIGENSCHAFT MinimumWidth unverändert bei 80 Einheiten !
Es erscheint auch kein Schieberegler mehr! (Auch wenn man den nicht sonderlich vermisst, da er ohnehin nicht funktioniert).
Die Symptomatik wird klar, wenn man andere Spalten ausschaltet, etwa Size und LastChanged. (s. Anhang 7)
Die Breite der Spalte FileName bleibt jetzt bei 297 stehen (und nicht bei 80) !
Offensichtlich wird die Breite der ausgeblendeten Spalten der Mindestbreite der Spalte Filename hinzu addiert (abzüglich von exakt 3 Einheiten). Mindestbreite Filename 80 + Breite Size 80 + Breite LastChanged 140 - 3 Einheiten = 297 Einheiten.
Das wird auch durch das Verhalten beim Ausblenden der Spalte Attr bestätigt: Mindestbreite Filename 80 + Breite Attr 50 - 3 Einheiten = 127 Einheiten.
Mir scheint, dass hier im .NET ein Fehler vorliegt. Aber ich würde das gern mit euch abklären, ehe ich mich daran mache, dieses Verhalten zu umgehen. Möglichweise mache ich ja auch nur irgend etwas falsch.
Vielen Dank für eure (unendliche) Geduld und LG
Peter
heute habe ich ein ziemlich kniffeliges Problem. Ich hoffe, ihr habt ein wenig Geduld, weil die Sache nicht ganz so einfach zu erklären ist.
Nehmen wir an, wir wollen einen FileBrowser schreiben. dazu benötigen wir zwei DataGrid Views, eine für die Directories und eine für die Files. Die beiden Datagrid Views packen wir in einen Split Container. Fertig ist der Lack. Im Anhang 1 habe ich ein rudimentäres Sample eingestellt.
Die Breite des Containers beträgt 800 Einheiten, das linke Panel ist FIXED und hat eine Breite von 300 Einheiten, das rechte Panel ist VARIABEL und hat eine Breite von 496 Einheiten (weil die SplitterWidth = 4 ist). Der SplitContainer ist an die Form angedockt.
Die Breite der FileName Spalte ist 223 Einheiten, sie ist mit AutosizeMode=Fill definiert. Als Minimale Breite sind 80 Einheiten angegeben, dass FillWeight beträgt 100.
Die anderen Spalten haben feste Längen:
Attr: 50 Einheiten
Size: 80 Einheiten
Last Changed: 140 Einheiten
Wenn man nun die Form durch Ziehen verkleinert, dann wird das Panel2 verkleinert. Zunächst wird dabei die Spalte FileName verkleinert. (s. Anhang2)
Der Container hat jetzt eine Width von 700 Einheiten, folgerichtig ist die Breite der Spalte Filename auf 123 gesunken.
Wenn man die Form weiter verkleinert, wird irgendwann die minimale Breite der Spalte FileName unterschritten. (s. Anhang3)
Der Container ist jetzt 600 Einheiten breit. Die Spalte Filename kann aber nicht auf 23 Einheiten verkleinert werden. Sie bleibt bei 80 Einheiten "stehen" und es können nicht mehr alle Spalten Daten angezeigt werden. Es erscheint am unteren Rand ein "Schieberegler".
Und hier haben wir schon das erste Problem. Dieser Schieberegler funktioniert nicht so wie ich mir das vorstelle. Man kann das Window nur geringfügig verschieben. Daten am rechten Rand des SplitPanels können NICHT angezeigt werden!
Bis hierhin ist die Welt aber trotzdem noch weitgehend in Ordnung. Ich hoffe, ihr habt mir bis dahin folgen können.
Nun möchte ich aber Spalten per Check Box ein- und ausschalten können. Dazu dienen die Kästchen oberhalt des Split Containers.
Zunächst schalten wir die Spalte "ATTR" aus. (s. Anhang4)
Erwartungsgemäß wird der durch Attr freigegebene Platz der Spalte FileName zugeschlagen. Die Breite steigt um 50 Einheiten von 223 auf 273 Einheiten.
Wenn man nun wieder die Form verkleinert, dann ist zunächst alles Palletti (s. Anhang 5)
Die Breite des Containers beträgt jetzt 700 Einheiten und die Breite der Spalte FileName ist wie zu erwarten auf 173 Einheiten gesunken.
Wenn wir aber nun die Breite weiter verkleinern, passiert etwas Merkwürdiges (s. Anhang 6)
Die Container Breite beträgt jetzt 600 Einheiten. Die Breite der Spalte FileName sinkt aber nicht auf 80 Einheiten, sondern bleibt aber bei 127 Einheiten stehen ! Das scheint mir ein FEHLVERHALTEN zu sein. Obwohl damit die effektive minimale Breite der Spalte massiv verändert wird, bleibt die EIGENSCHAFT MinimumWidth unverändert bei 80 Einheiten !
Es erscheint auch kein Schieberegler mehr! (Auch wenn man den nicht sonderlich vermisst, da er ohnehin nicht funktioniert).
Die Symptomatik wird klar, wenn man andere Spalten ausschaltet, etwa Size und LastChanged. (s. Anhang 7)
Die Breite der Spalte FileName bleibt jetzt bei 297 stehen (und nicht bei 80) !
Offensichtlich wird die Breite der ausgeblendeten Spalten der Mindestbreite der Spalte Filename hinzu addiert (abzüglich von exakt 3 Einheiten). Mindestbreite Filename 80 + Breite Size 80 + Breite LastChanged 140 - 3 Einheiten = 297 Einheiten.
Das wird auch durch das Verhalten beim Ausblenden der Spalte Attr bestätigt: Mindestbreite Filename 80 + Breite Attr 50 - 3 Einheiten = 127 Einheiten.
Mir scheint, dass hier im .NET ein Fehler vorliegt. Aber ich würde das gern mit euch abklären, ehe ich mich daran mache, dieses Verhalten zu umgehen. Möglichweise mache ich ja auch nur irgend etwas falsch.
Vielen Dank für eure (unendliche) Geduld und LG
Peter
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Peter329“ ()