21. marts 2006 - 15:27Der er
21 kommentarer og 1 løsning
Visning af data fra en DataTable
Jeg erklærer frt en databaseforbindelse og så skriver jeg:
objConn.Open() SQLTekst = "SELECT F1, F2 FROM tblTest" Dim objAdapter As New OleDbDataAdapter(SQLTekst, objConn) Dim dt As DataTable = New DataTable("Test1") objAdapter.Fill(dt)
Denne DataTable kan jeg forbinde til et DataGrid:
DataGrid1.DataSource = dt DataGrid1.DataBind()
og se værdierne.
Der hvor jeg går i stå er, hvis jeg vil have vist de enkelte værdier af F1 og F2, samt bevæge mig op og ned - hvordan gør man det? Jeg synes, jeg har prøvet alt muligt og det burde da ikke være svært(!).
jeg forstår ikke helt hvad du skriver... jeg synes du skriver at du får vist værdierne, men at du går i står når du skal vise de enkelte værdier. kan du ikke være lidt mere præcis omkring det? den med at bevæge sig op og ned er jeg heller ikke helt med på.... hvad mener du med at bevæge sig op og ned, og hvad er det du har prøvet indtil nu?
er det en access-database du benytter? bruger du visual studio 2005 til opgaven?
Jeg mener, at når jeg får vist tabelindholdet i et DataGrid, så virker det fint, men hvis jeg fx. vil have vist værdien af F2 for række 5 i en textbox, hvordan gør jeg så det? Med at bevæge sig op og ned mener jeg pendanten til den 'gamle' rs.MoveUp/Down.
Jeg bruger både Access og SQL Server 2005 Express, samt VS 2002 og 2005.
et datagrid er en templatebaseret kontrol, så du kan gå ind og definere hvordan rækkerne skal se ud. hvis du i specifikke linier ønsker at lave en særlig præsentation vil det mest almindelige være - at du abbonnerer på eventet ItemDataBound på datagrid'et (hvis du bruger 2.0 i det aktuelle projekt bør du benytte et GridView istedet, hvor eventet hedder RowDataBound).
hvis vi tager det gamle datagrid som eksempel - kunne det se sådan her ud:
her angives at jeg vil have kørt metode grid_ItemDataBound når en række i grid'et bliver databundet.
// metode til håndtering af itemdatabound protected void grid_ItemDataBound(object sender, DataGridItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { // ... her kan du så arbejde med det aktuelle item } }
det du arbejder med i den kode du har vist, er ikke det samme som et recordset... du kan f.eks. "bladre igennem data" sådan her:
foreach(DataRow row in dt.Rows) { // her har du så adgang til de enkelte felter i den enkelte række: if(row["SomeColumnName"].ToString() == "XYZ") { // gør et eller andet } }
nøh... det ville jeg nu ikke sige, men jeg vil gå med til, at hvis du vil manipulere din præsentation udfra dine data - så skal du gøre det mens du databinder. manipulation med data bør være overstået inden du påbegynder databinding. mvh
objConn.Open() SQLTekst = "SELECT F1, F2 FROM tblTest" Dim objAdapter As New OleDbDataAdapter(SQLTekst, objConn) Dim dt As DataTable = New DataTable("Test1") objAdapter.Fill(dt) // nu har du fyldt data ind i datatabellen dt, og kan manipulere de data som du vil
DataGrid1.DataSource = dt DataGrid1.DataBind() // inden du databinder
ahh... den kode jeg sendte 21/03-2006 18:40:43 var et forsøg på at vise lidt omkring hvordan det var bygget op.
en datatable er meget tilsvarende en en tabel i selve databasen.
du kan gå direkte på en specifik række i din datatabel sådan her dt.Rows[5]; altså pr. index.
og du kan self. også arbejde med det: DataRow row = dt.Rows[5];
og du kan få fat i indholdet af de enkelte felter sådan her: object o = row[3]; // indholdet af felt/kolonne 4 i række object o = row["id"]; // indholdet af felt/kolonne ved navn id
du vil typisk få behov for at betragte indholdet af feltet som en specifik datatype: int id = (int)row["id"];
og du kan self. også redigere data i datatabellen:
Herligt - du har her fået åbnet et meget lukket land!!
Den første metode du viste 21/03-2006 18:40:43, er den meget beregnet på at formattere data før de vises? Altså fx. 'oversætte' et maskinnummer til et maskinnavn?
ja - den slags kunne du meget vel gøre. det er kode der kører lige efter dit item er blevet konstrueret udfra dine data - så der kan godt være masser af ting der kan være relevante at lave der. mvh
Metoden fra 21/03-2006 18:40:43 kan jeg helt aktuelt bruge arbejdsmæssigt - jeg har skrevet på VB'sk:
Protected Sub grid_ItemDataBound(ByVal sender As Object, ByVal e As DataGridItemEventArgs) If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
End If End Sub
og indsat dette under DataGrid tags: OnItemDataBound="grid_ItemDataBound".
Hvis jeg i kolonne F2 fx. har 2 maskinnumre stående (10 og 20) og gerne i griddet have vist navnet på maskinen (10 ~ rundsav og 20 ~ boremaskine), hvordan ville jeg helt konkret gøre dette?
Med 'EOF' tænkte jeg på, at man spolede igennem en datatable:
Label1.Text = dt.Rows[n]["F2"].ToString();
På et tidspunkt er n een højere end det antal linier, der er i datatable og så giver den fejl.
Lige i dette tilfælde jeg tænker på, er der kun 2 muligheder, men du må meget gerne skrive, hvordan man kunne gøre det med en anden tabel, da dette selvfølgelig vil være den rigtige måde at gøre det på i andre tilfælde.
hej nees' - godt at du fik det til at funge :o) - du får et svar så. linien checker bare om det item der pt. bliver databundet af et "normalt item" - altså ikke en header eller en footer (der er andre typer også). mvh
Tak! Mon jeg en dag kan kaste kodestumper af mig som dig??!
Har du også noget om den 'EOF' ting?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.