Archiv nach Kategorien: Dot Net

Weiße Farbe und leere Farbe

Ein Control hat natürlich standardmäßig eine Vorder- und Hintergrundfarbe. Nun komme man aber nicht auf die Idee, dass z. B. eine weiße Farbe auch wirklich “weiß” ist.

Es kann durchaus vorkommen, dass die Farbe eines Controls auf dem Bildschirm offensichtlich weiß ist, ein Test auf Color.White() ergibt allerdings nicht True.

Falls das vorkommen sollte und man minutenlang an seinem Verstand zweifelt, sollte man die Farben entweder vorher explizit setzen oder aber man testet mal spaßeshalber auf Color.Empty().

Einfach ausgedrückt: Color.Empty() ist die Standard”farbe” solange nicht explizit etwas anderes gesetzt wird. Hurra, das ist ja mal ein Ding, wo jemand wirklich mitgedacht hat, oder!??

Laufen wir in der IDE?

Unter .NET kann man prüfen, ob das hier wahr ist:

System.Diagnostics.Debugger.IsAttached
System.Diagnostics.Debugger.IsAttached

Falls ja, befinden wir uns in der IDE. Ansonsten sind wir ein Kompilat (nein, kein Kombinat, das war etwas anderes…)

Menüstruktur durchlaufen in VB.NET

Daran bin ich fast schon einmal verzweifelt. Ein Menü zu durchlaufen ist in meinen Augen schwieriger als man zunächst denkt.
“Ganz oben” gibt es den/das MenuStrip. Das ist die oberste Hierarchie (optisch kann man sich das MenuStrip als “das erste Menü unterhalb der Titelleiste” denken). Alles andere sind DropdownItems (bzw. ToolStripMenuItems), die am MenuStrip hängen. So viel zum theoretischen  Unterbau. Wer mehr darüber erfahren möchte, kann googlen.

Da eine Menüstruktur verschachtelt sein kann, müssen auch alle Unterknoten durchlaufen werden. Es bietet sich an, dafür eine Rekursion zu verwenden. (Das war übrigens eine der ganz wenigen Stellen in meinem Leben, an denen ich spontan gedacht habe: das eignet sich supergut für eine Rekursion.)

Einen Haken hat die Sache noch: bei Separatoren (horizontale Trennlinien im Menü) fällt der Cast des DropDownItems in ein ToolStripMenuItem auf die Nase.  Deswegen muss das vorher noch abgefragt werden.

(Ziel der Übung war es übrigens, den Tooltip jedes einzelnen Menüeintrags zu leeren. Das MenuStrip bringt eine eigene ToolTip-Verwaltung mit sich. Daher funktioniert es nicht, einfach das formulargebundene ToolTip-Control zu deaktivieren, da die Tooltips der Menüs nicht daran hängen.)

Private Sub LoescheToolTips()
  For i As Integer = 0 To MenuStrip1.Items.Count - 1
    Unterknoten(MenuStrip1.Items(i))
  Next
End Sub
Private Sub LoescheToolTips()
  For i As Integer = 0 To MenuStrip1.Items.Count - 1
    Unterknoten(MenuStrip1.Items(i))
  Next
End Sub
Private Sub Unterknoten(ByVal Tsmi As ToolStripMenuItem)
For j As Integer = 0 To Tsmi.DropDownItems.Count – 1
    Tsmi.DropDownItems(j).ToolTipText = "" ‘ Hier kann man den Menüpunkt verwursten.
      If Tsmi.DropDownItems(j).IsOnDropDown Then
        If Not (TypeOf Tsmi.DropDownItems(j) Is System.Windows.Forms.ToolStripSeparator) Then
          Unterknoten(DirectCast(Tsmi.DropDownItems(j), ToolStripMenuItem))
        End If
    End If
  Next
End Sub
Private Sub Unterknoten(ByVal Tsmi As ToolStripMenuItem)
For j As Integer = 0 To Tsmi.DropDownItems.Count – 1
    Tsmi.DropDownItems(j).ToolTipText = "" ‘ Hier kann man den Menüpunkt verwursten.
      If Tsmi.DropDownItems(j).IsOnDropDown Then
        If Not (TypeOf Tsmi.DropDownItems(j) Is System.Windows.Forms.ToolStripSeparator) Then
          Unterknoten(DirectCast(Tsmi.DropDownItems(j), ToolStripMenuItem))
        End If
    End If
  Next
End Sub

DataGridView extrem langsam

Bei sehr großen Datenmengen (wobei das auch relativ ist), kommt es vor, dass ein DataGridView extrem träge reagiert.

Eine Ursache kann das automatische Anpassen der Spalten- bzw. Reihengröße sein.
Bei jedem neuen Eintrag passt das Grid die Spaltenbreite neu an.

Falls dann auch noch

grid.DefaultCellStyle.WrapMode = DataGridViewTriState.True

gesetzt ist, wird auch die Reihengröße neu angepasst.

Ein Workaround ist es, die automatische Größenberechnung vor dem Befüllen auszuschalten:

grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
grid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None

Nach dem Befüllen kann man die Automatik entweder wieder einschalten oder aber man setzt die  einzelnen Spaltenbreiten manuell, so dass es “ungefähr” passt (schnellste Methode, kann bei großen Datenmengen und unterschiedlichen Textlängen aber auch zu Verdruss des Kunden führen!)

Es empfiehlt sich auch, das automatische Updaten des Grids vorher auszuschalten:

grid.SuspendLayout()

Danach dann wieder einschalten über ResumeLayout().

Der Tipp mit SuspendLayout() bringt allerdings keinen wahnsinnig großen Geschwindigkeitsvorteil.