DataGrid: wie TextBoxen nicht auswählbar machen?



  • Ich habe ein DataGrid, welches ich mit einer DataTable mit Daten versorgt habe. Zusätzlich habe ich via DataGridTableStyle und dem zugehörigen "Gedöns" die Styles gesetzt. Ich verwende dabei nur DataGridTextBoxColumn-Instanzen. In jeder von ihnen ist ReadOnly auf True gesetzt und TextBox.Enabled auf False gesetzt.

    Damit sind die Eingabefelder zwar nur anzeigbar und nicht editierbar. Allerdings kann man noch in die einzelnen Zellen klicken, was ich in meinem Fall nicht will, da ein Klick - analog einer ListBox - nur eine Zeile markieren soll und keine einzelne Zelle.
    Bevor jemand anmerken will, daß ich dann auch eine ListBox nehmen könnte: ich möchte auf die einzelnen Spalten und ihre Sortierungsmöglichkeit nicht verzichten, sonst hätte ich natürlich die ListBox verwendet.

    Ich hab ein bissel mit den Ereignissen herumgetrickst und schaffe es, daß man - durch Abfangen der CursorTasten im Formular - per Tastatur nicht mehr durch die einzelnen Zellen springen kann und mit <Hoch>/<Runter> nur noch die vorherige/nächste Datenzeile selektieren kann.

    Wird in DataGrid geklickt (Click) oder tritt CurrentCellChanged ein, so markiere ich die entsprechende Datenzeile.

    Das klappt soweit ganz gut. Aber beim Klicken und Halten der linken Maustaste sieht man immer noch die deaktivierte Textbox "aufblitzen" und der Text verschiebt sich in TextBox typischer Manier, bis durch die Zeilenmarkierung die Textbox wieder verschwindet und das gewünschte Layout wieder angezeigt wird.

    Deshalb jetzt die Frage: wie kann ich die Textboxen wirklich "unsichtbar" machen, so daß sie nur noch ihren Inhalt anzeigen, aber nicht mehr sichtbar reagieren, wenn man sich mit ihnen per Maus "näheren will"?

    Es bliebe noch die Möglichkeit die MouseDown-Sache in der TextBox abzufangen. Die ganze Verbiegerei des DataGrids ist aber relativ aufwändig und Tastaturereignisse kann ich bei DataGrid nur im Formular abfangen, so daß eine Ableitung von DataGrid zur Kapselung des von mir gewünschten Verhaltens nur teilweise möglich ist, was sehr unschön & unelegant ist. 😞

    Im Grunde will ich ja eigentlich kein DataGridTextBoxColumn, sondern ein "DataGridLabelColumn"... Da es das (zumindest in 1.1) nicht gibt, erscheint mir der Aufwand für eine Implementierung etwas hoch.

    Deshalb lieber vorher die Frage, ob's nicht auch anders & einfacher gehen könnte...? Am Besten wäre natürlich, wenn DataGrid das schon kann und ich einfach nur eine kleine Eigenschaft übersehen habe... 🤡



  • Ich hab's jetzt ein wenig besser hinbekommen: indem ich die BackColor Eigenschaft der Textbox'en auf die Werte setze, die im DataGrid für die Markierung verwendet wird (SelectionBackColor), unterbleibt das hässliche Flackern bei MouseDown. Allerdings wird die Vordergrundfarbe der Textbox noch für die Dauer von MouseDown bis MouseUp hellgrau dargestellt. Das kann ich wohl nicht ohne weiteres verändern. Damit kann man aber fast leben...

    Wenn aber jemand den easy Killertrick kennt: dann nur her damit! 😉


Anmelden zum Antworten