2011-10-21 20 views
10

Chcę zastąpić funkcja wklejania w określonym polu tekstowym. Kiedy tekst zostanie wklejony w to pole tekstowe, chcę go wykonać następujące czynności:Zastąpić Wklej w TextBox

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

(Zmiana z multilinii do single)

Jak mogę to zrobić?

+2

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

Odpowiedz

27

To możliwe, można przechwycić wiadomość niskiego poziomu systemu Windows, że rodzimy TextBox kontrola dostaje który każe mu wkleić ze schowka. Komunikat WM_PASTE. Generowane zarówno po naciśnięciu Ctrl + V na klawiaturze, jak i przy użyciu polecenia Wklej w menu kontekstowym. Łapiesz to przez przesłonięcie metody kontrolnej WndProc(), wykonanie pasty zgodnie z życzeniem i , a nie przekazanie jej do klasy bazowej.

Dodaj nową klasę do swojego projektu i skopiuj/wklej poniższy kod. Skompilować. Upuść nową kontrolę z góry przybornika na formularz, zastępując istniejący.

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

Czy umieściłem to w pliku Program.cs lub Form1.cs? I czy muszę to tak nazwać? ponieważ to nie działa – cb1295

+2

Umieszczasz to w osobnej klasie. Skompilować. Rzuć nową kontrolę z góry przybornika na formularz. –

+1

Ten kod wykonał zadanie, więc otrzymasz odpowiedź. Dzięki!!! – cb1295

5

przechwytywać wiadomości w kontroli tekstowym czerpią klasę z TexBox i wdrożyć

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); 
    } 

} 

zasugerował here

+0

Jeśli mogę umieścić w moim Form1.cs I Otrzymaj następujący błąd: Błąd Nie można uzyskać dostępu do niestatycznego elementu typu zewnętrznego za pomocą typu zagnieżdżonego i Jeśli wstawię do pliku Program.cs Mówi on, że pole AddressTextBox nie istnieje w bieżącym kontekście. – cb1295

+2

Dodaj nową klasę poprzez projekt-> Dodaj nowy element - nazwa klasy to 'MyTb'. Kiedy zbudujesz projekt MyTB pojawi się w skrzynce narzędziowej. Możesz umieścić go na swoim formularzu. –

+0

Dziękuję za szczegółowe wyjaśnienie, jednak Twój kod nie załatwił sprawy lub nie użyłem go poprawnie. W każdym razie dzięki! – cb1295