22 Stimmen

Warum ist die Methode DataBind() notwendig?

Eine einfache Frage, denke ich.

Lange Zeit bin ich bei der programmatischen Datenbindung meiner ASP.NET-Steuerelemente blindlings einem (vermeintlich) gängigen Muster gefolgt. Nämlich:

gridView1.DataSource = someList;
gridView1.DataBind();

Wenn ich jedoch mein GridView so einstelle, dass es an eine DataSource gebunden ist Kontrolle über die Eigenschaft DataSourceID, ist der Aufruf von DataBind() nicht erforderlich. Nämlich:

gridView1.DataSourceID = LinqDataSource1;

ist ausreichend.

Wenn Sie außerdem versuchen, die DataSource-Eigenschaft im ASPX-Markup festzulegen, werden Sie mit folgendem Ergebnis begrüßt:

Sie können die Eigenschaft DataSource nicht deklarativ festlegen.

Ich nehme an, diese sind verwandt, aber ich bin immer noch ratlos, warum DataBind() notwendig ist. Der Unterschied zwischen DataSource und DataSourceID ist zweitrangig - ich kann verstehen, dass dort etwas Magie stattfindet. Die eigentliche Frage ist Warum verursacht der DataSource Propery Setter nicht automatisch eine Datenbindung? Gibt es Szenarien, in denen wir die DataSource festlegen, aber nicht an sie binden möchten?

18voto

Joel Coehoorn Punkte 377088

In ASP.Net ist es oft wichtig, dass bestimmte Daten zu bestimmten Zeitpunkten im Lebenszyklus der Seite verfügbar und bereit sind, und nicht vorher. So kann es zum Beispiel notwendig sein, die Bindung an eine Dropdown-Liste früh vorzunehmen, um später den ausgewählten Index in dieser Liste zu setzen. Oder Sie möchten mit der Bindung eines großen Gitters ein wenig warten, um die Zeit zu verkürzen, in der Sie die Verbindung aktiv halten bzw. die Daten im Speicher halten.

Durch den expliziten Aufruf der .DataBind() Methode ist es möglich, Szenarien an beiden Enden des Spektrums zu unterstützen.

2voto

Matthew Jones Punkte 24876

DataSource ist eine Eigenschaft der BaseDataBoundControl-Klasse. DataSourceID ist eine Eigenschaft der DataBoundControl-Klasse, die von BaseDataBoundControl erbt und vor ASP.NET 2.0 nicht existierte.

Da DataBoundControl explizit für die Anzeige von Daten in Listen- oder Tabellenform vorgesehen ist und BaseDataBoundControl diese Annahme nicht treffen kann, erfolgt die Bindung nicht automatisch, wenn DataSource festgelegt ist, da der Typ des Steuerelements möglicherweise nicht mit der Struktur der Daten übereinstimmt.

Natürlich ist das alles nur eine Vermutung auf der Grundlage der MSDN-Dokumentation, ich könnte also falsch liegen.

0voto

Emad-ud-deen Punkte 4522

Ich habe festgestellt, dass ohne die Verwendung von DataBind() nichts in meinem GridView angezeigt wird, also schließe ich es immer ein, wie in diesem Codeabschnitt gezeigt:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    ' TableAdapter object.
    ' Provide communication between this application and the database.
    '-----------------------------------------------------------------
    Dim suppliersAdapter As New SuppliersTableAdapter

    ' Get the data from the TableAdapter into the GridView.
    '------------------------------------------------------
    GridView1.DataSource = suppliersAdapter.GetSuppliers()

    ' Display the result set from the TableAdapter in the GridView.
    '--------------------------------------------------------------
    GridView1.DataBind()
End Sub

Bitte verzeihen Sie die zusätzlichen Kommentare, da ich auch noch ASP.Net lerne und die Kommentare mir helfen werden, besser zu lernen, "was und warum" bestimmte Anweisungen zu verwenden.

0voto

gt2 Punkte 11

Versuchen Sie dies:

if (GridView1.EditIndex == e.Row.RowIndex)
{              
    TextBox t2 = (TextBox)e.Row.FindControl("TextBox2");
    DateTime dt2;
    if (DateTime.TryParse(t2.Text, out dt2))
    {
        t2.Text = dt2.ToString("yyyy-MM-dd");
    }
}

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