2011-10-21 60 views
10

Tôi muốn ghi đè hàm dán khi trong một hộp văn bản cụ thể. Khi văn bản được dán vào textbox đó, tôi muốn nó thực hiện như sau:Ghi đè dán vào hộp văn bản

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

(Thay đổi từ multiline để đơn)

Làm thế nào tôi có thể làm điều này?

+2

việc kiểm tra này một: http://stackoverflow.com/questions/3446233/hook-on-default-paste-event-of-winforms-textbox-control –

Trả lời

27

Đó là có thể, bạn có thể đánh chặn các cấp thấp nhắn Windows mà các mẹ đẻ TextBox kiểm soát được để nó dán vào clipboard. Thông báo WM_PASTE. Được tạo ra khi bạn nhấn Ctrl + V bằng bàn phím hoặc sử dụng lệnh Dán của menu ngữ cảnh. Bạn nắm bắt nó bằng cách ghi đè phương thức WndProc() của điều khiển, thực hiện dán như mong muốn và không chuyển nó vào lớp cơ sở.

Thêm lớp mới vào dự án của bạn và sao chép/dán mã được hiển thị bên dưới. Biên dịch. Thả điều khiển mới từ đầu hộp công cụ lên biểu mẫu của bạn, thay thế hộp kiểm hiện có.

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

Tôi có đặt điều này trong Program.cs hoặc Form1.cs không? Và tôi có cần gọi nó như thế nào không? bởi vì nó không hoạt động – cb1295

+2

Bạn đặt nó trong một lớp riêng biệt. Biên dịch. Thả điều khiển mới từ đầu hộp công cụ lên biểu mẫu của bạn. –

+1

Mã này đã thực hiện công việc, vì vậy bạn nhận được câu trả lời. Cảm ơn!!! – cb1295

5

Để ngăn chặn các thông điệp kiểm soát hộp, dẫn xuất một lớp từ texbox và thực hiện

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

} 

gợi ý here

+0

Nếu tôi đặt điều này trong Form1.cs tôi của tôi nhận được lỗi sau: Lỗi Không thể truy nhập một thành viên không tĩnh của kiểu bên ngoài thông qua kiểu lồng nhau và Nếu tôi đưa vào Program.cs Nó nói rằng AddressTextBox không tồn tại trong ngữ cảnh hiện tại. – cb1295

+2

Thêm một lớp mới thông qua dự án-> Thêm mục mới - tên lớp là 'MyTb'. Khi bạn sẽ xây dựng dự án MyTB sẽ xuất hiện trong hộp công cụ. Bạn có thể đặt nó trên Form của bạn. –

+0

Cảm ơn bạn đã giải thích chi tiết, tuy nhiên mã của bạn đã không thực hiện các thủ thuật hoặc tôi đã không sử dụng nó một cách chính xác. Dù sao cũng cảm ơn! – cb1295

Các vấn đề liên quan