2011-12-27 33 views
72

Tôi có EventHandler sau mà tôi đã thêm một tham số MusicNote âm nhạc:đèo tham số để EventHandler

public void PlayMusicEvent(object sender, EventArgs e,MusicNote music) 
{ 
    music.player.Stop(); 
    System.Timers.Timer myTimer = (System.Timers.Timer)sender; 
    myTimer.Stop(); 
} 

tôi cần phải thêm xử lý để một Timer như vậy:

myTimer.Elapsed += new ElapsedEventHandler(PlayMusicEvent(this, e, musicNote)); 

nhưng có được lỗi:

"Method name expected"

EDIT: Trong trường hợp này, tôi chỉ cần vượt qua e fro m phương pháp chứa đoạn mã này, làm cách nào để chuyển số EventArgs của bộ tính giờ?

+5

Tuy nhiên, câu trả lời cho câu hỏi trùng lặp sẽ bị hút. Câu trả lời hàng đầu ở đây phải là câu trả lời kinh điển. –

Trả lời

183

Timer.Elapsed mong đợi phương thức chữ ký cụ thể (với đối số objectEventArgs). Nếu bạn muốn sử dụng phương pháp PlayMusicEvent của bạn với đối số bổ sung đánh giá trong đăng ký sự kiện, bạn có thể sử dụng biểu thức lambda như một adapter:

myTimer.Elapsed += new ElapsedEventHandler((sender, e) => PlayMusicEvent(sender, e, musicNote)); 

Edit: bạn cũng có thể sử dụng phiên bản ngắn hơn:

myTimer.Elapsed += (sender, e) => PlayMusicEvent(sender, e, musicNote); 
+1

Cảm ơn nó đã hoạt động! Tôi đã phải thay đổi tên của người gửi và e trong tập đầu tiên của dấu ngoặc bởi vì chúng giống như trong phương thức chứa. Bạn có thể giải thích cho tôi những gì họ đang có? tức là sự khác nhau giữa người gửi, e trong khung đầu tiên và số người trong giây thứ hai là gì? – Matt

+3

'(người gửi, e) => PlayMusicEvent (người gửi, e, musicNote)' là phương thức ẩn danh. Giá trị trong dấu ngoặc đơn đầu tiên là tên và giá trị tham số thực tế trong dấu ngoặc đơn là sử dụng các tham số thực tế. Hãy suy nghĩ về nó như là hình thức ngắn cho 'void NONAME (var người gửi, var e) {PlayMusicEvent (người gửi, e, musicNote); } 'trong đó các tên tham số được suy ra từ ngữ cảnh và' musicNote' được lấy từ các biến cục bộ. Dòng này tạo một phương thức mới sử dụng phương thức của bạn và đặt nó làm trình xử lý cho sự kiện của bộ hẹn giờ. – MagnatLU

+11

Và làm thế nào để loại bỏ 'eventHandler' này? '- =' không hoạt động. – Houssni

3

Nếu tôi hiểu vấn đề của bạn một cách chính xác, bạn đang gọi một phương thức thay vì chuyển nó thành một tham số. Hãy thử như sau:

myTimer.Elapsed += PlayMusicEvent; 

nơi

public void PlayMusicEvent(object sender, ElapsedEventArgs e) 
{ 
    music.player.Stop(); 
    System.Timers.Timer myTimer = (System.Timers.Timer)sender; 
    myTimer.Stop(); 
} 

Nhưng bạn cần phải suy nghĩ về nơi để lưu trữ ghi chú của bạn.

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