Domanda Ordinamento ListBox per mese

  • Autore discussione Deleted member 287171
  • Data d'inizio
D

Deleted member 287171

Buongiorno, utilizzo visual studio 2022 e ho fatto un semplice programma di rubrica. Creo in C la directory c:\Mesi\ per salvare i dati inseriti tramite un form con il comando IO.StreamWriter e WriteLine per scrivere.

per caricare il file nella ListBox utilizzo questo codice:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnCarica.Click
Dim dirpath As String = "\Rubrica\"
Dim doc() As String
lsbLista.Enabled = True
doc = IO.Directory.GetFiles(dirpath)
For Each x As String In doc
lsbLista.Items.Add(x)
Next
End Sub

Nella directory Mesi, sono in ordine crescente, è possibile, durante il caricamento nella ListBox metterli in ordine di mesi?

Cordiali Saluti, Maurizio
 
I file nella directory "Mesi" non sono in ordine su disco, il filesystem NTFS non è ordinato e Windows non applica alcun ordinamento sulle API native di enumerazione. Da explorer puoi ordinarne la visualizzazione in ordine alfabetico, data modifica o altre info. Per definire "l'ordine dei mesi" in codice serve fare una lista dei mesi: fosse alfabetico potresti usare le funzioni built-in di Linq come doc.OrderBy(...) se invece vuoi fare proprio gennaio, febbraio... allora ti conviene dichiarare un array esempio:

Codice:
    Private Const BaseDir As String = "C:\Mesi"
    Private Const Estensione As String = ".txt"
    Private Shared Mesi As String() = New String() {"Gen", "Feb", "Mar"} '...

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        lsbLista.Items.AddRange(Mesi)
    End Sub

    Private Sub lsbLista_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lsbLista.SelectedIndexChanged
        If lsbLista.SelectedIndex < 0 Then Return
        Dim mese = lsbLista.SelectedItem.ToString()
        Dim fileName = IO.Path.Combine(BaseDir, mese + Estensione)
        ' es fileName: C:\Mesi\Gen.txt
        If IO.File.Exists(fileName) Then
            ' Leggi/scrivi da fileName
        End If
    End Sub

Può essere molto utile per esercizio e per piccoli tool personali però se vuoi farlo diventare qualcosa di più ti consiglio di usare un altro modo per conservare i dati, ad esempio un database sqlite.
 
Ultima modifica da un moderatore:
Grazie mille per la risposta JunkCoder, i mesi sono già indicati in una variabile array nel seguente codice:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnSalva.Click
Dim mesi(11) As String
mesi(0) = "gennaio" : mesi(1) = "febbraio" : mesi(2) = "marzo" : mesi(3) = "aprile" : mesi(4) = "maggio" : mesi(5) = "giugno" : mesi(6) = "luglio" : mesi(7) = "agosto" : mesi(8) = "settembre" : mesi(9) = "ottobre" : mesi(10) = "novembre" : mesi(11) = "dicembre"
Dim cognome, nome As String
Dim mes As String = dtpDataNascita.Value.ToString("MMMM")
Dim dirpath As String = "\Mesi\"
cognome = txbCognome.Text
nome = txbNome.Text

e vengono salvati nella directory "c:\Mesi\" con il seguente codice:

datanascita = dtpDataNascita.Value.ToString("yyyy")
dirpath += mes & ".txt"
scrivi = AppendText(dirpath)
For x = 0 To 11
If mes = mesi(x) Then
scrivi.WriteLine(txbCognome.Text.ToUpper & " " & txbNome.Text.ToUpper)
scrivi.WriteLine("Nata/o" & “ “ & dtpDataNascita.Text & " - " & "Di Anni:" & " " & ndata - datanascita)
scrivi.WriteLine("")
End If
Next

La ListBox li carica con il seguente codice:

Private Sub ListBox1_Click(sender As Object, e As EventArgs) Handles lsbMesi.Click
Dim leggi As IO.StreamReader
If lsbMesi.Text = Nothing Then MessageBox.Show("Selezionare un file esistente!", "ATTENZIONE!", _ MessageBoxButtons.OK, MessageBoxIcon.Exclamation) : Exit Sub
leggi = OpenText(lsbMesi.SelectedItem)
While leggi.Peek <> -1
txbCompleanni.Text += leggi.ReadLine() & vbCrLf
End While
leggi.Close()
Dim lineCount As Integer = txbCompleanni.Lines.Count
If lineCount > 17 Then
txbCompleanni.Enabled = True
Else
txbCompleanni.Enabled = False
End If
lsbMesi.Enabled = False
End Sub

Nella directoty si salvano in base al mese della data di nascita della persona inserita quindi può essere "novembre" "gennaio" "giugno" ecc. Sfruttando la variabile "mes" è possibile fargli leggere i mesi in ordine (gennaio, febbraio ecc.)?
ringrazio anticipatamente e porgo cordiali saluti.
Maurizio