7 Stimmen

Jede Möglichkeit, die Spalten in GridView mit AutoGenerateColumns = true zu manipulieren?

Es scheint, als gäbe es keine Möglichkeit, die Spalten eines Gridviews zu manipulieren, wenn AutoGenerateColumns = true. Hier ist mein Szenario:

Ich habe ein generisches GridView, das 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, etc. angeben...

Darüber hinaus füge ich bei Bedarf programmgesteuert weitere Spalten hinzu. Die programmatisch hinzugefügten Spalten werden links von den automatisch generierten Spalten angezeigt. Was wäre, wenn ich sie nach rechts verschieben wollte?

GridView.Columns.Count zählt nur die Spalten, die programmiert und nicht automatisch generiert werden, so dass ich die gewünschten Spalten nicht neu anordnen kann. Ich kann das RowDataBound-Ereignis einhaken und etwas "ausblenden", wenn nötig, aber ich kann nicht neu anordnen.

Muss ich einfach AutoGeneratedColumns=true aufgeben, und legen Sie sie mit BoundFields für jede Abfrage? Gibt es etwas, was ich tun kann?

3voto

brendan Punkte 28331

Auf diese Weise können Sie datengebundene Daten manipulieren:

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 müssten dazu Ihre eigene Kopfzeile erstellen, aber das ist durchaus machbar.

1voto

Martin Punkte 5651

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

Durch das Erstellen eines neuen Steuerelements, das vom GridView erbt, könnten Sie ein bisschen mehr Kontrolle über die Art und Weise haben, wie die Spalten erstellt werden, aber ich bin mir nicht sicher, ob es machbar ist (vielleicht lohnt es sich trotzdem zu recherchieren)

Aus der MSDN-Dokumentation:

Wenn die Eigenschaft AutoGenerateColumns auf true gesetzt ist, wird ein AutoGeneratedField Objekt automatisch erstellt für jedes Feld in der Datenquelle erstellt. Jedes Feld wird dann als eine Spalte in der GridView-Steuerelement in der Reihenfolge angezeigt, in der der Reihenfolge, in der die Felder in der Datenquelle erscheinen. Diese Option bietet eine bequeme Möglichkeit um jedes Feld in der Datenquelle anzuzeigen Datenquelle anzuzeigen; allerdings haben Sie eine begrenzte Kontrolle darüber, wie ein automatisch generierte Spaltenfeld angezeigt wird oder verhält.

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

Anstatt das GridView-Steuerelement automatisch die Spaltenfelder zu generieren, können Sie die Spaltenfelder manuell definieren, indem Sie Einstellung der AutoGenerateColumns Eigenschaft auf false setzen und dann eine benutzerdefinierte Columns Sammlung. Zusätzlich zu gebundenen Spaltenfeldern, können Sie auch ein Schaltflächen-Spaltenfeld, ein Kontrollkästchen Kontrollkästchen-Spaltenfeld, ein Befehlsfeld, ein Hyperlink-Spaltenfeld, ein Bild ein Bildfeld oder ein Spaltenfeld basierend auf Ihrer eigenen benutzerdefinierten Vorlage anzeigen. Für weitere Informationen finden Sie unter Spalten.

1voto

madcolor Punkte 7987

Brendans Antwort erinnerte mich daran, dass ich das hier herumliegen hatte. Gut für die Formatierung.

GridView ...

<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

1voto

Quiz Punkte 514

Falls jemand noch eine Antwort braucht: benutzen Sie einfach e.Row.Cells.Count de RowDataBound .

0voto

crokusek Punkte 4951

Aufbauend auf der akzeptierten Antwort kann ein Wörterbuch erstellt werden, um Spaltennamen im RowDataBound-Ereignis auf Spaltenindizes abzubilden, um die Verwendung von Überschriftennamen zu ermöglichen. Auch ein Spaltentausch wird gezeigt.

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;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X