2010-10-01 32 views
8

Tôi có một USerControll, trong đó tôi có một hộp văn bản. Tôi sử dụng usercontrol dưới dạng của tôi, tôi muốn làm điều gì đó khi ai đó nhấn enter vào hộp văn bản. tôi làm nó như thế nào? nếu bạn cho tôi biết cách gọi một sự kiện theo cách thủ công, tôi có thể gọi usercontrol.keydown trong textbox.keydown.Cách gọi một sự kiện thủ công trong C#?

+0

Vì vậy, bạn muốn tăng sự kiện UserControl.KeyDown từ trình xử lý sự kiện TextBox.KeyDown, đúng không? – dtb

+0

Vì vậy, phản hồi sự kiện khi người dùng thực sự nhấn phím tắt không đủ cho kịch bản của bạn? Tôi nghĩ rằng tôi đang thiếu một cái gì đó trong kịch bản của bạn. – RQDQ

+0

@dtb: vâng, chỉ cần – Saeed

Trả lời

10

Đầu tiên, sự kiện chỉ có thể được tăng từ mã trong kiểm soát tuyên bố sự kiện. Vì vậy, điều khiển người dùng của bạn phải khai báo KeyDown sự kiện tùy chỉnh để tăng nó. Ví dụ, bạn không thể tăng KeyDown trên một TextBox chứa bởi điều khiển người dùng của bạn. Tuy nhiên, bạn có thể khai báo KeyDown của riêng bạn, và đính kèm một trình xử lý vào KeyDown của TextBox để tăng KeyDown của riêng bạn.

Với hạn chế này, nâng cao một sự kiện rất dễ dàng:

public delegate void MyEventHandler(object sender, MyEventArgs e) 

public event MyEventHandler MyEvent; 

public void RaisesMyEvent() 
{ 
    ... 

    if(MyEvent != null) //required in C# to ensure a handler is attached 
     MyEvent(this, new MyEventArgs(/*any info you want handlers to have*/)); 
} 

Nâng cao một sự kiện trông giống như một phương pháp, bởi vì trong bản chất đó là những gì bạn đang làm; bạn đang gọi một hoặc nhiều đại biểu phương thức được gán cho đại biểu MultiCast phía sau cảnh của sự kiện của bạn. Hãy suy nghĩ về nó như gán một phương thức cho một đại biểu được đặt tên thông thường (như nếu bạn bỏ qua từ khóa "sự kiện" từ định nghĩa) và gọi nó từ bên trong mã của bạn. sự khác biệt duy nhất giữa một sự kiện thực sự và đó là một sự kiện có thể có nhiều hơn một đại biểu xử lý gắn liền với nó, và sẽ gọi tất cả chúng khi được nâng lên.

+0

Thật không may, mã này không phải là chủ đề an toàn. Bạn cần tạo một bản sao cục bộ 'MyEvent' để lưu-bảo vệ chống lại' NullReferenceExceptions' phát sinh khi một luồng khác đồng thời loại bỏ tất cả các trình xử lý sự kiện giữa 'if' và lời gọi sự kiện. –

+0

... Hoặc khóa (MyEvent()) trước khi đánh giá nếu và phát hành sau đó. Câu hỏi đơn giản là về việc nâng cao một sự kiện và đó là những gì tôi đã trả lời; nếu anh ta gắn và tách các bộ xử lý willy-nilly, điều đó cho thấy kiến ​​thức tiên tiến hơn về các sự kiện nói chung, loại trừ nhu cầu đặt câu hỏi. – KeithS

+0

Bạn đúng về nguyên tắc nhưng đó không phải là ý tôi: sao chép sự kiện tại địa phương là một thực hành tốt nhất được thiết lập vững chắc. * Không * mã tăng sự kiện nên được viết mà không có nó, thậm chí không phải là một ví dụ (vì nếu bạn không mong đợi vấn đề đa luồng, bạn sẽ không nghĩ đến nó). Việc đính kèm sự kiện nilly-willy không phải là điều mà mã kiểm soát của người dùng có thể kiểm soát - tùy thuộc vào người dùng. Là mã có thể sử dụng lại, mã kiểm soát người dùng phải mạnh mẽ nhất có thể. –

0

Những gì bạn mô tả được gọi là sự kiện bubbling. Dưới đây là một ví dụ:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyUserControl.ascx.cs" Inherits="MyUserControl" %> 

<asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox1_TextChanged" /> 

public partial class MyUserControl : UserControl 
{ 
public event EventHandler UserControlTextBoxChanged; 

protected void TextBox1_TextChanged(object sender, EventArgs e) { 
    if (UserControlTextBoxChanged != null) 
    UserControlTextBoxChanged(sender, e); 
} 
} 

<%@ Page Language="C#" AutoEventWireup="True" Inherits="Default" CodeBehind="Default.aspx.cs" %> 
<%@ Register Src="~/MyUserControl.ascx" TagName="MyUserControl" TagPrefix="uc1" %> 

<uc1:MyUserControl ID="ucMyUserControl" runat="server" OnUserControlTextBoxChanged="ucMyUserControl_UserControlTextBoxChanged" /> 

public partial class MyPage : Page { 
protected void ucMyUserControl_UserControlTextBoxChanged(object sender, EventArgs e) { 
    // sender is ucMyUserControl.TextBox1 
} 
} 
+0

Chỉ cần làm rõ vì tôi có thể đã hiểu sai câu hỏi. Bạn đang tìm kiếm 'Nhập' cụ thể hay bạn đang cố chụp một bản gửi qua TextBox? –

1

Thông thường, invokation Sự kiện này được bọc trong một phương thức có tên giống như "On [EventName]" mà xác nhận rằng delgate có một hoặc nhiều mục tiêu (sự kiện không phải là null), và sau đó gọi nó với người gửi và bất kỳ đối số áp dụng ... do đó, một cái gì đó như thế này là mẫu điển hình:

public event EventHandler SomethingHappened; 
protected void OnSomethingHappend(EventArgs e) 
{ 
    if (SomethingHappened != null) 
     SomethingHappened(this, e); 
} 

Bất cứ điều gì cần phải tăng sự kiện đó sẽ gọi phương thức đó (giả sử có thể truy cập).

Nếu bạn chỉ muốn truyền sự kiện này, thì với tư cách là một UserControl, bạn có thể chỉ cần gọi phương thức "On [Event]" cơ bản, có khả năng được hiển thị. Bạn cũng có thể kết nối các trình xử lý sự kiện để trực tiếp truyền sự kiện từ điều khiển con như sự kiện kiểm soát cha mẹ ... để txtFoo.KeyPress chỉ đơn giản gọi phương thức OnKeyPress của điều khiển cha.

0

Nếu bạn đang sử dụng WPF, bạn có thể sử dụng RaiseEvent: http://msdn.microsoft.com/en-us/library/system.windows.uielement.raiseevent.aspx

Nhưng điều này là sai cho những gì bạn muốn làm.

Bạn nên bong bóng sự kiện.

class MyControl : UserControl { 
    public KeyDownEventHandler KeyDown; 

    private void OnTextBoxKeyDown(object sender, EventArgs e){ KeyDown.Invoke(sender, e); } 
} 

Sau đó, lắng nghe KeyDown từ biểu mẫu của bạn. Hãy tha thứ sai lầm trong việc đặt tên của các yếu tố/sự kiện khác nhau.

2

tôi đang tìm kiếm một câu trả lời cho vấn đề này đối với tôi,

chỉ làm điều này

examble:

//this is the call to trigger the event: 

**lst_ListaDirectorios_SelectedIndexChanged(this, new EventArgs());** 

//do that if you have the method signature in the same class as I do. (something like this below) 
private void lst_ListaDirectorios_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      //do something 
     } 

Tôi hy vọng điều này là hữu ích cho bạn.

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