Gewusst wie: Dynamisches Festlegen der Spaltenbreite des GridView-Webserver-Steuerelements
Aktualisiert: November 2007
Standardmäßig wird die Größe der Spalten im GridView-Steuerelement automatisch angepasst. Spalten werden als HTML-Tabellenzellen (td-Elemente) ohne Breiteninformationen dargestellt. In den meisten Browsern wird die Größe von Tabellenzellen so festgelegt, dass der Inhalt möglichst breit in der Spalte angezeigt werden kann.
Sofern erforderlich, können Sie die Breite von einzelnen Spalten im GridView-Steuerelement programmgesteuert festlegen. Dies ist dann von Nutzen, wenn die Breite der Spalte von den Informationen abhängig ist, die nur zur Laufzeit verfügbar sind. Beispielsweise können Sie die Größe einer Spalte anhand des Inhalts festlegen – das heißt, auf der Grundlage der Daten, an die das GridView-Steuerelement gebunden wird.
Das grundlegende Verfahren zum Festlegen der Spaltenbreite besteht im Festlegen der Width-Eigenschaft einer Spaltenvorlage. Wenn die Breite anhand des Inhalts festgelegt werden soll, können Sie das RowDataBound-Ereignis behandeln. Dadurch werden die Zeilendaten für Sie zur Überprüfung verfügbar gemacht.
So legen Sie die Spaltenbreite dynamisch fest
Legen Sie im Code die Width-Eigenschaft der ItemStyle-Eigenschaft für eine Spalte des GridView-Steuerelements auf die gewünschte Breite fest.
Im folgenden Codebeispiel wird veranschaulicht, wie die Breite aller Spalten im GridView1-Steuerelement auf den Wert festgelegt wird, den ein Benutzer in ein Textfeld eingibt.
Protected Sub Button1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Try Dim colWidth As Integer colWidth = CInt(Server.HtmlEncode(TextBox1.Text)) If colWidth > 0 Then For i As Integer = 0 To GridView1.Columns.Count - 1 GridView1.Columns(i).ItemStyle.Width = colWidth Next End If Catch ' Report error. End Try End Sub
protected void Button1_Click(object sender, EventArgs e) { try { int colWidth = Int16.Parse(Server.HtmlEncode(TextBox1.Text)); if (colWidth > 0) { for (int i = 0; i < GridView1.Columns.Count; i++) { GridView1.Columns[i].ItemStyle.Width = colWidth; } } } catch { // Report error. } }
So legen Sie die Spaltenbreite anhand des Dateninhalts fest
Erstellen Sie einen Handler für das RowDataBound-Ereignis.
Das RowDataBound-Ereignis wird immer dann ausgelöst, wenn eine neue Zeile im Datenblatt an Daten gebunden wird und Ihnen der Zugriff auf die Zeilendaten gewährt wird.
Gehen Sie im Ereignishandler wie folgt vor:
Erstellen Sie ein DataRowView-Objekt, und weisen Sie ihm den DataItem-Wert für die aktuelle Datenblattzeile zu.
Die DataItem-Eigenschaft wird als Objekt typisiert. Deshalb müssen Sie sie umwandeln.
Führen Sie eine Überprüfung auf eine Datenzeile aus (DataControlRowType), um sicherzustellen, dass es sich um eine datengebundene Zeile und nicht um eine Kopfzeile oder eine Fußzeile handelt.
Extrahieren Sie den zu untersuchenden Datenwert aus dem DataRowView-Objekt.
Legen Sie die Width-Eigenschaft für die ItemStyle-Eigenschaft fest.
Legen Sie die Wrap-Eigenschaft der ItemStyle-Eigenschaft auf false fest.
Wenn die Wrap-Eigenschaft false ist, wird die Größe der Spalte automatisch geändert.
Im folgenden Codebeispiel wird veranschaulicht, wie die Breite einer Spalte (in diesem Fall der dritten Spalte) anhand der Breite des breitesten Datenelements der zweiten Spalte festgelegt wird. Der RowDataBound-Ereignishandler wird für jede Datenzeile einmal aufgerufen, die vom GridView-Steuerelement angezeigt wird. Im Code wird die Zeichenanzahl des breitesten Elements in einem Member für eine geschützte Seite gespeichert. Der Code legt die Breite der Spalte auf die Zeichenanzahl mal 30 fest (ein beliebiger Multiplikator).
Protected widestData As Integer Protected Sub GridView1_RowDataBound(ByVal sender As Object, _ ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Dim drv As System.Data.DataRowView drv = CType(e.Row.DataItem, System.Data.DataRowView) If e.Row.RowType = DataControlRowType.DataRow Then If drv IsNot Nothing Then Dim catName As String = drv(1).ToString() Dim catNameLen As Integer = catName.Length If catNameLen > widestData Then widestData = catNameLen GridView1.Columns(2).ItemStyle.Width = _ widestData * 30 GridView1.Columns(2).ItemStyle.Wrap = False End If End If End If End Sub Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load widestData = 0 End Sub
protected int widestData; protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { System.Data.DataRowView drv; drv = (System.Data.DataRowView)e.Row.DataItem; if (e.Row.RowType == DataControlRowType.DataRow) { if (drv != null) { String catName = drv[1].ToString(); Response.Write(catName + "/"); int catNameLen = catName.Length; if (catNameLen > widestData) { widestData = catNameLen; GridView1.Columns[2].ItemStyle.Width = widestData * 30; GridView1.Columns[2].ItemStyle.Wrap = false; } } } } protected void Page_Load(object sender, EventArgs e) { widestData = 0; }