Celwaarde van datagridvieuw wegschrijven naar tekstbestandje

  • Onderwerp starter Onderwerp starter Jan92
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Jan92

Gebruiker
Lid geworden
17 feb 2010
Berichten
111
Hallo allemaal,

Ik heb een datagridvieuw die ik gebruik als verlofplanner. (Jaarkalender)

Naast elke kolom die een bepaalde maand weergeeft, is er een "lege" kolom waar ik mijn naam kan invullen.

Dus in totaal 24 kolommen en 31 rijen.

Als ik nu mijn naam invul op datum van vb.01 juli, HOE kan ik dan mijn naam én de bijhorende datum wegschrijven

naar een tekstbestandje ? In dit vb zou dit de 14de kolom, 1ste rij zijn (naam) en de 13de kolom, 1ste rij (datum)

Hopelijk is dit duidelijk genoeg en kan iemand mij uit de nood helpen.

groeten, Jan
 
bedoelt u iets als dit?


want dan denk ik dat u beter dit kunt gebruiken:
 
Het script dat bij het 2e plaatje hoort is dit:

(Verlofdagen is de naam van de datagridview):P
Code:
Public Class Form1
       
    Dim ConectedFile As String = "C:\Verlof\2010.txt"
    Dim BasicText As String = ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"

    Private Sub Form1_Load() Handles MyBase.Load
        Verlofdagen.Rows.Add(31) 
        For r = 0 To 30
            Verlofdagen.Rows(r).Cells(0).Value = r + 1
        Next
        If Not My.Computer.FileSystem.DirectoryExists("C:\Verlof") Then My.Computer.FileSystem.CreateDirectory("C:\Verlof") 
        If Not My.Computer.FileSystem.FileExists(ConectedFile) Then Files.Overwrite(BasicText, ConectedFile) Else Loaden()
    End Sub

    Private Sub Saven() Handles Button1.Click
        Dim Alles(11) As String
        For k = 1 To 12 '12 maanden
            Dim rij(30) As String
            For r = 0 To 30 '31 dagen
                If GetCell(r, k) Then rij(r) = "x" Else rij(r) = ""
            Next
            Alles(k - 1) = ArraySamenvoegen(rij, ";")
        Next
        Files.Overwrite(ArraySamenvoegen(Alles, ":"), ConectedFile)
    End Sub

    Private Sub Loaden() Handles Button2.Click
        On Error GoTo err
        Dim alles() As String = Split(Files.Lees(ConectedFile), ":")
        For k = 1 To 12
            Dim rij() As String = Split(alles(k - 1), ";")
            For r = 0 To 30
                If rij(r) = "x" Then SetCell(r, k, True) Else SetCell(r, k, False)
            Next
        Next
err:
    End Sub

    Function ArraySamenvoegen(ByVal Texten() As String, Optional ByVal Scheidingsteken As String = " ") As String
        Dim nieuw As String = ""
        For k = 0 To Texten.Length - 1
            If Not k = 0 Then nieuw &= Scheidingsteken
            nieuw &= Texten(k)
        Next
        Return nieuw
    End Function

    Function GetCell(ByVal Rij As Integer, ByVal Kolom As Integer) As Boolean
        Return Verlofdagen.Rows(Rij).Cells(Kolom).Value
    End Function

    Sub SetCell(ByVal Rij As Integer, ByVal Kolom As Integer, ByVal value As Boolean)
        Verlofdagen.Rows.Item(Rij).Cells(Kolom).Value = value
    End Sub

End Class

Public Class Files

    Shared Sub Add(ByVal TextToAdd As String, ByVal Lokatie As String)
        Dim TextNu As String = Lees(Lokatie)
        Dim ioFile As New System.IO.StreamWriter(Lokatie)
        ioFile.Write(TextNu & TextToAdd)
        ioFile.Close()
    End Sub

    Shared Sub Overwrite(ByVal TextToFile As String, ByVal Lokatie As String)
        Dim ioFile As New System.IO.StreamWriter(Lokatie)
        ioFile.Write(TextToFile)
        ioFile.Close()
    End Sub

    Shared Function Lees(ByVal Lokatie As String)
        On Error GoTo err
        Return My.Computer.FileSystem.ReadAllText(Lokatie)
        Exit Function
err:
        Return ""
    End Function

End Class

De benodigde ruimte per file is altijd kleiner dan slechts 1kb

PS Ik zou als ik u was nog een en ander toevoegen, dit is enkel het opslaan/openen

Mvg, Rowano
 
Laatst bewerkt:
Hallo Rowano,

Hartelijk dank voor de reactie en uw voorstel.

Mijn verlofplanner moet echter ook kunnen gebruikt worden door andere personen.

Uw voorstel met de selectievakjes is dus voor mij niet bruikbaar vrees ik.

Uw code boeit mij wel, gezien ik dergelijke code nog niet gezien en gebruikt heb.

Uw eerste afbeelding is gelijkaardig aan mijn vakantieplanner. Zodat eender wie in de naam-kolom

zijn naam kan zetten. En wat ik dus nodig heb is, dat die ingevulde namen én bijhorende datums,

bij het afsluiten van de form worden weggeschreven naar een tekstbestandje.

Ik heb al diverse codes van het internet gehaald en deze proberen aanpassen, maar zonder suc 6. :(

groeten, Jan
 
En wat ik dus nodig heb is, dat die ingevulde namen én bijhorende datums,

bij het afsluiten van de form worden weggeschreven naar een tekstbestandje.

Is het de bedoeling dat een DataGrid door alle personen wordt gebruikt? Of is per persoon 1 genoeg?

Waarom moet de datum erbij staan?
Als je elke dag scheidt met een ";" en een maand met een ":" kan het programma het goed lezen en kost het weinig geheugen.
Of is het de bedoeling dat een ander programma/een persoon het ook kan lezen?
 
Dag rowano;

Op beide vragen is het antwoord Ja.

Meerdere personen moeten op dezelfde verlofplanner (DataGridVieuw) hun naam invullen

voor de gewenste verlofdagen. En iedereen moet deze verlofplanner ook kunnen raadplegen.

Jan
 
Hallo Jan92,

Wanneer 2 of meer personen op eenzelfde dag verlof nemen, hoe wordt het dan ingevuld?
- Alle namen naast elkaar?
- De namen gescheiden door een "+" of ander teken?
- enz...
 
Laatst bewerkt:
@ rowano

Nee hoor. De bedoeling is dat er geen twee of meerdere personen verlof kunnen nemen

op eenzelfde dag. Er kan in elke cel dus slecht één naam staan.

Jan
 
Hallo Jan92,
Dan zal het (hopelijk) niet zo moeilijk zijn. Ik zal meteen beginnen...:p
 
Hallo,

PS nog een vraag:
Moeten alleen de datums waarop iemand verlof neemt in de textfile geschreven worden of alle datums?:d
 
@ rowano

Sorry hoor maar ik had je laatste vraag niet meer opgemerkt.

Het is inderdaad enkel de datum van de verlofdag die moet weggeschreven worden.

Jan
 
Ik heb mijn best gedaan, dit is het resultaat: Bekijk bijlage Verlofdagen.zip ('.exe' bestand)

en dit is de code:

Code:
Public Class Form1
    Dim reeks() As String = {"Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "Novermber", "December"}
    Dim dagenpermaand() As Integer = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 'voor februarie kan u een script maken dat in een schrikkeljaar 29 dagen worden
    Dim werknemers() As String = {""} 'hoeft u zelf niet in te vullen
    Dim ConectedFile As String = "C:\Verlof\2010.txt" 'u kan een script voor maken dat het elk jaar veranderd

    Enum ArrayText
        Helemaal = 0
        DeelVanArray = 1
    End Enum


    Private Sub Form1_Load1() Handles MyBase.Load
        Verlofdagen.Rows.Add(31)
        For k = 0 To 23
            Verlofdagen.Columns(k).Width = 35
            If Even(k) Then
                Verlofdagen.Columns(k).ReadOnly = True
                Verlofdagen.Columns(k).HeaderText = reeks(k / 2)
                For r = 0 To 30
                    Verlofdagen.Rows(r).Cells(k).Value = r + 1
                    Verlofdagen.Rows(r).Height = 20
                Next
            Else
                Verlofdagen.Columns(k).ReadOnly = False
                Verlofdagen.Columns(k).HeaderText = "Naam"
            End If
        Next

        DisableOverdatums()

        If Not My.Computer.FileSystem.DirectoryExists("C:\Verlof") Then My.Computer.FileSystem.CreateDirectory("C:\Verlof")
        If Not My.Computer.FileSystem.FileExists(ConectedFile) Then Files.Overwrite("", ConectedFile) Else Loaden()
    End Sub

    Sub DisableOverdatums()
        For k = 1 To 23 Step 2
            For r = 0 To 30
                If r + 1 > dagenpermaand((k - 1) / 2) Then
                    Verlofdagen.Rows(r).Cells(k).ReadOnly = True
                    Verlofdagen.Rows(r).Cells(k - 1).ReadOnly = True
                    SetCell(r, k - 1, "XXX")
                    SetCell(r, k, "XXX")
                End If
            Next
        Next
    End Sub

    [COLOR="Blue"]Enum SaveType
        VoledigeNaamEnHeleDatum = 0
        VolledigeNaamEnVakjeVoorVakje = 1
        VerwijzingsNaamEnHeleDatum = 2
        VerwijzingsNaamEnVakjeVoorVakje = 3
    End Enum[/COLOR]

[COLOR="DarkOrange"]    Private Sub Save_Click() Handles Button1.Click
        Saven(SaveType.[COLOR="Teal"]VoledigeNaamEnHeleDatum[/COLOR]) [COLOR="Red"]'u kunt het beste de code kopieren naar uw vb project en daar 'het groene stuk' wijzigen, dan krijgt u namelijk een keuze uit 4, hier moet u de namen precies weten zie:  [COLOR="Blue"]'enum SaveType" (blauw hierboven)[/COLOR][/COLOR]
    End Sub[/COLOR]

    Sub Saven(Optional ByVal Type As SaveType = SaveType.VerwijzingsNaamEnHeleDatum)
        GetWerkNemers()
        Dim Text As String = ""



        If Type = SaveType.VerwijzingsNaamEnVakjeVoorVakje Or Type = SaveType.VerwijzingsNaamEnHeleDatum Then
            Text &= "<wnc>" 'WerkNemerCodes
            For w = 0 To werknemers.Length - 1
                If Not w = 0 Then Text &= ";"
                Text &= GetLetterCode(w) & "=" & werknemers(w)
            Next
            Text &= "</wnc>"
            For k = 1 To 23 Step 2
                For r = 0 To 30
                    For w = 0 To werknemers.Length - 1
                        If GetCell(r, k) = werknemers(w) Then SetCell(r, k, "$" & GetLetterCode(w))
                    Next
                Next
            Next
        End If

        If Type = SaveType.VolledigeNaamEnVakjeVoorVakje Or Type = SaveType.VerwijzingsNaamEnVakjeVoorVakje Then
            Text &= "<vvv>" 'Vakje Voor Vakje

            Dim Alles(11) As String
            For k = 0 To 11
                Dim rij(30) As String
                For r = 0 To 30
                    If Not Replace(GetCell(r, k * 2 + 1), " ", "") = "" Then
                        rij(r) = GetCell(r, k * 2 + 1)
                    Else
                        rij(r) = ""
                    End If
                Next
                Alles(k) = ArraySamenvoegen(rij, ";")
            Next
            Text &= ArraySamenvoegen(Alles, ":")
            Text &= "</vvv>"
        End If

        'bij voledige datums
        If Type = SaveType.VoledigeNaamEnHeleDatum Or Type = SaveType.VerwijzingsNaamEnHeleDatum Then
            Text &= "<hd>" 'Hele Datum
            Dim t As String = ""
            For k = 1 To 23 Step 2
                For r = 0 To 30
                    If Not Replace(GetCell(r, k), " ", "") = "" Then
                        If Not t = "" Then t &= ";"
                        t = t & (k + 1) / 2 & "-" & r + 1 & ":" & GetCell(r, k) '[maand] "-" [dag] ":" [werknemer] ";" [maand] "-" [da ...
                    Else

                    End If

                Next
            Next
            Text &= t
            Text &= "</hd>"
        End If

        If Type = SaveType.VerwijzingsNaamEnVakjeVoorVakje Or Type = SaveType.VerwijzingsNaamEnHeleDatum Then
            For k = 1 To 23 Step 2
                For r = 0 To 30
                    For w = 0 To werknemers.Length - 1
                        If GetCell(r, k) = "$" & GetLetterCode(w) Then SetCell(r, k, werknemers(w))
                    Next
                Next
            Next
        End If

        Files.Overwrite(Text, ConectedFile)

    End Sub



    Private Sub Loaden_Click() Handles Button2.Click
        Loaden()
    End Sub

    Sub Loaden()
        Dim text As String = Files.Lees(ConectedFile)
        Dim wnc As String = GetTextBetween(text, "<wnc>", "</wnc>")
        Dim vvv As String = GetTextBetween(text, "<vvv>", "</vvv>")
        Dim hd As String = GetTextBetween(text, "<hd>", "</hd>")

        For k = 1 To 23 Step 2
            For r = 0 To 30
                SetCell(r, k, "") ' alles leegmaken
            Next
        Next

        If Not vvv = "" Then
            Dim maanden() As String = Split(vvv, ":")
            For k = 1 To 23 Step 2
                Dim dag() As String = Split(maanden((k - 1) / 2), ";")
                For r = 0 To 30
                    SetCell(r, k, dag(r))
                Next
            Next
        End If

        If Not hd = "" Then
            Dim Gegevens As String() = Split(hd, ";")
            For w = 0 To Gegevens.Length - 1
                Dim naam As String = Split(Gegevens(w), ":")(1)
                Dim kolom As Integer = Split(Gegevens(w), "-")(0) * 2 - 1
                Dim rij As Integer = Split(Split(Gegevens(w), ":")(0), "-")(1)
                SetCell(rij - 1, kolom, naam)
            Next
        End If

        If Not wnc = "" Then
            Dim werknemer() As String = Split(wnc, ";")
            ReDim werknemers(werknemer.Length - 1)
            For w = 0 To werknemer.Length - 1
                werknemers(w) = Split(werknemer(w), "=")(1)
            Next
            For w = 0 To werknemers.Length - 1
                text = Replace(text, GetLetterCode(w), werknemers(w))
            Next
            For k = 1 To 23 Step 2
                For r = 0 To 30
                    For w = 0 To werknemers.Length - 1
                        If GetCell(r, k) = "$" & GetLetterCode(w) Then SetCell(r, k, werknemers(w))
                    Next
                Next
            Next
        End If
        DisableOverdatums()
    End Sub




    Function Even(ByVal getal As Integer) As Boolean
        Dim g As Integer = getal / 2
        Return getal = g * 2
    End Function

    Sub GetWerkNemers()
        For k = 1 To 23 Step 2
            For r = 0 To 30
                For a = 0 To werknemers.Length - 1
                    If GetCell(r, k) = werknemers(a) Then GoTo doorgaan
                Next
                ReDim Preserve werknemers(werknemers.Length)
                werknemers(werknemers.Length - 1) = GetCell(r, k)
doorgaan:
            Next
        Next
        VerkeerdeWeghalen()
    End Sub

    Sub VerkeerdeWeghalen()
        'spaties --> niets
        ReplaceArray(werknemers, " ", "")
        'haal lege vakjes weg
        Dim max As Integer = werknemers.Length - 1
        Dim k As Integer = 0
        Do While k <= max
            If werknemers(k) = "" Then werknemers(k) = werknemers(werknemers.Length - 1) : ReDim Preserve werknemers(werknemers.Length - 2) : max = werknemers.Length - 1
            k += 1
        Loop

    End Sub

    Function ReplaceArray(ByVal text() As String, ByVal Zoek As String, ByVal Vervanger As String, Optional ByVal Hoe As ArrayText = ArrayText.DeelVanArray) As String()
        For k = 0 To text.Length - 1
            If Hoe = ArrayText.DeelVanArray Then text(k) = Replace(text(k), Zoek, Vervanger)
            If Hoe = ArrayText.Helemaal Then If text(k) = Zoek Then text(k) = vervanger
        Next
        Return text
    End Function



    Function GetTextBetween(ByVal Text As String, ByVal EersteTeken As String, ByVal LaarsteTeken As String) As String ' is niet foutloos maar wel voor dit doel geschikt
        On Error GoTo err
        Return Split(Split(Text, EersteTeken)(1), LaarsteTeken)(0)
        Exit Function
err:
        Return ""
    End Function

    Function ArraySamenvoegen(ByVal Texten() As String, Optional ByVal Scheidingsteken As String = " ") As String
        Dim nieuw As String = ""
        For k = 0 To Texten.Length - 1
            If Not k = 0 Then nieuw &= Scheidingsteken
            nieuw &= Texten(k)
        Next
        Return nieuw
    End Function

    Function GetCell(ByVal Rij As Integer, ByVal Kolom As Integer) As String
        On Error GoTo err
        Return Verlofdagen.Rows(Rij).Cells(Kolom).Value
        Exit Function
err:
        Return ""
    End Function

    Sub SetCell(ByVal Rij As Integer, ByVal Kolom As Integer, ByVal value As String)
        On Error Resume Next
        Verlofdagen.Rows.Item(Rij).Cells(Kolom).Value = value
    End Sub

    Function GetLetterCode(ByVal getal As Integer) As String
        Dim L1 As Integer
        L1 = getal / 52
        Dim L2 As Integer
        L2 = getal - L1 * 52
        Dim gt As Integer = 0
        For k = 0 To 1
            If k = 0 Then gt = L1 Else gt = L2
            Select Case gt
                Case 0 To 25 : gt = 65 + gt
                Case 26 To 51 : gt = 97 + gt
                Case Else : Return "" : Exit Function
            End Select
            If k = 0 Then L1 = gt Else L2 = gt
        Next
        Return Chr(L1) & Chr(L2)
    End Function

    Function Tel(ByVal Text As String, ByVal Zoek As String) As Integer
        Return Split(Text, Zoek).Length - 1
    End Function

    Private Sub Verlofdagen_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Verlofdagen.MouseMove
        Dim muis As Point = e.Location
        muis.Y -= 21 'kolom header
        muis.X = muis.X / 35 + 0.5
        muis.Y = muis.Y / 20 + 0.5
        If Not Even(muis.X) Then muis.X += 1
        ToolStripStatusLabel1.Text = GetCell(muis.Y - 1, muis.X - 1)
    End Sub
End Class

Public Class Files

    Shared Sub Add(ByVal TextToAdd As String, ByVal Lokatie As String)
        Dim TextNu As String = Lees(Lokatie)
        Dim ioFile As New System.IO.StreamWriter(Lokatie)
        ioFile.Write(TextNu & TextToAdd)
        ioFile.Close()
    End Sub

    Shared Sub Overwrite(ByVal TextToFile As String, ByVal Lokatie As String)
        Dim ioFile As New System.IO.StreamWriter(Lokatie)
        ioFile.Write(TextToFile)
        ioFile.Close()
    End Sub

    Shared Function Lees(ByVal Lokatie As String)
        On Error GoTo err
        Return My.Computer.FileSystem.ReadAllText(Lokatie)
        Exit Function
err:
        Return ""
    End Function

End Class

deze code is helaas veel minder overzichtelijk dan de vorige geworden

door het groene stuk in het oranje stuk te vervangen door een ander, kunt u de manier van opslaan wijzigen en zo de leesbaarheid voor mensen te vergroten of het benodigde geheugen te verkleinen (het geheugen scheelt niet zo veel)
het staat u ingesteld op wat u vroeg : enkel 'gebruikte' datums en de naam helemaal erin zetten

Mvg, Rowano

PS Als u intypt: [voornaam] [spatie] [achternaam] (met eventueel tussenvoegsel) zal de code de spatie(s) weghalen, ik raad u dus aan om i.p.v. een spatie een underscore ( "_" ) te gebruiken
 
Laatst bewerkt:
Hier is nog een screenshot: (de muis is erbij getekend maar op dezelfde plek als waar ik hem hield)


De XXX'en staan op dagen die niet bestaan.
Als je met de cursor over een dag gaat krijg je alles wat op die dag staat onderaan in de balk te zien. voor als de naam te lang is om in een kolom weer te geven:P

Ik besef nu trouwens ook dat het ook geschikt zou zijn als digitale agenda / verjaardagskalender... :d(met een paar extraatjes zeker)

Mvg Rowano
 
@ rowano

WOW ! Je bent wel erg intensief met deze vraag bezig geweest.

Alhoewel de code voor een leek als ik zeer ingewikkeld overkomt, zal ik mijn uiterste best doen

deze te proberen ontleden. Ik twijfel er geen seconde aan dat het perfect zal werken !

Mijn dank is groot, beste rowano ! :thumb: :thumb: :thumb:

Tot genoegen,

Jan
 
U hebt gelijk dat ik intensief bezig ben geweest met uw vraag...

De reden hiertoe is dat ik het ten eerste leuk vind (het programmeren):d, ik afwisseling nodig heb, en dat ik iets kon leren van dit programma maken.

De code is echter niet perfect:
De XXX'en op niet-bestaande dagen worden ook gesaved en het is verre van compleet:
- Je kan enkel 1 bestand koppelen
- Er is geen menu
- etc...

Maar ik denk dat u daar misschien zelf een oplossing voor heeft, anders kunt u me altijd vragen.:d

Hebt u het trouwens al getest?
 
Laatst bewerkt:
datagrid

Ik zag deze tutorial en waarschijnlijk de oplossing van een probleempje die ik heb

Ik zag dat als je op een cel klikt in de datagrid deze automatisch ook verschijnt in een
textbox. Ik zou heel graag weten hoe je dit doet.

Ik heb namelijk op de grid een kolom: Omschrijving van de film. De kolom is veel te klein voor de hele inhoud dus die wil ik dan tonen in een multiline textbox

Zou je mij willen helpen?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan