Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    1,968

    [VB.NET] Impostare numero max di righe e di carattere per linea in una TextBox multiline

    Ciao a tutti!
    Ho una textbox multiline nella quale devo limitare il numero di caratteri per linea nonchè il numero max di numero di linee.

    Non posso usare la funzione wordwrap automatica in quanto ho riscontrato che se anche va a capo da sola quando si raggiunge il margine destro della textbox non crea materialmente una nuova linea!

    Quindi sto cercando di muovermi da sola a runtime...

    Sono riuscita a limitare il numero di linee con questa sub:

    codice:
        Private Sub miaTxt_TextChanged(sender As Object, e As EventArgs) Handles miaTxt.TextChanged
            If miaTxt.Lines.Count > 2 Then
                Dim newList As List(Of String) = miaTxt.Lines.ToList
                newList.RemoveAt(newList.Count - 1)
                miaTxt.Lines = newList.ToArray
                miaTxt.SelectionStart = miaTxt.Text.Length + 1
            End If
        End Sub
    Il problema è che col wordwrap disabilitato posso arrivare a N caratteri per riga mentre io vorrei limitarli ad un un numero finito e qui mi sono inceppata!
    Avete consigli?

    Grazie a tutti e buona domenica

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,208
    Io non ho capito cosa intendi quando scrivi:
    ... posso arrivare a N caratteri per riga mentre io vorrei limitarli ad un un numero finito
    Esattamente, qual'è il problema?
    Se ti basta leggere il numero di caratteri, usa TextLength.

  3. #3
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    1,968
    Detto così sembra semplice lo so ma quando provo a "implementare" la cosa nella funzione sopra mi inceppo!

    Adesso riprovo!

  4. #4
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    1,968
    Ok mi ci son messa di impegno e credo di aver risolto!
    Con questo codice che ho scritto nell'evento KeyDown della textbox funziona tutto:

    codice:
     Dim txt As TextBox = CType(sender, TextBox)
            If e.KeyCode <> Keys.ShiftKey And e.KeyCode <> Keys.LShiftKey And e.KeyCode <> Keys.RShiftKey And e.KeyCode <> Keys.Alt And e.KeyCode <> Keys.LControlKey And
                e.KeyCode <> Keys.RControlKey And e.KeyCode <> Keys.ControlKey And txt.Lines.Count > 0 Then
    
                Dim nCharMax As Integer = 10
                Dim nLineMax As Integer = 2
                Dim lineaCorrente As Integer = CType(txt.GetLineFromCharIndex(txt.SelectionStart), Integer)
                If e.KeyCode = Keys.Return Then
                    If txt.Lines.Count >= nLineMax Then
                        e.SuppressKeyPress = True
                        Beep()
                        e.Handled = True
                    End If
                Else
                    If txt.Lines(lineaCorrente).Length > nCharMax - 1 Then
                        If lineaCorrente < nLineMax - 1 Then
                            txt.AppendText(Environment.NewLine)
                            e.Handled = True
                        Else
                            e.SuppressKeyPress = True
                            Beep()
                            e.Handled = True
                        End If
                    End If
                End If
            End If
    L'unica eventualità di eccezione è nel 1° if dove escludo il keyDown dei tasti SHIFT, ALT ecc (se ne ho dimenticato qualcuno avrò un'eccezione con molta probabilità!!!

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,208
    Solo adesso ho capito quello che volevi dire. Mi spiace, ma vedo che hai risolto ugualmente. Buon per te.

    Io imposterei anche ShortcutsEnabled su False per evitare che l'utente faccia copia & incolla, altrimenti le tue fatiche...
    ...se ne vanno a benedire.

  6. #6
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    1,968
    Quote Originariamente inviata da gibra Visualizza il messaggio
    Solo adesso ho capito quello che volevi dire. Mi spiace, ma vedo che hai risolto ugualmente. Buon per te.

    Io imposterei anche ShortcutsEnabled su False per evitare che l'utente faccia copia & incolla, altrimenti le tue fatiche...
    ...se ne vanno a benedire.
    Esattamente! La mia paura era quella! I copia e incolla ecc ed infatti mi sono letterlamente scervellata ed alla fine ho risolto al 100%!!
    Con un blocco di codice tra l'altro molto più leggero!

    In sostanza ad ogni TextChanged delle varie textbox richiamo la mia bella sub pubblica che:
    • Prende il testo globale
    • Lo ripulisce dai vari ritorni a capo (che a quanto pare fanno "length" )
    • E lo frammenta in base ai carrateri max
    • Stocca tutto in un array di stringhe (che saranno le future linee della textbox)
    • E reimposta quell'array come proprietà "lines" della textbox


    Risultato? Funziona benissimo ma soprattutto posso usare i copia/incolla ed affini!!!

    Ecco la soluzione:

    codice:
        Public Sub maxLineAndChars(ByVal txt As TextBox, ByVal nLinesMax As Integer, ByVal nCharsMax As Integer)
          If txt.Text.Length > 0 Then
                Dim txtPulito As String = Strings.Replace(txt.Text, Environment.NewLine, String.Empty)
    
                If txtPulito.Length > nCharsMax Then
                    Dim linee(nLinesMax - 1) As String
                    For i = 0 To nLinesMax - 1
                        Dim startStr As Integer = (i * nCharsMax) + 1
                        linee(i) = Strings.Mid(txtPulito, startStr, nCharsMax)
                    Next
                    txt.Lines = linee
                    txt.SelectionStart = txt.Text.Length
                End If
            End If
        End Sub
    mi basta chiamare con

    codice:
    maxCharsLines(sender,20,4)
    ad ogni textChanged delle mie textbox ed il gioco è fatto!
    Ultima modifica di Veronica80; 05-03-2019 a 18:07

  7. #7
    Utente di HTML.it L'avatar di patel
    Registrato dal
    Jan 2008
    Messaggi
    1,892
    molto interessante, l'unico difetto che trovo è il cursore che va dove gli pare quando termina la prima riga

  8. #8
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    1,968
    Beh quello lo puoi tranquillamente risolvere con un bel

    miaTxt.selectionStart=miaTxt.length

    messo dopo l'esecuzione della funzione!

  9. #9
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    1,968
    Comunque sto lavorando a una funzione perfezionata che manda anche a capo le parole sentra troncarle (a meno che la parola non superi da sola i cartteri max della linea)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.