Avatar billede Kim Neesgaard Seniormester
21. marts 2006 - 15:27 Der 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(!).
Avatar billede snepnet Nybegynder
21. marts 2006 - 17:06 #1
halløjsa :o)

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?

mvh
Avatar billede Kim Neesgaard Seniormester
21. marts 2006 - 18:07 #2
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.
Avatar billede snepnet Nybegynder
21. marts 2006 - 18:40 #3
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:

<asp:DataGrid ID="grid" runat="server" OnItemDataBound="grid_ItemDataBound">
</asp:DataGrid>

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

mvh
Avatar billede Kim Neesgaard Seniormester
21. marts 2006 - 19:09 #4
Dvs. konceptet er, at man aflæser og manupulerer data MENS data bliver bundet til DataGrid eller GridView og ikke FØR præsentation i viewet?
Avatar billede snepnet Nybegynder
21. marts 2006 - 19:41 #5
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
Avatar billede Kim Neesgaard Seniormester
21. marts 2006 - 19:46 #6
Men hvordan får man så fat i data FØR databinding?
Avatar billede snepnet Nybegynder
21. marts 2006 - 19:53 #7
well.. udfra den kode du sendte:

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

mvh
Avatar billede Kim Neesgaard Seniormester
21. marts 2006 - 19:56 #8
Men det er efter Fill og før DataBind at jeg ikke kan se, hvordan jeg får fat i data og manipulerer dem?
Avatar billede snepnet Nybegynder
21. marts 2006 - 20:07 #9
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:

someRow["name"] = "hans";

mvh
Avatar billede Kim Neesgaard Seniormester
21. marts 2006 - 21:13 #10
Hvis man nu har en Label1, hvordan skal man så skrive for at få indholdet af F2 række 5 vist?
Avatar billede snepnet Nybegynder
21. marts 2006 - 21:16 #11
hvis du har en Label1 uden for dit datagrid - kan du sætte teksten sådan her :
Label1.Text = dt.Rows[4]["F2"].ToString();
mvh
Avatar billede Kim Neesgaard Seniormester
21. marts 2006 - 21:22 #12
Fint - det virker! Hvis nu værdien er 'Petersen', hvordan ville man skulle ændre den til 'Hansen'?
Avatar billede snepnet Nybegynder
21. marts 2006 - 21:26 #13
Med noget i denne stil:

if(dt.Rows[4]["F2"].ToString() == "Petersen")
{
  dt.Rows[4]["F2"] = "Hansen";
}

mvh
Avatar billede Kim Neesgaard Seniormester
21. marts 2006 - 21:49 #14
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?
Avatar billede snepnet Nybegynder
21. marts 2006 - 21:54 #15
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
Avatar billede Kim Neesgaard Seniormester
22. marts 2006 - 12:15 #16
Lige en lille ting mere: er det mest hensigtsmæssigt at fange 'EOF' med en Try Catch eller er der en bedre måde?
Avatar billede Kim Neesgaard Seniormester
22. marts 2006 - 14:01 #17
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?
Avatar billede snepnet Nybegynder
22. marts 2006 - 20:22 #18
hej igen :o)

du må lige forklare hvornår du har brug for en "eof-information".

du kunne gøre noget i denne stil (i den metode du har angivet):

DataRowView drv = e.Item.DataItem as DataRowView;
if(drv["F2"].ToString() == "20")
{
  e.Item.Cell[1].Text = "rundsav";
}

men det er en meget "manuel" måde at gøre det på.
er 10 ikke et id på en rundsav (der ligger i en anden tabel) ?

mvh
Avatar billede Kim Neesgaard Seniormester
23. marts 2006 - 08:20 #19
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.
Avatar billede Kim Neesgaard Seniormester
23. marts 2006 - 09:15 #20
Hold da op, hvor det virker!! Blot for min forståelses skyld - hvad sker der egentlig i denne linie:

If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then ....
Avatar billede snepnet Nybegynder
23. marts 2006 - 12:19 #21
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
Avatar billede Kim Neesgaard Seniormester
23. marts 2006 - 12:44 #22
Tak! Mon jeg en dag kan kaste kodestumper af mig som dig??!

Har du også noget om den 'EOF' ting?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester