listbox en checkbox

Status
Niet open voor verdere reacties.

stenhoeve21

Gebruiker
Lid geworden
7 feb 2013
Berichten
26
Hallo, ik heeft een heb de volgende vraag. Ik heb een tekstbestand met 8 hoofdgroepen en per groep 8 stellingen. Bij iedere stelling kan er gekozen worden uit 5 antwoorden. Iedere antwoord vertegenwoordigt een waarde. Iedere groep heeft een uniek nummer en de stellingen hebben een uniek nummer. Is het mogelijk om de stellingen in een listbox te laden waarbij er een nieuw form met 5 checkboxen wordt getoond en op de een of andere manier een relatie te maken tussen het geselecteerde in de listbox en het de geactiveerde checkbox? Vervolgens wil ik de waarden van de checkboxen per hoofdgroep (nummer) optellen en het uiteindelijke resultaat in een tekstbestand wegschrijven. Het verwerken van de gegevens in een database lijkt me een brug te ver, als ik deze brug al kan nemen.... Ik heb zelf weinig ervaring met VB.NET en zou graag wat tips, voorbeelden of suggesties krijgen waar te beginnen. Alvast bedankt voor de moeite (om het te lezen):d
 
Dit riekt naar een schoolopdracht.... :P

Wat heb je zelf al gedaan?
 
Haha, echt niet. Ik probeer juist een opdracht te automatiseren om van alle papieren af te komen... Ik moet een onderzoek uitvoeren op papier en wil dit graag "gelikter" uit voeren. Ik heb nu 1 hoofd vorm met de listbox, een 2e form met de checkboxes en een module waarin ik de dictionary heb.

Tevens een test gedaan met een specifiek omschrijving in de tekstbox om een extra mogelijkheid te creëren om het aangemaakte document in te lezen, te splitten en de waarden op te tellen. Mijn code tot dusver.. Kijk er naar, schiet erop en het punt wat ik nu tegen kom is bij de button2_Click, de index ligt buiten de matrixgrenzen??
Code:
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListBox1.Items.Add("vraag 1 Leren programmeren in Visual Basic 2010")
        ListBox1.Items.Add("vraag 2 Leren programmeren in Visual Basic 2010")
        ListBox1.Items.Add("vraag 3 Leren programmeren in Visual Basic 2010")
        ListBox1.Items.Add("vraag 4 Leren programmeren in Visual Basic 2010")
        ListBox1.Items.Add("vraag 5 Leren programmeren in Visual Basic 2010")
    End Sub
    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
        If ListBox1.SelectedIndex <> -1 Then
            Form2.ShowDialog()
        End If
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim pair As KeyValuePair(Of String, Integer)
        Dim path As String = "TextFile2.txt"
        Dim streamWriter As New System.IO.StreamWriter(path)
        For Each pair In dict
            streamWriter.WriteLine(TextBox1.Text & vbCrLf & vbCrLf)
            ' Display Key and Value.
            streamWriter.WriteLine("{0}, {1}", pair.Key, pair.Value)
        Next
        'streamWriter.Write(TextBox1.Text & vbCrLf)

        streamWriter.Close()
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        If TextBox1.Text = "admin" Then
            ListBox1.Visible = True
            Button1.Visible = True
            Button2.Visible = True
        Else
            ListBox1.Visible = True
            Button1.Visible = True
            Button2.Visible = False
        End If

        If TextBox1.Text.Length > 0 Then
            ListBox1.Visible = True
            Button1.Visible = True
        Else
            ListBox1.Visible = False
            Button1.Visible = False
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim filenumber As Integer = FreeFile()
        Dim filename As String = "TextFile2.txt"
        Dim split(1) As String
        split = filename.Split(",")
        FileOpen(filenumber, filename, OpenMode.Input)
        Do While Not EOF(filenumber)
            Label1.Text = Val(Label1.Text) + Val(split(1))
        Loop

    End Sub
End Class

Module Module1
    Public dict As New Dictionary(Of String, Integer)
End Module

Public Class Form2
    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.CheckState = 1 Then
            dict.Add("Vraag 1", -10)
        End If
    End Sub

    Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
        If CheckBox2.CheckState = 1 Then
            dict.Add("vraag 2", -5)
        End If
    End Sub

    Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged
        If CheckBox3.CheckState = 1 Then
            dict.Add("vraag 3", 0)
        End If
    End Sub

    Private Sub CheckBox4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox4.CheckedChanged
        If CheckBox4.CheckState = 1 Then
            dict.Add("vraag 4", 5)
        End If
    End Sub

    Private Sub CheckBox5_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox5.CheckedChanged
        If CheckBox5.CheckState = 1 Then
            dict.Add("vraag 5", 10)
        End If
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.Close()
    End Sub

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub
End Class
 
Laatst bewerkt door een moderator:
OK, deze vraag is dus onderdeel hiervan? Zo ja, dan is het misschien makkelijker om gewoon hier verder te gaan.

Kun je even nader omschrijven wat het project inhoudt? Dan is het makkelijker om er een zinnig antwoord op te geven.
Ik vermoed dat het om een soort enquête gaat?
 
Klopt, op papier heb ik een a4tje met 8 hoofdgroepen, o.a. 1. persoonlijke beleving, 2. leefomgeving etc. Elk hoofdgroep heeft 8 stellingen waarop geantwoord kan worden met 5 mogelijkheden , "mee eens", "gedeeltelijk mee eens", "neutraal" etc. In totaal dus 64 vragen. Elk van de 5 mogelijkheden vertegenwoordigd een waarde (-10, -5, 0, 5, 10). Mijn uiteindelijke doel is om in een tekstbestand weer te geven de naam van de gebruiker, en vervolgens per hoofdgroep de vragen en de bijbehoordende waarden van de antwoorden. Tevens wil ik dan per hoofdgroep de totale waarde berekenen.
 
Laatst bewerkt door een moderator:
Je zou die vragen als volgt op kunnen slaan (m.b.v. deze link)

Code:
[1] //Hoofdgroepen 1 t/m 8
1=vraag1
2=vraag2
...
[2]
1=vraag1
2=vraag1
...
[3]
...
[4]
...
[5]
...
 
boxe

Ik heb onderstaande code aangepast maar het zal toch niet doen wat ik bedoel. Ik gebruik een listbox met vragen. Als er op een vraag wordt geklikt zal form2 opkomen. OP dit form heb ik 5 checkboxes, welke elk dus een waarde vertegenwoordigen. Aan gezien ik (logisch) geen 64 forms wil aanroepen moet ik op de een of andere manier de selectindex (en dan liefts de gehele vraag text) als waarde in het imi bestand moeten hebben. In de code kun je wel zien dat het zo niet gaat werken.
Code:
Public Class Form2
    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.CheckState = 1 Then
            'dict.Add("vraag 1", -10)
            Dim ini As New IniFile("C:\Temp\Config.ini")
            ini.WriteString("1", "-10", "vraag1")
        End If
    End Sub

    Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
        If CheckBox2.CheckState = 1 Then
            'dict.Add("vraag 2", -5)
            Dim ini As New IniFile("C:\Temp\Config.ini")
            ini.WriteString("1", "-5", "vraag2")
        End If
    End Sub

    Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged
        If CheckBox3.CheckState = 1 Then
            'dict.Add("vraag 3", 0)
            Dim ini As New IniFile("C:\Temp\Config.ini")
            ini.WriteString("1", "0", "vraa31")
        End If
    End Sub

    Private Sub CheckBox4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox4.CheckedChanged
        If CheckBox4.CheckState = 1 Then
            'dict.Add("vraag 4", 5)
            Dim ini As New IniFile("C:\Temp\Config.ini")
            ini.WriteString("1", "5", "vraag4")
        End If
    End Sub

    Private Sub CheckBox5_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox5.CheckedChanged
        If CheckBox5.CheckState = 1 Then
            'dict.Add("vraag 5", 10)
            Dim ini As New IniFile("C:\Temp\Config.ini")
            ini.WriteString("1", "10", "vraag5")
        End If
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.Close()
    End Sub

inmiddels gelukt op een iets andere manier, ik heb in de module een list as string toegevoegd, in form 1 de waarde van de listbox item toegevoegd en de list gebruikt voor het vullen van de ini.
Code:
If CheckBox1.CheckState = 1 Then
            Dim ini As New IniFile("C:\Temp\Config.ini")
            ini.WriteString(list, "", "-10")
        End If

Nu verder om te bekijken wat ik met het ini bestand kan doen om waarden bij elkaar op te tellen en relatie te leggen tussen de vraag de .ini, wellicht kan ik ook de select index toevoegen o.i.d.
 
Laatst bewerkt door een moderator:
Ik heb het even in een klasse uitgewerkt. Ik ga even uit van een ListBox en RichTextBox om categorieën respectievelijk vragen weer te geven, maar dat kun je natuurlijk gewoon aanpassen. (Ik heb het niet helemaal getest, fouten voorbehouden).

[cpp]''//------------------
''//JoZ1 - Helpmij.nl
''//------------------

''//Let op: indices beginnen bij 1!
Public Class Enquete
''//Laad de vragen
Private Const nCateg As Integer = 8 ''//aantal categorieën
Private Const nQuest As Integer = 8 ''//aantal vragen
Private _path As String ''//INI-bestand
Private ini As IniFile ''//INIfile-object
Private _categ As ListBox, _quest As RichTextBox ''//componenten voor output
Private Answers As List(Of String) ''//Antwoordenopslag

