Listboxes

Status
Niet open voor verdere reacties.

ODJ

Nieuwe gebruiker
Lid geworden
8 mei 2014
Berichten
2
Hallo,
Ik ben nieuw met VB 2010 en wil graag een form maken met daarin 3 Listboxes: in listbox 1 heb ik een verzameling met machinesoorten,als ik in deze lijst een machine selecteer wil ik dat er in listbox2 alleen de types voor deze specifieke machine komen te staan en als een ander selecteer in listbox1 alleen de types van deze machine.
In listbox 3 heb een aantal waardes staan die vast staan (technische tekeningen,foutcodes etc.).Nu wil ik als er in alle 3 de lijsten een keuze is gemaakt en ik op de knop druk de gegevens (bv. technische tekeningen van toyota type 7fbmf)geopend worden van mijn harde schijf.Nu ben ik een eindje op weg maar ik zit vast.Dit is wat ik tot nu toe heb:

Code:
Public Class Form1
    Private MachineCollection As List(Of Machine)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MachineCollection = New List(Of Machine)

        Call AddMachine()

        ListBox1.DataSource = MachineCollection
        ListBox1.ValueMember = "Merk"
    End Sub
    Private Sub AddMachine()
        Dim Atlet As Machine = New Machine With {.Merk = "Atlet", .Type = {"LEH 16c", "PLL", "PLP", "TLP"}}
        Dim BT As Machine = New Machine With {.Merk = "BT", .Type = {"LPE 180"}}
        Dim Caterpillar As Machine = New Machine With {.Merk = "Caterpillar", .Type = {"DP15", "DP40", "EP10", "GP15", "GP40"}}
        Dim Cesab As Machine = New Machine With {.Merk = "Cesab", .Type = {"Blitz", "B200", "B300", "B400", "B600", "B800", "Centauro"}}
        Dim Hyster As Machine = New Machine With {.Merk = "Hyster", .Type = {"A1.3", "E1.6", "J1.5", "J2.2"}}
        Dim Toyota As Machine = New Machine With {.Merk = "Toyota", .Type = {"7FBMF", "7FBEF"}}

        MachineCollection.addrange({Atlet, BT, Caterpillar, Cesab, Hyster, Toyota})
    End Sub
    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
        ListBox2.Items.Clear()

        ListBox2.Items.AddRange(MachineCollection.Item(ListBox1.SelectedIndex).Type)
    End Sub
End Class

Public Structure Machine

    Sub New()
        ' TODO: Complete member initialization 
    End Sub

Public Property Merk As String
    Public Property Type As String


End Structure

Hij zegt: complete member initialization

Ook weet ik niet hoe ik de koppeling moet maken tussen listbox2,listbox3 en de drukknop.
Ik hoop dat iemand mij kan helpen.
 
Laatst bewerkt door een moderator:
Hoi,

Als eerste: Welkom op Helpmij.nl! :)

Dan voor het probleem:
Hij zegt: complete member initialization
Op deze vraag is het moeilijk een antwoord te geven met de geringe informatie die je gegeven hebt. Waar zegt 'hij' "complete member initialization"? Het is voor ons ook niet makkelijk een probleem zomaar aan te wijzen in een code...

Ook weet ik niet hoe ik de koppeling moet maken tussen listbox2,listbox3 en de drukknop.
Je wil toch dat als er op de drukknop gedrukt wordt dat er gecheckt wordt of er in alle listboxen wel iets geselecteerd is en op basis van wat er geselecteerd is dan een bestand openen? Wat daaraan lukt er precies niet?


Dan valt het mij op dat je bij die structure een array gaat wegschrijven in een string en dat je (nog) geen gebruik maakt van de "Sub New". Persoonlijk zou ik de structure zo maken:
[CPP]Private Structure Machine
Public Merk As String
Public Type As List(Of String)

Sub New(ByVal InputMerk As String, ByVal InputType() As String)
Merk = InputMerk
Type = New List(Of String)
Type.AddRange(InputType)
End Sub
End Structure[/CPP]
En die kan je dan zo gebruiken:
[CPP]Dim Atlet As Machine = New Machine("Atlet", {"LEH 16c", "PLL", "PLP", "TLP"})[/CPP]
Je moet voor listbox2 dit:
Code:
ListBox2.Items.AddRange(MachineCollection.Item(ListBox1.SelectedIndex).Type)
dan wel vervangen door dit:
Code:
ListBox2.Items.AddRange(MachineCollection.Item(ListBox1.SelectedIndex).Type.ToArray)


Dit stukje twijfel ik ook bij:
Code:
ListBox1.DataSource = MachineCollection
ListBox1.ValueMember = "Merk"
Ik heb het zelf even geprobeerd en bij mij werkte het niet. Ik zou daar even door de list loopen (met een for-loop) om de listbox te vullen.


Ik hoop dat je hiermee in ieder geval al iets verder komt.

MartinJM

[edit]
Graag de volgende keer je codes in CODE-tags plaatsen. Je kan deze boven het tekstvak vinden: het is het knopje met het # erop.
[/edit]
 
Laatst bewerkt:
Ophalen gegevens van harde schijf

Na wat tobben en rondvragen ben ik een heel eind verder maar ik heb nog 1 probleem: mijn 3 listboxen + Messagebox werken nu goed maar nu wil ik wanneer ik uit de listboxen een keuze heb gemaakt dat hij deze ophaalt van mijn F:\ Schijf (in dit geval Cesab ,M300 en onderhoudsschema's deze staan op F:\B300-400 RP.pdf) d.m.v. process.start ik weet alleen niet hoe ik dat het beste kan doen.
Dit is wat ik tot nu toe heb:

Code:
Public Class FormMachines

    Private ReadOnly machineCollection As New List(Of Machine)(
                {New Machine("Atlet", {"LEH 16c", "PLL", "PLP", "TLP"}),
                 New Machine("BT", {"LPE 180"}),
                 New Machine("Caterpillar", {"DP15", "DP40", "EP10", "GP15", "GP40"}),
                 New Machine("Cesab", {"Blitz", "B200", "B300", "B400", "B600", "B800", "Centauro"}),
                 New Machine("Hyster", {"A1.3", "E1.6", "J1.5", "J2.2"}),
                 New Machine("Toyota", {"7FBMF", "7FBEF"})})
    Private Sub FormMachines_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        ListBoxMachines.DataSource = machineCollection
        ListBoxMachines.DisplayMember = "Merk"
        ListBoxMachineInfo.DataSource = {"Elektrische schema's", "Hydraulische schema's",
                                       "Foutcodes", "Onderhoudsschema's", "Specifieke Storingen"}
    End Sub
    Private Sub ListBoxMachines_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) _
    Handles ListBoxMachines.SelectedIndexChanged
        Dim machine = TryCast(ListBoxMachines.SelectedValue, Machine)
        If machine Is Nothing Then
            ListBoxType.DataSource = Nothing
        Else
            ListBoxType.DataSource = machine.Type
        End If
    End Sub
    Private Sub ListBoxMachineInfo_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) Handles ListBoxMachineInfo.DoubleClick
        ToonInfo()
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As EventArgs) Handles ButtonToonInfo.Click
        ToonInfo()
    End Sub
    Private Sub ToonInfo()
        Dim boodschap = String.Format("Toon {0} van {1} ({2})",
                                      ListBoxMachineInfo.Text, ListBoxMachines.Text, ListBoxType.Text)
        If MessageBox.Show(boodschap, "Info tonen", MessageBoxButtons.OKCancel,
                           MessageBoxIcon.Information) = DialogResult.OK Then
            Process.Start()
        End If
    End Sub
End Class

Private Function () As String

    Return "F:\B300-400 RP.pdf"
End Function
Public Class Machine
    Public Property Merk As String
    Public Property Type As List(Of String)

    Sub New(ByVal merk As String, ByVal type As IEnumerable(Of String))
        Me.Merk = merk
        Me.Type = New List(Of String)(type)
    End Sub
End Class

Alvast bedankt
 
Hoi,

Je zal eerst moeten bepalen welk bestand er precies geopend moet worden. Daar kan je het if-statement of misschien ook het select-statement voor gebruiken.

Het openen van het bestand kan je dan zo doen:
Code:
Dim FilePath As String = "Bestand"
Process.Start("""" & FilePath & """")

Succes!
MartinJM

[edit]
Je kan misschien ook dit gebruiken: https://social.msdn.microsoft.com/Forums/vstudio/en-US/c165c82d-ac79-477e-abab-3efd330d149f/how-to-open-pdf-file-in-vbnet-applicatin
[/edit]



[edit]
[/edit]
Nadat ik me realiseerde dat het gebruiken van if-statements of select-statements heel veel werk kon gaan worden, heb ik een andere manier bedacht:
Je breidt de Machine structure uit zodat ook de bestandsnamen erin kunnen, waarna je dus met het merk, het type en het soort bestand wat je wil gewoon het path uit kan lezen uit de Machine.

Als ik dat zou maken zou dat er ongeveer zo uit zien:
[CPP]Public Class Form1

Private Structure Machine
Public Merk As String
Public Types As List(Of String)
Public TechnischeBestanden As List(Of String)
Public FoutcodeBestanden As List(Of String)

Sub New(ByVal InputMerk As String, ByVal InputTypes() As String, ByVal InputTechnischeBestanden() As String, ByVal InputFoutcodeBestanden() As String)
Merk = InputMerk
Types = New List(Of String)(InputTypes)
TechnischeBestanden = New List(Of String)(InputTechnischeBestanden)
FoutcodeBestanden = New List(Of String)(InputFoutcodeBestanden)
End Sub
End Structure

Private MachineCollection As New List(Of Machine)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Atlet As Machine = New Machine("Atlet", New String() {"LEH 16c", "PLL", "PLP", "TLP"}, New String() {"Bestand1", "Bestand2", "Bestand3", "Bestand4"}, New String() {"Bestand5", "Bestand6", "Bestand7", "Bestand8"})
MachineCollection.Add(Atlet)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Not ListBox1.SelectedItems.Count = 1 Or Not ListBox2.SelectedItems.Count = 1 Or Not ListBox3.SelectedItems.Count = 1 Then
MsgBox("Je moet in elke listbox iets selecteren.")
Exit Sub
End If

For i As Integer = 0 To MachineCollection.Count - 1 Step 1
If ListBox1.SelectedItem = MachineCollection(i).Merk Then
Dim CurrentMachine As Machine = MachineCollection(i)
Dim TypeIndex As Integer = CurrentMachine.Types.FindIndex(Function(x) x = ListBox2.SelectedItem)

Select Case ListBox3.SelectedItem
Case "Technische tekeningen"
Process.Start(CurrentMachine.TechnischeBestanden(TypeIndex))
Case "Foutcodes"
Process.Start(CurrentMachine.FoutcodeBestanden(TypeIndex))
End Select

Exit For
End If
Next
End Sub
End Class
[/CPP]

Waarbij "Bestand1" dus het technische bestand van de Atlet LEH 16c is, "Bestand2" is het technische bestand van de Atlet PLL, enz. "Bestand5" t/m "Bestand8" ook, alleen dan voor de foutcodes.

Hierin zitten een paar dingen die er eerder al in zaten niet meer. Je zal het dus wel zelf nog in moeten bouwen. Let wel op dat je er niks van leert als je het direct kopieert zonder dat je het snapt. Zorg dus dat je het snapt voordat je het gebruikt!

MartinJM
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan