WinForms Multiline Textbox, Enter insiste per spostare il focus fuori dalla casella di testo

StackOverflow https://stackoverflow.com/questions/467656

Domanda

Ho una casella di testo multilinea e un pulsante sotto di essa.

VB.NET, WinForms, .NET 2.0

System.Windows.Forms.TextBox

Multiline = True

AcceptsReturn = True

AcceptsTab = False

CauseValidation = False

Nessun evento codificato in modo esplicito.

Vorrei che il tasto Invio inserisse feed di riga e non spostassi mai lo stato attivo sul controllo successivo (il pulsante).

Vorrei che il tasto Tab sposta sempre lo stato attivo sul controllo successivo nell'ordine di tabulazione (il pulsante).

Quello che succede invece è che il tasto Invio inserisce un avanzamento riga e quindi sposta lo stato attivo sul controllo successivo (il pulsante). Lo fa anche con Ctrl-Enter, il che mi sconcerta davvero!

Con la mia lettura dei file di aiuto e una vasta ricerca su Google, dovrebbe funzionare nel modo in cui ne ho bisogno. Ma ovviamente mi manca qualcosa. Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione 3

Si è scoperto che avevo dimenticato di averlo fatto (sotto) altrove nella stessa forma:

'http://duncanmackenzie.net/blog/Enter-Instead-of-Tab/default.aspx
Protected Overrides Sub OnKeyUp(ByVal e As System.Windows.Forms.KeyEventArgs)
    If e.KeyCode = Keys.Enter Then
        e.Handled = True
        Me.ProcessTabKey(Not e.Shift)
    Else
        e.Handled = False
        MyBase.OnKeyUp(e)
    End If
End Sub

Altri suggerimenti

Un metodo che uso spesso per questo tipo di problema consiste nell'aggiungere e sottrarre iterativamente il codice fino a quando non riesco a restringerlo all'unica cosa che ha causato il problema.

Ad esempio, potresti iniziare realizzando un progetto molto semplice con solo una casella di modifica e un altro controllo, e vedere cosa fa. Se questo codice si comporta nel modo desiderato, è possibile iniziare ad aggiungere il codice bit per bit, avvicinando il progetto semplice al prodotto finale previsto, fino a quando non viene visualizzato il bug. Quindi osserva l'ultimo bit di codice che hai aggiunto e vedi se riesci a sottrarre i bit fino a quando il bug non scompare. La ripetizione di alcune volte potrebbe aiutarti a trovare il colpevole.

In alternativa, potresti iniziare con il tuo codice (malfunzionante) esistente e iniziare a semplificarlo fino a quando il bug non scompare. Quindi aggiungi di nuovo parte dell'ultima cosa che hai eliminato e ripeterai come sopra.

Infine, in questo caso potresti anche provare ad aggiungere un gestore di eventi per il controllo di modifica Lascia e inserisci un punto di interruzione nel gestore. Quando la BP colpisce, controlla il callstack e vedi se riesci a farti un'idea di quale codice abbia scatenato il cambio di focus. Affinché ciò funzioni, il debugger dovrà probabilmente essere configurato per visualizzare il codice per il quale non si dispone del codice sorgente (ovvero disabilitare l'opzione Just My Code nel debugger). Potresti anche incollare un callstack (tagliato) nella domanda se vuoi ottenere l'aiuto del gruppo nel decifrarlo.

p.s. Qualcuno ha un nome per il metodo di debug iterativo descritto sopra? In caso contrario, posso proporre di chiamarlo Metodo di Newton (o forse Newtoning), dal momento che ricorda il Metodo di Newton per trovare iterativamente radici di funzioni matematiche.

Non dovrebbe assolutamente farlo. L'unica cosa che posso pensare è che non ha un'altezza sufficiente per ospitare più linee. Prova ad aggiungere ...

textBox1.ScrollBars = ScrollBars.Vertical

Altrimenti non lo so. Prova a creare un progetto vuoto e creare un modulo con una casella di testo, un pulsante per impostare le proprietà e vedere cosa succede ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top