2009-03-26 5 views
7

Es scheint, als gäbe es keine Möglichkeit, die Spalten einer Gridview zu manipulieren, wenn AutoGenerateColumns = true ist. Hier ist mein Szenario:Eine Möglichkeit, die Spalten in GridView mit AutoGenerateColumns zu bearbeiten = true?

Ich habe eine generische GridView, die die Ergebnisse verschiedener LINQ-Abfragen anzeigt, je nachdem, was der Benutzer auswählt. Ich mag die Tatsache, dass die AutoGenerateColumns funktioniert, wie es sollte, und ich muss nicht alle BoundField, TemplateField-Spalten usw. angeben.

Darüber hinaus bin ich auch programmatisch hinzufügen andere Spalten nach Bedarf. Die Spalten, die programmatisch hinzugefügt werden, werden links neben den automatisch generierten Spalten gerendert. Was, wenn ich sie nach rechts bewegen wollte?

GridView.Columns.Count zählt nur diejenigen, die programmiert sind, nicht automatisch generiert, so dass ich die Spalten, die ich möchte nicht umordnen kann. Ich kann das RowDataBound-Ereignis haken und bei Bedarf etwas "verstecken", aber ich kann nicht neu anordnen.

Muss ich nur auf AutoGeneratedColumns = true verzichten und sie für jede Abfrage mit BoundFields auslegen? Kann ich irgendetwas tun?

Antwort

3

können Sie Dinge wie diese auf Daten manipulieren gebunden:

Private Sub MyGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles Me.RowDataBound 
    If Me.AutoGenerateColumns = True Then 
    If e.Row.RowType = DataControlRowType.DataRow Then 
      e.row.cells.add(some code here to add your special column) 
    End If 
    End If 
End Sub 

Sie haben würden Sie Ihre eigenen Header erstellen, aber es ist sehr machbar.

0

Ich glaube nicht, dass es möglich ist, die automatisch generierten Spalten zu kontrollieren, zumindest mit der aktuellen GridView.

Durch ein neues Steuerelement erstellen, die von der Gridview erbt, Sie ein bisschen mehr Kontrolle über die Art und Weise haben könnten die Spalten erstellt werden, aber ich bin nicht sicher, ob es machbar ist (vielleicht noch wert sein für die Forschung)

Aus der Dokumentation MSDN:

Wenn die Autogeneratecolumns Eigenschaft auf true gesetzt ist, wird ein AutoGeneratedField Objekt für jedes Feld in der Datenquelle automatisch erstellt. Jedes Feld wird dann als eine Spalte in das GridView-Steuerelement in der Reihenfolge angezeigt, die Felder in der Datenquelle angezeigt werden. Diese Option bietet eine bequeme Möglichkeit jedes Feld in der Datenquelle anzuzeigen; Sie haben jedoch eine eingeschränkte Kontrolle darüber, wie automatisch ein generiertes Spaltenfeld angezeigt wird oder sich verhält.

Automatisch generierte gebundene Spalte Felder werden nicht zu den Spalten Sammlung hinzugefügt.

Statt die Gridview-Steuerelement automatisch zu lassen, um die Spalte Felder erzeugen, können Sie manuell die Spaltenfelder durch definieren die Autogeneratecolumns Eigenschaft auf false gesetzt und dann eine benutzerdefinierte Spalten Sammlung zu schaffen. Zusätzlich zu gebundenen Spalt Felder können Sie auch eine Schaltfläche Spaltenfeld anzuzeigen, ein Scheck Feld Spaltenfeld, ein Befehlsfeld, eine Hyperlink-Spalte Feld, um ein Bild Feld oder eine Spalte Feld auf der Grundlage Ihre eigenen benutzerdefinierten -definierte Vorlage Weitere Informationen zu finden Sie unter Spalten.

1

Brendans Antwort erinnerte mich daran, dass ich das herumliegen hatte. Gut zum Formatieren.

Grid ...

<asp:GridView .... OnRowDataBound="myGridView_RowDataBound"> 

Code hinter ...

Sub myGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     ' Display the data in italics. 
     e.Row.Cells(1).Text = "<i>" & e.Row.Cells(1).Text & "</i>" 
    End If 
End Sub 
0

Wenn jemand noch beantworten muss: verwenden nur e.Row.Cells.Count aus RowDataBound.

0

Aufbauend auf der angenommenen Antwort kann ein Dictionary erstellt werden, um von Spaltennamen auf Spaltenindizes im RowDataBound-Ereignis zu mappen, um die Verwendung von Header-Namen zu ermöglichen. Auch ein Spaltenwechsel wird angezeigt.

Dictionary<string, int> _columnIndiciesForAbcGridView = null; 

protected void detailsReportGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (_columnIndiciesForAbcGridView == null) 
    { 
     int index = 0; 
     _columnIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells 
      .Cast<TableCell>() 
      .ToDictionary(c => c.Text, c => index++); 
    } 

    // Add a column, this shifts the _columnIndiciesForAbcGridView though. 

    TableCell cell = new TableCell(); 
    cell.Text = "new Column"; 
    e.Row.Cells.AddAt(2, cell); 

    // Swap 0 and 1 

    int c0 = _columnIndiciesForAbcGridView["ConfigId"]; 
    int c1 = _columnIndiciesForAbcGridView["CreatedUtc"]; 

    string text = e.Row.Cells[c0].Text; 
    e.Row.Cells[c0].Text = e.Row.Cells[c1].Text; 
    e.Row.Cells[c1].Text = text; 
} 
Verwandte Themen