2013-05-23 2 views
3

У меня есть 20 элементов в List<myObject>. Каждый из них имеет экземпляр связанного с ним связанного с ним UserControl. Каждый объект доступен через MenuStrip, который должен отображать UserControl при щелчке соответствующего элемента. В настоящее время у меня есть обработчик событий для каждого из них, который работает, но мне было интересно, существует ли способ упростить его и использовать один обработчик событий для всех элементов.Использование обработчиков событий для нескольких объектов

Возможно ли это? Если да, то каков наилучший способ сделать это.

EDIT: Может ли кто-нибудь еще внести какие-либо данные по этой проблеме? У меня проблемы с ответом Майло. По сути, все, что мне нужно сделать, это сделать обработчик событий, который может отображать соответствующий UserControl, хранящийся в List<myObject>, в качестве свойства, когда нажимается правильный элемент MenuStrip. Есть ли более простой способ сделать это? В идеале я хотел бы сделать так, чтобы цикл foreach мог пройти через список и настроить обработчики.

Есть ли кто-нибудь, кто может мне помочь?

+0

Являются ли отдельные обработчики в основном одинаковыми? Не могли бы вы его найти и определить, что происходит, и просто реагировать по-другому, например, переключиться на то, что вы знаете?Возможно, используя свойство UserControl.Tag? – DonBoitnott

+0

Каждый обработчик в основном делает то же самое. Он просто отображает соответствующий UserControl. –

+0

Я также пробовал использовать свойство Tag, но все равно не повезло. –

ответ

3

Это не очень сложно. Во-первых, вам нужен способ связать элемент меню с элементом управления в списке.

1) Поскольку у вас есть список, индекс является самым простым способом (вы можете использовать словарь <> для упрощения этой ассоциации). Итак, скажем, когда вы нажимаете на первый пункт меню, вы хотите, чтобы появился myObjecList[0]. Когда вы нажмете второй MenuItem, появится myObjectList[1] и так далее. Для этого перейдите к каждому пункту меню, а в свойствах присвойте значение Tag. Для первого пункта меню присвойте Tag 0, для второго элемента назначьте Tag в 1 - и так далее.

2) Создайте один обработчик событий и назначьте тот же обработчик всем элементам меню. Обработчик событий может выглядеть примерно так:

private void myToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      // source menu item which was clicked 
      ToolStripMenuItem item = sender as ToolStripMenuItem; 

      if(item != null) 
      { 
       int index = int.Parse(item.Tag.ToString()); // get the index from Tag 
       myObject control = myObjectList[index]; 

       // do your stuff with your control 

      } 
     } 
+0

Сделал это. Спасибо! –

0

вы можете передать объект отправителя для обработчика событий и проверять тип внутри обработчика

это будет что-то вроде этого

//this will contain any properties you wanna send to the handler 
public class MyHandlerEventArgs : EventArgs 
{ 

} 

//this delegate gets the sender, you can change the sender type to be the encapsulated type of your controls 
public delegate void MyHandler(object sender, MyHandlerEventArgs args); 

//this is the class that fires the event in your case it will UI class I think 
public class MyController 
{ 
    public event MyHandler myEvent; 

    public void MyEvent_Fire() 
    { 
     if(myEvent != null) 
      myEvent(this, new MyHandlerEventArgs()); 
    } 
} 

//here you can do your business logic for each control 
public class MyAction 
{ 
    MyController mc = new MyController(); 
    public MyAction() 
    { 
     mc.myEvent += new MyHandler(mc_myEvent); 
    } 

    void mc_myEvent(object sender, MyHandlerEventArgs args) 
    { 
     //check the sender type 
     //do your action 
    } 
} 

эта ссылка может оказаться полезным check

+3

Почему бы не использовать 'EventHandler ' вместо определения пользовательского делегата, который в основном имеет ту же подпись, что и делегат по умолчанию? –

+0

@marceln Я пропустил это, EventHandler будет лучшей идеей. благодарит за комментарий – Mailo

0

Возможно, вам понадобится событие ItemClicked от MenuStrip. Вы можете использовать ClickedItem из ToolStripItemClickedEventArgs найти свой UserControl

Некоторые псевдокод:

// Initialize 
myMenuStrip.ItemClicked += itemClickedEvent; 

// ... 
void itemClickedEvent(Object sender, ToolStripItemClickedEventArgs e) 
{ 
    int index = myObjectList.FindIndex(e => e.instanceOfUserControl == e.ClickedItem); 
    // Now that we have the clicked item, display it how we would in an individual event handler. 
    myObjectList[index].instanceOfUserControl.DoDisplay(); 
} 

В идеале я хотел бы сделать это так, чтобы петля Еогеасп может пройти через список и настройте обработчики.

При таком подходе вы бы использовать foreach на List

foreach (var listItem in myObjectList) 
{ 
    listItem.TheEvent += myEventHandler; 
} 
Смежные вопросы