2013-09-17 2 views
0

Я создаю приложение Windows Forms с помощью C#, я создаю множество пользовательских элементов управления, и мой графический интерфейс представляет собой комбинацию этих элементов управления пользователями, проблема заключается в том, что я устанавливаю событие для этого элемента управления пользователя из основного form, событие не срабатывает, но если я установил это событие из элементов управления сам и установил обработчик событий для всех элементов внутри этого элемента управления для этого обработчика событий, он отлично работает, и поскольку у меня есть обернутые элементы управления, я должен глубоко вникать в установите события и обработчики событий, на самом деле это будет стоить больше накладных расходов «Который я не хочу». например:Пользовательские элементы управления и события C#

В главной форме у меня есть управление с он назвал «Пациент», который является пользовательским элементом управления .. если я установить событие щелчка для этого элемента управления от основной формы он не будет стрелять

Но если я перейти к определению пользовательского элемента управления пациента, и я определить пользовательское событие и обработчик события все отлично

public event EventHandler PatientCliecked; 

private void PatientClicked() 
{ 
    if (this.PatientCliecked != null) 
    this.PatientCliecked(new object(), new EventArgs()); 
} 

private void ProcessPatientClickedEvent(object sender, EventArgs e) 
{ 
    PatientClicked(); 
} 

Мой вопрос, есть ли другой способ сделать это, или это логика .NET ??

+0

'если я установил событие click для этого элемента управления из основной формы, он не будет гореть' ---> Не могли бы вы сделать это яснее? Как вы это делаете, любой код? –

+0

Итак, во избежание нарушения целостности имени в классе, который вы на самом деле назвали событием 'PatientCli ** e ** cked'? Это не так, потому что люди станут раздражительными и морскими. Вы должны использовать суффиксы или префиксы на английском языке, например: «event EventHandler PatientClicked», в отличие от 'private void RaisePatientClicked()' –

+0

в основной форме, например: 'Patient MyPatient = new Patient(); MtPatient.click + = PatientClickHandler; частная пустота PatientClichHandler (объект отправителя, EventArgs е) { // Код } ' @EduardDumitru .. Моя проблема не в названиях, а у меня нет никаких конфликтов с ними – user2151551

ответ

0

UserControl наследует событие Click из класса Control. Он, безусловно, может стрелять, но это не так уж и страшно. Вместо этого пользователь будет нажимать на элементы управления внутри UserControl. И он никогда не срабатывает, когда вы покрыли всю поверхность UserControl другими элементами управления.

Вы можете просто перенаправить событие Click для своего собственного использования. Что-то, с чем вы уже экспериментировали, объявив свое собственное событие. Это не обязательно, вы можете это сделать, как это вместо:

private void PatientClicked() 
{ 
    OnClick(this, EventArgs.Empty); 
} 

Который, как и все методы, имена которых начинаются с On и имеют такое же имя, как событие, поднимает Click событие.

+0

это случается точно .. думаю есть.net error, потому что событие click по-прежнему считается событием для отдельного элемента управления, а не для всего пользовательского элемента управления. но вам нужно повторно реализовать событие и его обработчики в классе пользовательских элементов управления. – user2151551

+0

Возможность переопределения события с помощью одной строки кода является функцией, а не ошибкой. –

+0

что я имею в виду по вине, они не учитывают весь пользовательский контроль :) – user2151551

0

Я пойду вперед и выстрелю.

Скажем, у нас есть UserControl. Скажем, это выглядит примерно так:

enter image description here

Теперь представьте, что вы написали следующие Click обработчиков для 4 различных элементов управления, которые присутствуют (Button, то ListView, то RadioButton и сам UserControl):

public partial class UserControl1 : UserControl { 

    public UserControl1() { 
     InitializeComponent(); 
    } 

    private void radioButton1_Click(object sender, EventArgs e) { 
     MessageBox.Show("RadioButton"); 
    } 
    private void listView1_Click(object sender, EventArgs e) { 
     MessageBox.Show("ListView"); 
    } 
    private void button1_Click(object sender, EventArgs e) { 
     MessageBox.Show("Button"); 
    } 
    private void UserControl1_Click(object sender, EventArgs e) { 
     MessageBox.Show("UserControl"); 
    } 

} 

Просто чтобы прояснить, что я говорю, проверить это подмножество файла .designer.cs:

... 
this.radioButton1.Click += new System.EventHandler(this.radioButton1_Click); 
... 
this.button1.Click += new System.EventHandler(this.button1_Click); 
... 
this.listView1.Click += new System.EventHandler(this.listView1_Click); 
... 
this.Click += new System.EventHandler(this.UserControl1_Click); 
... 

Рассмотрите следующие аффирмации.

При нажатии на эту синюю область:

enter image description here

UserControl1_Click обработчик будет вызван, и вы увидите «UserControl» окно сообщения появляются.

При нажатии на эту другую синюю область:

enter image description here

обработчик «listView1_Click» будет вызвана, и вы увидите окно с сообщением «ListView» появится НО вы не увидите в поле «UserControl».

Это верно как для остальных элементов управления, кнопка:

enter image description here

и радиокнопку:

enter image description here

Когда вы смотрите на ваши UserControl с точки зрения своего окончательного контейнера и вы видите событие Click, и вы добавляете для него обработчик событий, вы должны ожидать такое же поведение, как и поведение e UserControl1_Click обработчик событий представлен здесь.

Если вы хотите, вы можете создать обработчик событий для любого конкретного набора дочерних элементов управления и просто перенаправить подписки и отменяют подписку и от этого события для любой Обработчики внешний мир может иметь:

public event EventHandler SmallButtonsClick { 
    add { 
     this.radioButton1.Click += value; 
     this.button1.Click += value; 
    } 
    remove { 
     this.radioButton1.Click -= value; 
     this.button1.Click -= value; 
    } 
} 

public event EventHandler LargeStuffClick { 
    add { 
     this.listView1.Click += value; 
    } 
    remove { 
     this.listView1.Click -= value; 
    } 
} 

или даже подписаться обработчик в динамичном пути к каждому элементу управления ребенка PLUS сам UserControl:

public event EventHandler AnythingClick { 
    add { 
     this.Click += value; 
     foreach (var child in this.Controls) 
      child.Click += value; 
    } 
    remove { 
     this.Click -= value; 
     foreach (var child in this.Controls) 
      child.Click -= value; 
    } 
} 

, а затем просто использовать, что из окружающего мира:

UserControl1 someControl = new UserControl1(); 
someControl.AnythingClick += (sender, e) => MessageBox.ShowMessage("tadaaa!"); 
Смежные вопросы