Sonntag, Dezember 15, 2019

Zugriff auf die Daten oder dataItem verwendet, um ein gridview zu binden

Ich habe ein gridview, für die ich programmgesteuert festlegen der datasource und databind es eine Sammlung von Objekten. Für jede Zeile, die erstellt wird, dann verwende ich verschiedene Methoden, die in den Bereichen zum extrahieren der relevanten Informationen aus dem Objekt wie dieses:

<asp:TemplateField HeaderText="Aliases">
<ItemTemplate>
<%# ( (MyItem)Container.DataItem).Aliases.ToString() %>
</ItemTemplate>
</asp:TemplateField>

Mein problem ist, dass in der OnRowDeleting Methode würde ich am Liebsten zugreifen, dass DataItem-mit e g MyGridView.Zeilen[e.RowIndex].DataItem oder in einer anderen Weise. Aber ich kann nicht herausfinden, wie konfigurieren Sie die Gridview zu binden DataItem. Ist dies möglich, Zugriff auf das DataItem verwendet, und wie sollte ich es konfigurieren, um es zu tun? Wenn das nicht möglich ist kann ich auf die Werte, die binden von den Methoden? Oder muss ich mit plan B und schreiben Sie die datasource-Objekt-Auflistung, um ein datatable und verwenden Sie dann datakeysnames?

  • Warum kann man nicht den Zugriff auf var dataItem = MyGridView.Zeilen[e.RowIndex].DataItem; dass es funktionieren wird.
  • Ich habe versucht zu benutzen, aber ich bekomme null.
  • was ist der MyItem-Sammlung? Typ und Felder?
  • was ist mit var row = MyGridView.Zeilen[e.RowIndex]; Dann sollten Sie über eine Liste von Zellen. Und Sie können mit extrahieren die Zellen aus der Zeile.
  • Es ist null zu. Vielleicht ist das ein postback-problem?
InformationsquelleAutor Teletha | 2011-08-17

2 Kommentare

  1. 4

    MyGridView.Rows[e.RowIndex].DataItem sollte in der Regel Arbeit, aber ich denke, dass Sie wahrscheinlich verlassen der view-state für die Beibehaltung der raster-Daten auf post-Rücken. In einem solchen Fall, erhalten Sie die DataItem – Eigenschaft als NULL.

    Work-around können Sie immer neu zu binden, das Netz mit den eigentlichen Daten, die in jedem postback früh in page life cycle (sagen page_load).

    Jedoch in Ihrem Fall, können Sie sehr gut verwenden DataKeyNames. Im Gegensatz zu eurem glauben, brauchen Sie nicht eine DataTable für diese Eigenschaft zu arbeiten. Zum Beispiel, wenn Ihre Klasse hat die Eigenschaft mit dem Namen ItemId angibt, den Schlüssel für Ihr Objekt können Sie dann DataKeyNames="ItemId" im markup und beziehen es in OnRowDeleting mit Schlüssel – Eigenschaft der event-Argumente.

    • ViewState nicht verwendet, aber auch andere Dinge gespeichert sind, die im Sitzungszustand. Die Verwendung der DataKeyNames-die Werte müssen serialisierbar sein, richtig?
    • die tatsächlichen Daten Schlüsselwerte gespeichert sind, die Kontrolle-Staat (oder view-state) also ja-Ihr Schlüssel Art der Immobilie werden serializable. Aber die meisten oft, Ihre wichtigsten Eigenschaften Kombination aus int, string, guid und die sind schon als serialisierbar markiert.
    • Ich sehe! Diese zentralen Werte sind, sind die Werte von der DataItem, der gebunden wird, oder wie kann ich die set/get diese? Kann ich e g geben Sie einen Namen ein, um eine Zeile in der ItemTemplete?
    • vorausgesetzt, Sie sind verbindlich in Ihrem raster mit der Sammlung von Objekten des Typs ‚MyItem‘ und wenn diese Klasse hat eine Eigenschaft namens ‚ItemId‘, dann müssen Sie DataKeyNames="ItemId" im gridview-Niveau, dann Keys Eigenschaft von GridViewDeleteEventArgs haben Wert dieser Eigenschaft für das Objekt gebunden, um die Zeile gelöscht werden.
  2. 2

    Laut MSDN:

    „Der DataItem-Eigenschaft ist nur verfügbar, während und nach dem RowDataBound-Ereignis des GridView-Steuerelements.“

    Daher Zugriff auf das DataItem in der RowDataBound-Ereignis:

    Können sagen, Sie binden eine Liste(Des Fahrzeugs), um das raster:

    Dim vehicles As List(Of Vehicle) = Vehicle.GetAll()
    gvVehicles.DataSource = vehicles
    gvVehicles.DataBind()

    In der RowDataBound event Zugriff auf das DataItem:

    Protected Sub gvVehicles_RowDataBound(sender As Object, e As GridViewRowEventArgs)
    
        If e.Row.RowType = DataControlRowType.DataRow Then
           Dim veh As Vehicle = TryCast(e.Row.DataItem, Vehicle)
           If Not veh Is Nothing Then
                Dim chkBox As CheckBox = CType(e.Row.FindControl("chkSelect"), CheckBox)
                    chkBox.Checked = True
           End If
        End If
    End Sub

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...