2011-12-16 15 views
7

Vâng, tôi đang viết một tệp các tiện ích mở rộng/phương pháp hữu ích cho các chuỗi, nhãn, liên kết, lớp học, v.v.cách sử dụng phương thức Gọi trong tệp mở rộng/phương pháp?

nhưng, tôi gặp sự cố. Tôi có phương thức showMessage() thay đổi Văn bản của nhãn, hoạt động tốt. Nhưng tôi quyết định làm điều đó làm việc với thực hiện chủ đề, sau đó tôi làm điều này:

namespace LabelExtensions 
{ 
    public static class LabelExtensionsClass 
    {   
     private delegate void UpdateState(); 

     public static void ShowMessage(this Label label, string text) 
     { 
      if (label.InvokeRequired) 
      { 
       label.Invoke((UpdateState)delegate 
       { 
        label.Text = text; 
       }); 
      } 
      else 
      { 
        label.Text = text; 
      } 
     } 
} 
} 

xin lỗi, đó là một lỗi đánh máy. Tôi đã gõ mã này trên diễn đàn. lỗi tiếp tục.

theo các documentation, sử dụng các phương pháp cần Invoke để nhập khẩu:

Namespace: System.Windows.Forms

hội: System.Windows.Forms (trong System.Windows.Forms .dll)

sau đó tôi đã làm:

using System.Windows.Forms; 

nhưng điều này trả về cùng một lỗi:

The name 'Invoke' does not exist in the current context 

cách khắc phục sự cố này?

Xin cảm ơn trước.

+0

Bạn có thể sử dụng đại diện 'Hành động 'hiện có; bạn không cần phải tạo của riêng bạn. – SLaks

+0

Có thể, '(label.TopLevelControl as Form) .Invoke' – Joe

+0

@SLaks: Cảm ơn :) –

Trả lời

8

Tại sao không chỉ làm điều này:

label.BeginInvoke((Action) (() => label.Text = text)); 

Không cần để tạo ra đại biểu của riêng bạn. Chỉ cần sử dụng được xây dựng trong Action đại biểu. Có lẽ bạn nên tạo phương thức mở rộng của mình cho lớp cơ sở Control thay vì lớp Nhãn. Nó sẽ được tái sử dụng nhiều hơn.

1

Bạn quên để xác định nhãn trong mã của bạn (khi bạn gọi phương thức Invoke):

public static void ShowMessage(this Label label, string text) 
     { 
      if (label.InvokeRequired) 
      { 
       lablel.Invoke((UpdateState)delegate 
       { 
        label.Text = text; 
       }); 
      } 
      else 
      { 
        label.Text = text; 
      } 
     } 

cũng có, xem xét sử dụng BeginInvoke thay vì vậy bạn sẽ không chặn các thread kêu gọi (nếu có)

3

Thay đổi

Invoke((UpdateState)delegate … 

để

label.Invoke((UpdateState)delegate … 
+0

Chính xác. Phương thức "Invoke" bạn cần là một thành viên của lớp System.Windows.Forms.Control, từ đó Label bắt nguồn. Lớp LabelExtensions tĩnh của bạn không có phương thức "Gọi". – KeithS

+0

xin lỗi, đó là lỗi đánh máy. :( –

1

Invoke là phương thức thể hiện của Control.
Bạn cần Control để gọi điện, chẳng hạn như label.

+0

xin lỗi, đó là một lỗi đánh máy. :( –

+0

@ TheMask: Nó có hoạt động không? – SLaks

1

Bạn không cần khai báo loại đại biểu mới hoặc xây dựng lambda mới hoặc đại biểu ẩn danh. Bạn đã có một phương thức hoạt động trên chuỗi giao diện người dùng - phương thức bạn đang viết. Chỉ cần làm cho nó gọi chính nó trên thread UI nếu cần thiết, như thế này.

public static void ShowMessage(this Label label, string text) { 

    if(label.InvokeRequired) { 
     label.Invoke(new Action<Label, string>(ShowMessage), label, text); 
     return; 
    } 

    label.Text = text; 
} 

Ưu điểm của phương pháp này là bạn có thể sao chép và dán khối mã chuyển hướng từ phương pháp này sang bất kỳ phương pháp nào khác mà bạn muốn sửa đổi theo cùng một cách.

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