2016-07-05 16 views
1

Ich habe eine Spalte in einem DataGridView mit dem Spaltentyp DataGridViewComboBoxColumn. In diesem Kombinationsfeld habe ich mehrere Strings unterschiedlicher Länge. Einige dieser Zeichenfolgen können von den Benutzern in den Anwendungseinstellungen geändert werden. Es sieht etwa so aus:Wie kann ich eine Spalte in einem DataGridView erhalten, um den Inhalt einer Combobox automatisch anzupassen?

screenshot of column

Die Spalte Auto-Size-Optionen, wie AllCells, arbeitet gut mit DataGridViewTextBoxColumns. Aber sie funktionieren nicht wie erwartet mit Kombinationsfeldern.

Wie kann ich die Breite dieser Spalte auf den Inhalt eines Kombinationsfelds anpassen?

Antwort

1

Sie können die Breite von Artikeln mit TextRenderer.MeasureText berechnen und die Breite der Spalte auf den maximalen Wert der Artikelbreite einstellen.

Um die Breite der Spalte zu ändern, verwenden Sie Width Eigenschaft der Spalte. Um nur die Breite des Dropdown-Menüs zu ändern, verwenden Sie die Eigenschaft DropDownWidth.

// I suppose your column is at index 0 
var c = this.dataGridView1.Columns[0] as DataGridViewComboBoxColumn; 
c.Width = c.Items.Cast<Object>().Select(x => x.ToString()) 
    .Max(x => TextRenderer.MeasureText(x, c.InheritedStyle.Font, 
     Size.Empty, TextFormatFlags.Default).Width); 

Sie können über Code in Load Ereignishandler des Formulars oder an anderen Orten setzen, die Sie wollen, können Sie die Größe der Spalte zurücksetzen.

Hinweis: Im obigen Beispiel sollen Elemente der Combobox vom String-Typ sein. Sie können jedoch alle Arten von Elementen verwenden und Text von Elementen extrahieren. Der Schlüsselpunkt ist hier TextRenderer.MeasureText mit diesen Parametern zu verwenden.

VB Version

Dim c = DirectCast(Me.DataGridView1.Columns(0), DataGridViewComboBoxColumn) 
c.Width = c.Items.Cast(Of Object)().Select(Function(x) x.ToString()) _ 
      .Max(Function(x) TextRenderer.MeasureText(x, c.InheritedStyle.Font, _ 
       Size.Empty, TextFormatFlags.Default).Width) 
+0

Lassen Sie mich wissen, wenn Sie Fragen über die Antwort haben :) –

+0

'TextRenderer' war der Name der Klasse I fehlte. Das ist ein guter Weg, dies zu tun. Aber es ist nicht vollständig! Es ignoriert den Dropdown-Pfeil und einige interne Auffüllung. Durch Versuch und Irrtum stellte ich fest, dass meine speziellen Anzeigeeinstellungen (Schriftgröße 14, alle anderen Standardwerte) zusätzliche 22 Pixel für das Auffüllen erfordern. Das reicht für dieses Projekt! – kvermeer

+0

Ja, möglicherweise müssen Sie zusätzliche Leerzeichen hinzufügen, z. B. Füllzeichen usw. Weitere Informationen finden Sie unter ['DisplayStyleForCurrentCellOnly'] (https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxcolumn. displaystyleforcurrentcellonly (v = vs.110) .aspx) -Eigenschaft für Spalte. Sie gibt an, ob der Wert der Eigenschaft "DisplayStyle" nur für die aktuelle Zelle im Steuerelement "DataGridView" gilt, wenn sich die aktuelle Zelle in dieser Spalte befindet. –

Verwandte Themen