2009-04-26 31 views
7

Nếu actions là Bảng điều khiển, tôi có thể tăng sự kiện Click của sự kiện đó không? Tôi có mã này vào lúc này, nhưng sự kiện Click không phải là một phương pháp, vì vậy mã này không hợp lệ.
Có ai biết làm thế nào tôi có thể đạt được điều này?Tăng sự kiện của đối tượng bên ngoài trong C#

actions.Click += delegate(object Sender, EventArgs e) 
{ 
    ((Panel)Sender).Parent.Click(); 
} 

Trả lời

9

Nó không thể nâng cao một C# event trực tiếp từ class khác (ngay cả khi nó public). Bạn có thể cung cấp một phương thức (với một công cụ sửa đổi truy cập đầy đủ) làm tăng số event thay mặt bạn và gọi phương thức đó trong class khác.

Nhân tiện, điều này có thể xảy ra với sự phản ánh, nhưng tôi cho rằng một vụ tấn công dơ bẩn.

+0

Tôi có thể tạo ra một lớp Bảng điều chỉnh mới kế thừa cái cũ, và sau đó thêm một phương pháp để nâng cao sự kiện Click ? –

+0

Có. Bạn nên làm điều đó. –

+0

Xin lỗi nó không phải là một thủ thuật bẩn, nó có vị trí của nó trong AoP để bạn không viết NotifyPropertyChanged cho mỗi tài sản trong lớp học của bạn và trong quá trình lộn xộn mô hình của bạn. – Alwyn

1

Tùy thuộc vào khung bạn đang sử dụng, bạn không cần phải gọi sự kiện nhấp theo cách thủ công trên phụ huynh, WPFASP.NET ví dụ sự kiện bong bóng lên cây phần tử.

Nếu đó không phải là tùy chọn bạn có thể làm như Mehrdad đề xuất.

6

Hầu hết các loại trong CLR làm tăng sự kiện đều có phương thức On [EventName] được bảo vệ giúp xử lý sự kiện. Bạn có thể gọi phương thức được bảo vệ này "từ bên ngoài" bằng cách sử dụng Phản ánh:

Control parent = ((Control)sender).Parent; 
Type parentType = parent.GetType(); 
MethodInfo onClickMethod = parentType.GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic); 

onClickMethod.Invoke(parent, new object[] { e }); 
1

Lý do duy nhất tôi có thể nghĩ vì sao bạn muốn tăng sự kiện nhấp là nếu bạn mô phỏng đầu vào của người dùng. Bạn đang làm việc trên một trình điều khiển thử nghiệm tự động hoặc một cái gì đó như thế? Nếu có, có thể có các giải pháp tốt hơn so với việc bắt nạt mã với các phương thức phụ trợ chỉ thử nghiệm. This xuất hiện lần đầu tiên trên google, tôi không biết liệu nó có tốt hay không.

Nếu bạn đang cố gắng làm điều này như một loại điều khiển lưu lượng trong ứng dụng của mình, tôi sẽ lùi lại một bước để xem đây có phải là điều đúng hay không - đó là loại "có mùi xấu" .

+0

Tôi đang cố gắng để có được sự kiện Click để bong bóng lên, tôi không sử dụng WPF, do đó, nó không xảy ra tự động. –

2

tôi thực hiện điều này sử dụng phản ánh và mở rộng các phương pháp vì vậy mà tôi chỉ có thể gọi (trong trường hợp này) một sự kiện click LinkLabel bằng cách chỉ cần gọi:

var link = new LinkLabel()' 
link.Text = "Some link"; 
link.click(); 

các nhấp chuột() phương pháp là một C phương pháp # mở rộng:

public static void click(this LinkLabel linkLabel) 
{ 
    var e = new LinkLabelLinkClickedEventArgs((LinkLabel.Link)(linkLabel.prop("FocusLink"))); 
    linkLabel.invoke("OnLinkClicked", e); 
} 

trong đó sử dụng một phương pháp khuyến nông để:

  • có được một tài sản cá nhân từ LinkLa bel (cần thiết để tạo ra các đối tượng LinkLabelLinkClickedEventArgs)
  • gọi phương thức OnLinkClicked (mà sẽ cháy sự kiện
Các vấn đề liên quan