Как вызвать событие вручную в C #?

У меня есть USerControl, в котором у меня есть текстовое поле. Я использую usercontrol в своей форме, я хочу сделать что-то, когда кто-то нажимает ввод в текстовом поле. как мне это сделать? если вы скажете мне, как вызвать событие вручную, я могу вызвать usercontrol.keydown в textbox.keydown.

 Saeed01 окт. 2010 г., 18:49
@ Джон Раш: WinForm
 Saeed01 окт. 2010 г., 18:46
@dtb: да, точно
 dtb01 окт. 2010 г., 18:36
Итак, вы хотите вызвать событие UserControl.KeyDown из обработчика событий TextBox.KeyDown, верно?
 John Rasch01 окт. 2010 г., 18:47
@saeed - в принципе решения одинаковы, но это для ASP.NET или WinForms?
 Saeed01 окт. 2010 г., 18:48
@RQDQ: Я не понял, что ты пропустил.
 RQDQ01 окт. 2010 г., 18:36
Так что реагирования на событие, когда пользователь фактически нажимает клавишу, недостаточно для вашего сценария? Я думаю, что я что-то упустил в вашем сценарии.

Ответы на вопрос(5)

Решение Вопроса

события могут быть вызваны только из кода в элементе управления, который объявляет событие. Итак, ваш пользовательский элемент управления должен объявить пользовательское событие KeyDown, чтобы вызвать его. Например, вы не можете поднять KeyDown для TextBox, содержащегося в вашем пользовательском элементе управления. Однако вы можете объявить свой собственный KeyDown и прикрепить к KeyDown TextBox обработчик, который будет вызывать ваш собственный KeyDown.

Учитывая это ограничение, вызвать событие легко:

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*/));
}

Создание события выглядит очень похоже на метод, потому что по сути это то, что вы делаете; Вы вызываете один или несколько делегатов метода, которые назначены делегату MultiCast за кулисами вашего мероприятия. Думайте об этом как о назначении метода обычному именованному делегату (например, если вы опустите ключевое слово «событие» в определении) и вызове его изнутри вашего кода. единственное различие между истинным событием и тем, что к событию может быть подключено более одного делегата-обработчика, и он будет вызывать их все при возникновении.

 KeithS01 окт. 2010 г., 18:53
... Или заблокируйте (MyEvent ()) перед вычислением if и последующим освобождением. Вопрос был просто о том, чтобы поднять событие, и на это я ответил; если он прикрепляет и отсоединяет обработчиков, то это указывает на более глубокое знание событий в целом, исключая необходимость задавать вопрос.
 Kyle Delaney14 янв. 2017 г., 02:13
Но не может ли какой-либо многоадресный делегат иметь несколько делегатов, прикрепленных к нему? Так чем же отличается событие?
 Konrad Rudolph01 окт. 2010 г., 18:49
К сожалению, этот код не является потокобезопасным. Вам необходимо создать локальную копиюMyEvent защищать отNullReferenceExceptions возникает, когда другой поток одновременно удаляет все обработчики событий между вашимif и вызов события.
 Hans Passant01 окт. 2010 г., 20:39
Хм, это догма, но вряд ли здесь уместная. Элемент управления имеет только 4 члена, которые задокументированы для использования из другого потока (InvokeRequired и т. Д.). Даже MSFT не делает это последовательно, например, NumericUpDown.
 Arthur Tacca20 дек. 2018 г., 15:18
В последней версии .net тест можно свернуть в вызов с помощью следующего синтаксиса:MyEvent?.Invoke(param1, param2, etc)  Я не проверил документы, но я предполагаю, что это потокобезопасно (так как, вероятно, в этом суть)
 Konrad Rudolph01 окт. 2010 г., 19:02
Вы правы в принципе, но это не то, что я имею в виду: копирование мероприятия на местном уровне является твердо установленной передовой практикой.нет код создания событий должен быть написан без него, даже не в качестве примера (поскольку, если вы не ожидаете проблему многопоточности, вы об этом не подумаете). Присоединение событий nilly-willy - это не то, что может контролировать код пользовательского элемента управления, это зависит от пользователя. Как повторно используемый код, пользовательский управляющий код должен быть максимально надежным.

вызов события заключен в метод с именем что-то вроде «On [EventName]», который проверяет, что у delgate есть одна или несколько целей (событие не является нулевым), а затем вызывает его с отправителем и любыми применимыми аргументами ... так вот как это типичная картина:

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

Все, что должно вызвать это событие, вызывает этот метод (при условии, что он доступен).

Если вы просто хотите передать событие, тогда как UserControl, вы, вероятно, можете просто вызвать базовый метод «On [Event]», который, скорее всего, выставлен. Вы также можете подключить обработчики событий, чтобы напрямую передавать событие из дочернего элемента в качестве события родительского элемента управления ... так что txtFoo.KeyPress просто вызывает метод OnKeyPress родительского элемента управления.

http://msdn.microsoft.com/en-us/library/system.windows.uielement.raiseevent.aspx

Но это неправильно для того, что вы хотите сделать.

Вы должны всплеснуть событие.

class MyControl : UserControl {
    public KeyDownEventHandler KeyDown;

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

Затем прослушайте KeyDown из вашей формы. Пожалуйста, извините за ошибки в названии различных элементов / событий.

просто сделай это

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
         }

Я надеюсь, что это было полезно для вас.

То, что вы описываете, называется пузырением событий. Вот пример:

<%@ 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
 }
}
 Nathan Taylor01 окт. 2010 г., 18:47
Просто чтобы уточнить, как я, возможно, неправильно понял вопрос. Вы ищете именно «Enter» или пытаетесь захватить отправку через TextBox?

Ваш ответ на вопрос