2012-08-29 43 views
17

Giả sử rằng tôi có dự án WinFoms. Chỉ có một nút (ví dụ: button1).Sự kiện của điều khiển kích hoạt lập trình

Câu hỏi đặt ra là: có thể kích hoạt sự kiện ButtonClicked qua mã mà không thực sự nhấp vào sự kiện đó không?

+2

vì câu hỏi này vẫn còn sống (tôi thậm chí còn nổi tiếng với nó :)), tôi muốn đặt ở đây một cảnh báo nhỏ: nếu bạn nghĩ rằng bạn cần làm điều gì đó như thế này trong mã của bạn hơn là chắc chắn bạn đang làm điều gì sai. Vì vậy, tôi đã làm I. Bạn có thể có một số thiết kế xấu và bạn nên dành thời gian, xem xét lại những gì bạn đang làm và tại sao. – steavy

+0

Tôi thực sự nghĩ rằng đó là một câu hỏi có liên quan, tôi muốn tạo một popup menu bao gồm tất cả các mục từ thanh công cụ cũng như menu ngữ cảnh đã có, phương thức PerformClick được đề cập bởi itsme86 đã giúp :-) – s1cart3r

Trả lời

29

Nút điều khiển có phương thức PerformClick() mà bạn có thể gọi.

button1.PerformClick(); 
+0

. , nhưng nếu tôi cần một sự kiện khác thì sao? – steavy

+2

Nói chung, bạn sẽ chỉ phải gọi trình xử lý sự kiện của mình theo cách thủ công. ví dụ: button1_Shown (button1, EventArgs.Empty); – itsme86

9

Bạn chỉ có thể gọi hàm xử lý sự kiện trực tiếp và chỉ định null cho người gửi và EventArgs.Empty cho các đối số.

void ButtonClicked(object sender, EventArgs e) 
{ 
    // do stuff 
} 

// Somewhere else in your code: 
button1.Click += new EventHandler(ButtonClicked); 

// call the event handler directly: 
ButtonClicked(button1, EventArgs.Empty); 

Hay nói đúng hơn, bạn muốn di chuyển logic ra khỏi sự kiện ButtonClicked vào chức năng riêng của mình, và sau đó xử lý sự kiện của bạn và mã khác mà bạn có sẽ lần lượt gọi hàm mới.

void StuffThatHappensOnButtonClick() 
{ 
    // do stuff 
} 

void ButtonClicked(object sender, EventArgs e) 
{ 
    StuffThatHappensOnButtonClick(); 
} 

// Somewhere else in your code: 
button1.Click += new EventHandler(ButtonClicked); 

// Simulate the button click: 
StuffThatHappensOnButtonClick(); 

Phương pháp thứ hai có lợi thế cho phép bạn tách biệt doanh nghiệp và logic giao diện người dùng. Bạn thực sự không bao giờ nên có bất kỳ logic nghiệp vụ nào trong trình xử lý sự kiện kiểm soát của mình.

1
button1.PerformClick(); 

Nhưng nếu bạn phải làm điều gì đó như thế này thì tốt hơn bạn nên chuyển mã bạn có trong sự kiện theo phương pháp mới?

4

Có, chỉ cần gọi phương thức theo cách bạn sẽ gọi cho bất kỳ phương thức nào khác. Ví dụ:

private void btnSayHello_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Hello World!"); 
    } 

    private void btnTriggerHello_Click(object sender, EventArgs e) 
    { 
     btnSayHello_Click(null, null); 
    } 
+2

Tôi không cần gọi phương thức xử lý. Tôi cần kích hoạt sự kiện. Trình xử lý được gọi sau khi kích hoạt sự kiện. – steavy

17

Khung NET sử dụng một mô hình nơi cho tất cả các sự kiện X có một phương pháp protected void OnX(EventArgs e) {} đó làm tăng sự kiện X. Xem này Msdn article. Để nâng cao một sự kiện từ bên ngoài lớp khai báo, bạn sẽ phải lấy được lớp và thêm một phương thức trình bao bọc công khai. Trong trường hợp của Button nó sẽ trông như thế này:

class MyButton : System.Windows.Forms.Button 
{ 

    public void ProgrammaticClick(EventArgs e) 
    { 
     base.OnClick(e); 
    } 

} 
0

sử dụng một vòng lặp for để gọi sự kiện button_click

private void btnadd_Click(object sender, RoutedEventArgs e) 
{ 
    for (int i = 0; i <= 2; i++) 
     StuffThatHappensOnButtonClick(); 
} 


void StuffThatHappensOnButtonClick() 
{ 
    ........do stuff 
} 

chúng tôi giả định ít nhất một thời gian bạn cần click vào nút

+2

c'mon dude! làm thế nào trên trái đất là điều này liên quan đến câu hỏi? – chouaib

1

Tại sao bạn không chỉ cần đặt mã sự kiện của bạn vào một phương pháp. Sau đó, có sự kiện thực hiện phương pháp. Bằng cách này, nếu bạn cần thực thi cùng một mã mà Sự kiện tăng lên, bạn có thể, nhưng đơn giản chỉ cần gọi "Phương thức".

void Event_Method() 
{ 
    //Put Event code here. 
    MessageBox.Show("Hello!"); 
} 

void _btnSend_Click(object sender, EventArgs e) 
{ 
    Event_Method(); 
} 

void AnotherMethod() 
{ 
    Event_Method(); 
} 

Có ý nghĩa? Bây giờ sự kiện "Nhấp" và bất kỳ nơi nào trong mã, bạn có thể kích hoạt cùng mã với sự kiện "Nhấp".

Không kích hoạt sự kiện, gọi phương thức mà sự kiện gọi. ;)

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