2011-10-21 2 views
10

Desidero sovrascrivere la funzione Incolla quando in una casella di testo specifica. Quando il testo viene incollato in quel testo, lo voglio per eseguire le seguenti operazioni:Sovrascrivi Incolla in TextBox

AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " "); 

(Cambiare da multilinea al singolo)

Come posso fare questo?

+2

controllare questo: http://stackoverflow.com/questions/3446233/hook-on-default-paste-event-of-winforms-textbox-control –

risposta

27

Questo è possibile, è possibile intercettare il messaggio di Windows a basso livello che il nativo TextBox di controllo ottiene che dice di incollare dagli Appunti. Il messaggio WM_PASTE. Generato sia quando si preme Ctrl + V con la tastiera o si utilizza il comando Incolla del menu di scelta rapida. Puoi prenderlo ignorando il metodo WndProc() del controllo, eseguendo la copia come desiderato e non passalo alla classe base.

Aggiungi una nuova classe al tuo progetto e copia/incolla il codice mostrato di seguito. Compilare. Rilasciare il nuovo controllo dalla parte superiore della casella degli strumenti sul modulo, sostituendo quello esistente.

using System; 
using System.Windows.Forms; 

class MyTextBox : TextBox { 
    protected override void WndProc(ref Message m) { 
     // Trap WM_PASTE: 
     if (m.Msg == 0x302 && Clipboard.ContainsText()) { 
      this.SelectedText = Clipboard.GetText().Replace('\n', ' '); 
      return; 
     } 
     base.WndProc(ref m); 
    } 
} 
+0

Lo metto in Program.cs o Form1.cs? E devo chiamarlo un po 'come? perché non funziona – cb1295

+2

Lo metti in una classe separata. Compilare. Rilasciare il nuovo controllo dalla parte superiore della casella degli strumenti sul modulo. –

+1

Questo codice ha fatto il lavoro, quindi ottieni la risposta. Grazie!!! – cb1295

5

Per intercettare i messaggi di controllo TextBox, derivare una classe da texbox e attuare

class MyTB : System.Windows.Forms.TextBox 
{ 

    protected override void WndProc(ref Message m) 
    { 
     switch (m.Msg) 
     { 

      case 0x302: //WM_PASTE 
       { 
        AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " "); 
        break; 
       } 

     } 

     base.WndProc(ref m); 
    } 

} 

suggerito here

+0

Se metto nel mio Form1.cs I ottenere il seguente errore: Errore Impossibile accedere a un membro non statico di tipo esterno tramite il tipo nidificato e Se inserisco in Program.cs Si dice che AddressTextBox non esiste nel contesto corrente. – cb1295

+2

Aggiungi una nuova classe attraverso il progetto-> Aggiungi nuovo elemento - il nome della classe è 'MyTb'. Quando costruirai il progetto, MyTB apparirà nella casella degli strumenti. Puoi posizionarlo sul tuo modulo. –

+0

Grazie per la spiegazione dettagliata, tuttavia il tuo codice non ha funzionato o non l'ho usato correttamente. Grazie comunque! – cb1295