zurück
Autor: Hannes Preishuber
Erstellt am: 06 Mai 2002 09:21

Daten anzeigen und editieren mit Datagrid

Der häufigste Job eines Webentwickler ist es Daten anzuzeigen zu editieren oder zu löschen. Dabei muss es öfter schnell gehen und die Seite binnen kürzester Zeit Online sein.
Was ist nun der effezienteste Weg?

Schnell stößt man auf das Datagrid das die Grundvorraussetzungen bietet.

  • Tabellarische Darstellung
  • An Daten bindbar
  • visueller Eigenschaftseditor
  • Editable
  • Sortierbar
  • Blätter Funktionen (Paging)

Zunächst wird ein Dataadapter auf ein leeres Web Formular gezogen. Ein Assistent hilft die einstellungen vorzunehmen und erzeugt Code für Update, Insert, Select und Delete.

Am unteren Rand der ASPX Seite werden im Entwurfsmodus ein Connection und ein Dataadapter Objektes angezeigt. Mit einem Rechtsklick auf den Dataadapter wird das Dataset erzeugt.

Für den ersten Test muss das Dataset über die Fill Methode des Adapters gefüllt werden. Um die Bindung zu aktivieren wird das Databind Kommando verwendet. Per Default werden alle Spalten im Grid angezeigt. Es darf natürlich nicht vergessen werden zur Entwurfszeit die Eigenschaft Datasource zu setzen.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SqlDataAdapter1.SelectCommand.CommandText = "select * from product where description like '%" & TextBox1.Text & "%'"
        SqlDataAdapter1.Fill(DataSet11)
        DataGrid1.DataBind()
End Sub

Die Eigenschaften des Datagrid lassen sich visuell einstellen. So können die Spalten einzeln ausgewählt werden. Dazu sollte aber die Eigenschaftt AutoGenerateColumns auf False gesetzt werden.

Für das schnelle Verändern des Design steht ein eigenes visuelles "Auto Format" zur Verfügung.
Wenn man in der Code Ansicht das Datagrid auswählt, kann aus einer der Eventliste z.B. das EditCommand Event ausgewählt werden. Damit wird ein Funktionsprotyp erzeugt, der mit Code gefüllt werden muss. Der wichtigste Part ist, der Datagrid EigenschaftEditItemIndex einen Wert zuzuweisen. Dieser wird über die Funktionsparamater gleich mitgeliefert.

Private Sub DataGrid1_EditCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.EditCommand
        DataGrid1.EditItemIndex = e.Item.ItemIndex
        SqlDataAdapter1.SelectCommand.CommandText = "select * from product where description like '%" & TextBox1.Text & "%'"
        SqlDataAdapter1.Fill(DataSet11)
        DataGrid1.DataBind()

End Sub

Wenn man den ItemIndex auf -1 setzt, wird das Editieren abgebrochen. Übrigens funktioniert das editieren nur mit ein geschaltener Viewstate Eigenschaft.

Wenn man den Proberty Builder verwendet erstellt dieser für jedes Feld eine sogenannte Bound Column.

<asp:BoundColumn DataField="name" SortExpression="name" HeaderText="name"></asp:BoundColumn>


Ebenfalls per Proberty Builder kann aus dieser Bound Column eine Template Column gemacht werden. Dies benötigt man um eine individuelles Design für den Edit Modus zu erstellen.

So wird für das ItemTemplate ein Label verwendet und für das EditItemTemplate eine Textbox. Dies ist auch der einzige Weg um z.B. die Länge der Textbox zu beeinflussen.

<asp:TemplateColumn HeaderText="name">
 <ItemTemplate>
   <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.name") %>'>  </asp:Label>
 </ItemTemplate>
 <EditItemTemplate>
  <asp:TextBox runat="server" Text='<%#DataBinder.Eval(Container, "DataItem.name") %>'>
</asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn>

Bisher war es eine ziemlich einfache Sache und vor allem in wenigen Minuten erledigt.
Zum speichern muss aber einiges an Code geschrieben werden. Die Doku von Microsoft sagt dazu, das 90 % aller Anwendungen lesend sind... Naja auch eine Meinung.

Das erste Problem ist, das das Datagrid aus verschiedenen Controls besteht. Meist ist es eine Textbox. Aber auch hier muss aus der Controls Collection erst ein Cast in eine Textbox durchgeführt werden um dann auf die Eigenschaft Text und damit auf den Inhalt zugreifen zu können. Der folgende Code funktioniert nur für eine Template Column.

 Dim Wert As String = CType(e.Item.Cells(I).Controls(0), TextBox).Text

Das gesamte Beispiel zum Speichern der Daten. Man könnte das Datset auch in einer Session Variablen speichern, statt alle Datensätze von der Datenbank zu holen. Dann wird der zu editierende EIntrag über das Datakey Feld identifiziert.
Um den Datensatz zu finden, wird zuerst Sort ausgeführt und dann mit Find die Reihe als Nummer gefunden. Dann wird von Fled zu Feld gesprungen mit der For Next Schleife und jedes Feld ausgelesen und dem Dataset zugewiesen. Dies funktioniert natrülich nur, wenn die Reihenfolge im Grid 100 % identisch ist mit der Reihenfolge in der Tabelle. Andernfalls könnte man die Methode Findcontrol verwenden.

Dim i, n As Integer
Dim sku As String
SqlDataAdapter1.SelectCommand.CommandText = "select * from toner_product where name like '%" & TextBox1.Text & "%' or OEMNR like '%" & TextBox1.Text & "%' OR description like '%" & TextBox1.Text & "%'"
SqlDataAdapter1.Fill(DataSet11)
DataSet11.Tables(0).DefaultView.Sort = "sku"
sku = DataGrid1.DataKeys(CInt(e.Item.ItemIndex))
n = DataSet11.Tables(0).DefaultView.Find(sku)
For i = 1 To DataGrid1.Columns.Count - 1 'erste Spalte Überspringen
    Dim Wert As String = CType(e.Item.Cells(i).Controls(1), TextBox).Text
    DataSet11.toner_product.Rows(n)(i) = Wert
Next
SqlDataAdapter1.Update(DataSet11, "toner_product")

Dies stellt nur eine Möglichkeit dar. Nach der Meinung des Autors die mit am wenigsten Coding Aufwand.

Alternativ dazu können Sie auch den Dataform Wizard anwerfen. Dieser ist natürlich die schnellste Methode. Zudem hat der den Vorteil, das auch Master Detail Darstellungen realisiert werden können. Leider werden nur Datagrids verwendet und nicht wie etwa bei Windows Forms auch Textboxen oder andere Controls. Das Ergebnis bekommen Sie auch nur im Browser präsentiert, wenn  Sie einen Load Button drücken.

 Private Sub buttonLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonLoad.Click
        Try
            Me.LoadDataSet()
            Me.masterDataGrid.SelectedIndex = -1
            Me.masterDataGrid.DataBind()
        Catch eLoad As System.Exception
            Me.Response.Write(eLoad.Message)
        End Try
    End Sub

Obwohl Die SQL Methoden für z.B. Update in den Dataadapter eingebaut werden, ist der Code im Grid (leider) nicht vorhanden. Wie immer ist das Update dann mehr oder weniger Handarbeit.

Leider haben alle diese Assistenten gemein, das man den Zugriff auf einen in der Web.COnfig gespeicherten Connection String manuell programmieren müsste. Davon ist aber abzuraten,da die Assistenten recht eigenwillig den Code immer wieder zurücksetzen.

 


 


© Copyright 2008 ppedv AG