''//Constructor
Public Sub New(ByVal path As String, ByRef categ As ListBox, ByRef quest As RichTextBox)
''//Initialisatie
_path = path : _categ = categ : _quest = quest
If IO.File.Exists(_path) Then
ini = New IniFile(_path)
Else
Throw New IO.FileNotFoundException("The file doesn't exist.", _path)
End If
End Sub

''//Categorieën laden
Public Sub LoadCategories()
For p As Integer = 1 To nCateg ''//alle categorieën afgaan
''//naamkey uit INI halen en toevoegen
_categ.Items.Add(ini.GetString(p.ToString, "name"))
Next
End Sub

''//Vraag laden
Public Sub LoadQuestion(ByVal cIndex As Integer, ByVal qIndex As Integer)
_quest.Text = ini.GetString(cIndex.ToString(), qIndex.ToString())
End Sub

''//Gegeven antwoord laden
Public Function LoadAnswer(ByVal cIndex As Integer, ByVal qIndex As Integer) As Answer
Dim temp As String = ini.GetString(cIndex.ToString(), qIndex.ToString()), retVal As Answer
If temp <> Nothing Then retVal = CInt(temp) Else retVal = Answer.none
Return retVal
End Function

''//Antwoord opslaan
Public Sub SaveAnswer(ByVal cIndex As Integer, ByVal qIndex As Integer, ByVal _answer As Answer)
Answers.Add(cIndex.ToString() & ";" & qIndex.ToString() & ";" & _answer.ToString()) ''//formaat: x;y;z
End Sub

''//Alle antwoorden exporteren
Public Sub SaveAll(ByVal outputFile As String)
If IO.File.Exists(outputFile) Then
Dim writer As New IO.StreamWriter(outputFile)
Dim currentCat As Integer = 0
For Each item As String In Answers ''//Schrijf alles wat is opgeslagen weg
Dim cat As Integer = CInt(item.Split(";")(0))
Dim q As Integer = CInt(item.Split(";")(1))
Dim answ As String = item.Split(";")(2)

''//nieuwe categorie
If cat > currentCat Then
currentCat = cat
writer.WriteLine(ini.GetString(cat.ToString, "name"))
End If
writer.WriteLine(q.ToString() & " = " & answ.ToString())
Next
writer.Close()
Else
Throw New IO.FileNotFoundException("The file doesn't exist.", outputFile)
End If
End Sub
End Class

Public Enum Answer As Integer
none = -1
eens = 0
ged_eens = 1
neutraal = 2
ged_oneens = 3
oneens = 4
End Enum

Public Class IniFile
''//API Functions
Private Declare Ansi Function GetPrivateProfileString _
Lib "kernel32.dll" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpDefault As String, _
ByVal lpReturnedString As System.Text.StringBuilder, _
ByVal nSize As Integer, ByVal lpFileName As String) _
As Integer
Private Declare Ansi Function WritePrivateProfileString _
Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal lpString As String, _
ByVal lpFileName As String) As Integer
Private Declare Ansi Function GetPrivateProfileInt _
Lib "kernel32.dll" Alias "GetPrivateProfileIntA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As String, ByVal nDefault As Integer, _
ByVal lpFileName As String) As Integer
Private Declare Ansi Function FlushPrivateProfileString _
Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As Integer, _
ByVal lpKeyName As Integer, ByVal lpString As Integer, _
ByVal lpFileName As String) As Integer


''//Constructor
Public Sub New(ByVal FileName As String)
_FileName = FileName
End Sub

Private _FileName As String
Public ReadOnly Property FileName() As String
Get
Return _FileName
End Get
End Property

Public Function GetString(ByVal Section As String, _
ByVal Key As String, Optional ByVal [Default] As String = "") As String

Dim count As Integer
Dim retVal As New System.Text.StringBuilder(256)
count = GetPrivateProfileString(Section, Key, _
[Default], retVal, retVal.Capacity, FileName)
If count > 0 Then GetString = _
Left(retVal.ToString, count) Else GetString = [Default]

End Function

Public Sub WriteString(ByVal Section As String, _
ByVal Key As String, ByVal Value As String)
WritePrivateProfileString(Section, Key, Value, FileName)
Flush()
End Sub

Private Sub Flush()
FlushPrivateProfileString(0, 0, 0, FileName)
End Sub
End Class[/cpp]
 
Laatst bewerkt:
Enorm bedankt, ik laat het uiteindelijke resultaat uiteraard weten!
 
Laatst bewerkt door een moderator:
@stenhoeve21 Onnodige quotes verwijderd. Wanneer je direct reageert op een reactie is het niet nodig om dat bericht te quoten. Onnodig quoten heet dat, hetgeen niet gewenst is.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan