Gọi event trong C# (WPF) kèm thêm giá trị như javascript được không?

Cho em hỏi có cách nào để kèm thêm giá trị khi gọi event trong C# như là javascript được không ạ?

function GoiEvent(n){
    ..........
}

Như event javascript trên khi gọi có thể kèm thêm giá trị n. Liệu C# có làm được chức năng tương tự không ạ? Nếu có mong mọi người chỉ rõ ạ! Xin cảm ơn.

Event trong C# có tham số được định nghĩa trong kiểu delegate mà dùng khai báo event.
Khi gọi event phải truyền đúng kiểu dữ liệu. Khi khai báo hàm cho event phải đúng kiểu tham số.

Tóm lại là không ::))

Em tưởng có chứ, nếu như ép kiểu tham số?
Event thông thường sẽ có dạng, như vậy có thể gọi hàm. n trong câu hỏi của bạn thớt tương đương với e, còn sender nếu muốn gọi trên đúng object mà định nghĩa event này thì là this

void EventName(System.Object sender, <even parameter type> e)
{
    ...
}

C#, ví dụ button thì Click nó sẽ có tham số (object sender, RountedEvent e).
Nội tại trong lớp Button nếu muốn “bắn” ra 1 event phải gọi Click(obj,e). Một funtion bên ngoài Button muốn đăng ký vào sự kiện Click cũng phải có dạng f(obect,RountedEvent).

Trong javasrcipt, người ta có thể khai báo một funtion có tham số khác nhau. Và trong mã html đều đăng ký được.
Ví dụ:
Javascript khai báo 2 kiểu hàm

function onClick(){}
function onClick2(e){}

Html đều đăng ký 2 kiểu hàm với click

<input type="submit" onclick="onClick()">
<input type="submit" onclick="onClick2(event)">

Chủ bài đang viết WPF và chắc đang học viết mã xaml. Nên chắc đang liên tưởng tới html và javascript.

1 Like

Thực ra thì

<input type="submit" onclick="onClick()">
<input type="submit" onclick="onClick2(event)">

Khi chuyển sang XAML + C# sẽ phức tạp hơn:

XAML:
<Button x:Name="Button_ahjhj" Click="Button_ahjhj_Click1"/>

C#:
void Button_ahjhj_Click1(object sender, RoutedEventArgs e)
{
    onClick();
}
void Button_ahjhj_Click2(object sender, RoutedEventArgs e)
{
    onClick2(e);
}

Thay vì dùng XAML, có thể dùng C#, như vậy có thể thay đổi được hàm trong runtime:

Button_ahjhj.Click += Button_ahjhj_Click1;
void Button_ahjhj_Click1(object sender, RoutedEventArgs e)
{
    onClick();
}
1 Like

Cái này là phương pháp khác rồi :slight_smile:
Vẫn không giống html vs javascript.

Cách của bác @noz1995 em thực sự không nghĩ ra!
Em nghĩ C# cũng có cách thêm tham số vào event, ai ngờ không có… Cũng hơn buồn… Mà thôi, cảm ơn hai bác đã giải đáp thắc mắc!

Biết sao giờ, C# nó kiểm soát chặt chẽ về kiểu dữ liệu, đâu có raise event lung tung được đâu. XAML nó cũng chặt chẽ, không lỏng lẻo như HTML.

Hi Trần Linh.
Mình thấy chẳng cần thêm tham số làm gì. Nó đăng ký từng sự kiện riêng rồi thêm tham số làm phức tạp ra.

Em nghĩ tham số thêm vào cho đỡ phải viết thêm event thôi, mà không có cũng đành chịu!

Hi Trần Linh.
Code một cách rõ ràng thì bạn vẫn phải switch-case rồi viết hàm con tương úng thôi.

Cái sender và e nó đã chứa toàn bộ thông tin về sự kiện rồi. Bây giờ bạn muốn thêm như javascript và html thì bạn sẽ lấy tham số ở đâu để truyền vào ???

Em chưa hiểu ý anh lắm, anh nói rõ hơn được không???

Ví dụ với 1 hàm phục vụ cho sự kiện Click của 1 button. Nó sẽ có dạng thế này:

private void Function(object sender, RountedEventArgs e){
}

Trong đó ta thấy có xuất hiện 2 tham số sender và e.
sender mang thông tin về đối tượng đã “ném ra” sự kiện. Nó chính là cái button mà ta click vào. Còn e, nó sẽ mang gần như toàn bộ các thông tin khác về sự kiện click như chuột trái hay phải, toạ độ chuột…

Với 2 tham số đó đủ để viết đọan code phục vụ cho click. Việc chọn tham số đưa vào như javascript và html là không cần thiết.

2 Likes

Mình đã nói ở trên, n trong câu hỏi của bạn chính là e mà :)) Ngoài ra, event trong C# còn có sender, nên từ form này có thể gọi sự kiện sang form khác, thậm chí sang project khác luôn, khá linh động.

2 Likes

Cái sender trong C# là một cái rất hữu dụng. Nó cho biết nguồn gốc của sự kiện được “ném” ra từ đâu. Với nhiều đối tượng có hành vi giống nhau, ví dụ các nút nhấn trên một bàn phím ảo, hay dãy phím của đàn piano, ta có thể viết một hàm duy nhất và witch-case với sender thay phải viết vài chục hàm giống nhau cho từng cái.

Có sender rồi và WPF có binding nữa thì hạn chế tối đa việc đặt tên các control.

2 Likes

Em cảm ơn! Còn nhiều cái em phải học quá!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?