Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: datagridview

Sivun loppuun

novice [13.10.2008 19:47:57]

#

Miten datagridviewiä käytetään? Miten siihen saa ladattua tietoa ja miten luettua?

Onko jotain toista, helpompaa tapaa esittää tietoa lomakkeella taulukkomuodossa?

neau33 [14.10.2008 02:02:15]

#

Moikka novice!

tässä hieman osviittaa alkuunpääsemiseksi...

Esim1:
oletetaan, että projektissa on formi (Main) jossa on DataGridView kontrolli...

Imports System
Imports System.Drawing
Imports System.Data
Imports System.Windows.Forms

' ...
' Visual Basic-editorin valmiiksi generoimaa...
' ...

Private Sub MainForm_Load(sender As Object, e As EventArgs)

  'määritellään DataSet-objekti (uusi instanssi)...
  Dim datasetti As DataSet = New DataSet()

  ' määritellään taulu-objekti ja
  ' lisätään se DataSet-objektin tauluksi...
  Dim taulu As DataTable = datasetti.Tables.Add("Taulu1")

  Dim i As Integer = 0
  Dim j As Integer = 0

  For i = 1 to 3

    ' määritellään sarake-objekti
    ' (uusi instanssi laskurisilmukan jokaisella kierroksella)...
    Dim sarake As DataColumn = New DataColumn()

      ' märitellään ehtorakennelmassa sarakkeen datatyyppi...
      Select Case i
        Case 1
          sarake.DataType = Type.GetType("System.Int32")
        Case 2
          sarake.DataType = Type.GetType("System.String")
        Case 3
          sarake.DataType = Type.GetType("System.String")
     End Select

     ' nimetään sarake
     sarake.ColumnName = "sarake" + i.ToString

     ' lisätään sarake tauluun...
     taulu.Columns.Add(sarake)

  Next i

  ' määritellään ensimmäinen sarake (Columns(0))
  ' taulun perusavaimeksi...
  Dim PrimaryKeyColumns(0) As DataColumn
  PrimaryKeyColumns(0)= taulu.Columns("sarake1")
  taulu.PrimaryKey = PrimaryKeyColumns

  ' luodaan laskurisilmukassa kymmenen riviä (tietuetta)
  For i = 1 To 10
    ' määritetään rivi-objekti
    ' (uusi instanssi laskurisilmukan (i) jokaisella kierroksella)...
    Dim rivi As DataRow = taulu.NewRow()

    ' käydään sisemmässä laskurisilmukassa sarakkeet läpi...
    For j = 1 To 3

      ' ja annetaan ehtolauserakennelmassa sarakkeille arvot...
      Select Case j
        Case 1
          rivi("sarake" + j.ToString) = i
        Case 2
          rivi("sarake" + j.ToString) = _
          "sarake" + j.ToString + ":n tieto"
        Case 3
          rivi("sarake" + j.ToString) = _
          "sarake" + j.ToString + ":n tieto"
      End Select
    Next j

    lisätään rivi tauluun...
    taulu.Rows.Add(rivi)
  Next i

  ' määritetään DataGridView-kontrollin tietolähde...
  DataGRidView1.DataSource = datasetti.Tables("Taulu1")

End Sub

Esim2:
oletetaan, että projektissa on formi (Main) jossa on DataGridView kontrolli... ja C:-aseman juuressa on Access-tietokanta nimeltään Tietokanta.mdb, jossa on taulu nimeltään Taulu1, jossa on tietueita...

Imports System
Imports System.Drawing
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms

' ...
' Visual Basic-editorin valmiiksi generoimaa...
' ...

Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs)

  ' määritellään yhteysmerkkijono...
  Dim connectionstring As String = _
  "Provider=Microsoft.Jet.OLEDB.4.0; " _
  + "Ole DB Services=-4; Data Source=C:\Tietokanta.mdb"

  ' määritellään yhteystyyppi-objekti (uusi instanssi)...
  Dim connection As OleDbConnection = _
  New OleDb.OleDbConnection(connectionstring)

  ' Testataan tietokantayhteyttä...

  Try
    ' yritetään luoda yhtes tietokantaan...
    connection.Open
  Catch ex As Exeption
    ' jos yhteyttä tietokantaan ei synny niin
    ' ilmoitetaan asiasta viesti-ikkunassa...
    MessageBox.Show(ex.ToString)
  End Try

  ' jos yhteys tietokantaan on OK. niin...
  If connectionstate.Open Then

    ' määritellään DataSet-objekti (uusi instanssi)...
    Dim ds As DataSet = New DataSet

    ' määritellä SQL-kysely merkkijono...
    Dim querystring As String = "SELECT * FROM [Taulu1]"

    ' määritellä datasovitin-objekti (uusi instanssi)
    Dim da As OleDb.OleDbDataAdapter = _
    New OleDbDataAdapter(querystring, connection)

    ' luodaan DataSet-objektiin taulu ja täytetään
    ' luotu taulu datasovittimen avulla haetuilla,
    ' SQL-kyselyn/yhteystyypin määritämän, tietokannan
    ' taulun tiedoilla...
    da.Fill(ds, "Taulu1")

    ' tuhotaan datasovitin-objektista luotu instanssi...
    da = Nothing

    ' suljetaan yhteys tietokantaan...
    connection.Close

    ' tuhotaan yhteystyyppi-objektista luotu instanssi...
    connection = Nothing

    ' tuhotaan merkkijonomuuttuja-objektit...
    connectionstring = Nothing: querysring = Nothing

    ' määritetään DataGridView-kontrollin tietolähde...
    DataGridView1.DataSource = ds.Tables("Taulu1")

  End If

End Sub

Yhteenveto:
DataSet/DataGridView yhdistelmää vaivattomampaa tapaa luoda/tuoda/esittää/muokata/viedä "taulukko-dataa" ei ole vielä tullut vastaan...

novice [14.10.2008 21:15:04]

#

Öööö...kiitos vastauksesta, mutta kyllä siinä taitaa olla minulle liikaa uutta asiaa.

Jatkan harjoittelua ja palaan asiaan myöhemmin.

Löysin muuten netistä erittäin hyvän ohjelmoinnin opetus sivuston : http://www.homeandlearn.co.uk/index.html
Tätä kannattaa ehkä mainostaa aloittelijoille, ellei sitten jo ole linkkiä jossain täällä.

neau33 [14.10.2008 23:26:40]

#

Heippa taas!

No ei se mitään, kiinnostuksestahan tämä kaikki riippuu...mutta niille, joille DataSet ja DataGridView-kontrollin käsittely on jo ehkä hieman tutumpaa...

Esim3:
oletetaan että olemassaolevan Office version mukainen PIAs-paketti (Primary Interop Assemblies) on asennettu...ja C:-aseman juuressa on Excel-työkirja nimeltä Työkirja1, jonka taulussa Taul1 on tietoa ja lomakkeella on ohjaus-objektit DataGridView1 sekä Button1...

Imports System
Imports System.Data
Imports System.Diagnostics
Imports System.Drawing
Imports System.Windows.Forms
Imports Excel = Microsoft.Office.Interop.Excel

'...
' Visual Basic-editorin valmiiksi generoimaa...
'...

Sub Button1_Click(sender As Object, e As EventArgs)

  Dim kokoPolku As String = "C:\Työkirja1.xls"

  Dim xlApp As Excel.Application = _
  CType(CreateObject("Excel.Application"), Excel.Application)

  Dim xlBook As Excel.Workbook  = _
  CType(xlApp.Workbooks.Add(kokoPolku), Excel.Workbook)

  Dim xlSheet As Excel.WorkSheet = _
  CType(xlBook.Worksheets(1), Excel.Worksheet)

  xlSheet.Application.Visible = False

  If xlSheet Is Nothing Then
    kokoPolku = Nothing
    xlApp = Nothing: xlBook = Nothing
    xlSheet = Nothing: Tapa_Prosessi: Me.Close
  Else

    Dim sarakkeet As Integer = _
    xlSheet.Cells.SpecialCells( _
    Excel.XlCellType.xlCellTypeLastCell).Column

    Dim rivit As Integer = _
    xlSheet.Cells.SpecialCells( _
    Excel.XlCellType.xlCellTypeLastCell).Row

    Dim xlDataSetti As DataSet = New DataSet()
    Dim xlTaulu As DataTable = xlDataSetti.Tables.Add(xlSheet.Name)

    Dim i As Integer = 0: Dim j As Integer = 0

    For i = 1 To sarakkeet
      Dim xlSarake As DataColumn = New DataColumn()
      xlSarake.DataType = Type.GetType("System.Object")
      Dim sarake() As String = _
      xlSheet.Cells(1, i).Address.Split("$")
      xlSarake.ColumnName = sarake(1)
      xlTaulu.Columns.Add(xlSarake)
      sarake = Nothing
      xlSarake = Nothing
    Next i

    For i = 1 To rivit
      Dim rivi As DataRow = xlTaulu.NewRow()
      For j = 1 To sarakkeet
        rivi(j - 1) = xlSheet.Cells(i, j).Value
      Next j
      xlTaulu.Rows.Add(rivi)
      rivi = Nothing
    Next i: i = Nothing: j = Nothing

    DataGRidView1.DataSource = xlDataSetti.Tables(xlSheet.Name)

    rivit = Nothing: sarakkeet = Nothing
    xlSheet = Nothing: xlBook = Nothing
    xlApp = Nothing: kokoPolku = Nothing

    Tapa_Prosessi()

  End If

End Sub

Sub Tapa_Prosessi()

  Dim xlProsessi As Process() = _
  Process.GetProcessesByName("Excel")

  If Not xlProsessi Is Nothing Then

    Dim i As Integer = 0

    For i = xlProsessi.GetLowerBound(0) _
    To xlProsessi.GetUpperBound(0)
      Try
        xlProsessi(i).Kill()
      Catch ex As Exception
      End try
    Next i: i = Nothing

  End If

  xlProsessi = Nothing

End Sub

Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs)
  Me.Dispose
End Sub

Sub MainForm_FormClosed(sender As Object, e As FormClosedEventArgs)
  End
End Sub

neau33 [16.10.2008 10:21:13]

#

Heippa taas!

Edellinen esimerki valotti mahdollisuuksia DataSet-objektin "rakentamiseksi" sekä tiedon tuontia em. objektiin...Järkevin tapa tiedon siirtoon Excelistä ja takaisin on tietenkin taaskin käyttää hyväksi Microsoftin Jet-masiinaa ja OleDbDataAdapter'ia...

Esim4:

Sub Button2Click(sender As Object, e As EventArgs)

  If Dir("C:\net.xls") <> "" Then
    Dim xlDataSetti As New DataSet
    Dim yhteysmerkkijono As String = _
    "Provider=Microsoft.Jet.OLEDB.4.0;" + _
    "Data Source= "C:\net.xls; " + _
    "Extended Properties=""Excel 8.0;"""
    Dim xlDataAdapteri As New OleDb.OleDbDataAdapter( _
    "SELECT * FROM [Taul1$]", yhteysmerkkijono)
    xlDataAdapteri.Fill(xlDataSetti, "Taul1")
    DataGridView1.DataSource = xlDataSetti.Tables("Taul1")
  Else
    MessageBox.Show("Tiedostoa C:\net.xls ei löydy")
  End If

End Sub

neau33 [16.10.2008 13:13:33]

#

Heippa taas!

tässä vielä DataSet/DataGridView sarjaan "tavalliseen" tekstitiedostoon tallennetun tiedon tuonti DataSet-objektiin ja edelleen DataGridView-ohjausobjektiin...oletetaan, että C:-aseman juuressa on tekstitiedosto nimeltä data.txt, jonka sisältö näyttää...

data.txt:

tietoa,tietoa,tietoa,tietoa,tietoa
tietoa,tietoa,tietoa,tietoa,tietoa
tietoa,tietoa,tietoa,tietoa,tietoa

Esim5:

Imports System.Data 
Imports System.Windows.Forms 
Imports Microsoft.VisualBasic

'....
'....

Sub Button1_Click(sender As Object, e As EventArgs)

  Dim tiedosto As String = "data.txt" 
  Dim kokoPolku As String = "C:\" + tiedosto

  If Dir(kokoPolku) = "" Then 
    tiedosto = Nothing 
    kokoPolku = Nothing 
    Exit Sub 
  End If

  Filesystem.FileOpen(1, kokoPolku, _
  OpenMode.Input, OpenAccess.Read) 
  kokoPolku = Nothing 
  Dim FileStrArray() As String = _ 
  FileSystem.InputString(1,LOF(1)). _ 
  Split(Environment.NewLine) 
  FileSystem.FileClose(1)

  Dim datasetti As New DataSet 
  Dim taulu As DataTable = _ 
  datasetti.Tables.Add(tiedosto.Replace(".""_"))

  Dim i As Integer = 0 
  Dim sarakkeet As Integer = _ 
  FileStrArray(FileStrArray.GetLowerBound(0)) _ 
  .Split(",").Length - 1

  For i = 0 To sarakkeet 
    Dim sarake As New DataColumn() 
    sarake.DataType = Type.GetType("System.String"    sarake.ColumnName = "sarake(" + i.ToString + ")" 
    taulu.Columns.Add(sarake) 
    sarake = Nothing 
  Next i: sarakkeet = Nothing

  For i = FileStrArray.GetLowerBound(0) _ 
  To FileStrArray.GetUpperBound(0    Dim rivi As DataRow = taulu.NewRow() 
    Dim j As Integer = 0 
    Dim tieto() As String = _ 
    FileStrArray(i).Split(","    For j = tieto.GetLowerBound(0) _ 
    To tieto.GetUpperBound(0      rivi(j) = tieto(j).Replace(Chr(10), ""    Next j: j = Nothing 
    taulu.Rows.Add(rivi) 
    tieto = Nothing: rivi = Nothing 
  Next i: i = Nothing

  FileStrArray = Nothing 
  DataGridView1.DataSource = _ 
  datasetti.Tables(tiedosto.Replace(".""_")) 
  tiedosto = Nothing

End Sub

neau33 [16.10.2008 15:59:53]

#

Heippa taas!

Lopuksi DataSet/DataG­rid­View ­sar­jan yh­teen­ve­to ­tar­kas­te­lu­nä­kö­kul­ma­na ­tie­don ­luonti,
editoin­ti ­ja ­vien­ti ­teks­ti­tie­dos­toon ­se­kä ­tuon­ti ­teks­ti­tie­dos­tos­ta... 

Esim 6:

Imports System
Imports System.Data 
Imports System.Windows.Forms
Imports Microsoft.VisualBasic 

'...

'* * * * * * * * * * * * * * * * * * * * * * * * * * *
'*  Lomakkeelle:                                     * 
'*  1 DataGridView-ohjausobjekti                     *
'*  3 Button-ohjausobjektia (Button1 Enabled=False)  *
'*  1 NumericUpDown-ohjausobjekti                    *
'*                                                   *
'* * * * * * * * * * * * * * * * * * * * * * * * * * *

Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs)

  If NumericUpDown1.Value > 0 Then
    Button1.Enabled = True
  Else
    Button1.Enabled = False
  End If

End Sub

Sub Button1_Click(sender As Object, e As EventArgs)

  If NumericUpDown1.Value > 0 Then

    Dim datasetti As New DataSet
    Dim taulu As DataTable = datasetti.Tables.Add("taulu1")
    Dim i As Integer 
    For i = 1 to NumericUpDown1.Value
      Dim sarake As New DataColumn()
      sarake.DataType = Type.GetType("System.String"      sarake.ColumnName = "sarake(" + (i - 1).ToString +")"
      taulu.Columns.Add(sarake)
      sarake = Nothing
    Next i

    Dim rivi As DataRow = taulu.NewRow() 

    For i = 0 To datasetti.Tables("taulu1").Columns.Count -1
      rivi(i) = "" 
    Next i: i = Nothing

    taulu.Rows.Add(rivi)
    rivi = Nothing

    NumericUpDown1.Value = 0
    DataGridView1.DataSource = _
    datasetti.Tables("taulu1")

  End If

End Sub

Sub Button2_Click(sender As Object, e As EventArgs)
  KirjoitaTiedostoon
End Sub

Sub Button3_Click(sender As Object, e As EventArgs)
  LueTiedostosta
End Sub

Sub KirjoitaTiedostoon()

  If DataGridView1.RowCount > 0 Then
    DataGridView1.AllowUserToAddRows = False
    Dim kokoPolku As String = "C:\data.txt"
    FileSystem.FileOpen(1, kokoPolku, _
    OpenMode.Output, OpenAccess.Write)
    Dim i As Integer = 0
    Dim j As Integer = 0

    DataGridView1.ClearSelection 
    For i = 0 To DataGridView1.RowCount - 1
    DataGridView1.Rows(i).Selected = True
    Dim StrToFile As String = ""
    For j = 0 To DataGridView1.ColumnCount - 1
      StrToFile += DataGridView1.SelectedCells.Item(j).Value
        If j < DataGridView1.ColumnCount - 1 Then
          StrToFile += ","
        End If
      Next j: j -= j
      If i < DataGridView1.RowCount - 1 Then
        StrToFile += Environment.NewLine
      End If
      FileSystem.Print(1, StrToFile) 
      StrToFile = Nothing
      DataGridView1.Rows(i).Selected = False
    Next i
    FileSystem.FileClose(1)
    DataGridView1.AllowUserToAddRows = True
  End If

End Sub

Sub LueTiedostosta()

  Dim tiedosto As String = "data.txt"
  Dim kokoPolku As String = "C:\" + tiedosto

  If Dir(kokoPolku) = "" Then
    MessageBox.Show("Tiedostoa " + kokoPolku + " ei löydy!")
    tiedosto = Nothing
    kokoPolku = Nothing
    Exit Sub
  End If

  Filesystem.FileOpen(1, kokoPolku , _
  OpenMode.Input, OpenAccess.Read)
  kokoPolku = Nothing
  Dim FileStrArray() As String = _
  FileSystem.InputString(1,LOF(1)). _
  Split(Environment.NewLine)
  FileSystem.FileClose(1)

  Dim datasetti As New DataSet
  Dim taulu As DataTable = _
  datasetti.Tables.Add(tiedosto.Replace(".", "_"))

  Dim i As Integer = 0
  Dim sarakkeet As Integer = _
  FileStrArray(FileStrArray.GetLowerBound(0)) _
  .Split(",").Length - 1

  For i = 0 To sarakkeet
    Dim sarake As New DataColumn()
    sarake.DataType = Type.GetType("System.String")
    sarake.ColumnName = "sarake(" + i.ToString +")"
    taulu.Columns.Add(sarake)
    sarake = Nothing
  Next i: sarakkeet = Nothing

  For i = FileStrArray.GetLowerBound(0) _
    To FileStrArray.GetUpperBound(0)
    Dim rivi As DataRow = taulu.NewRow()
    Dim j As Integer = 0
    Dim tieto() As String = _
    FileStrArray(i).Split(",")
     For j = tieto.GetLowerBound(0) _
    To tieto.GetUpperBound(0)
      rivi(j) = tieto(j).Replace(Chr(10), "")
    Next j: j = Nothing
    taulu.Rows.Add(rivi)
    tieto = Nothing: rivi = Nothing
  Next i: i = Nothing
  FileStrArray = Nothing
  DataGridView1.DataSource = _
  datasetti.Tables(tiedosto.Replace(".", "_"))
  tiedosto = Nothing

End Sub

novice [16.10.2008 20:28:27]

#

Kiitoksia esimerkeistä Nea, ehkäpä saan näistä jotain aikaan.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta