C # winforms / UserControls — как запустить событие из UserControl1 в UserControl2

#c# #winforms #global-variables

#c# #winforms #глобальные переменные

Вопрос:

Я пытаюсь запустить событие button1_Click, расположенное в UserControl2, из UserControl1.

Элементы управления загружаются динамически из моей основной формы

 //UserControl2
public partial  class ItemsModule : UserControl
{
        private void ButtonRefreshProperties_Click(Object sender, EventArgs e)
        {
            RefreshControls();
        }
        public void RefreshControls()
        {
            SomeCode();
        }
}

/// MainForm this is how i add the Control from the Main Form

ItemsModule im = new ItemsModule();
im.Name = "ItemsModule";
flpModules.Controls.Add(im);

//UserControl1
public partial class TreeViewControl :  UserControl
{
    private void ItemTreeView_MouseDoubleClick(Object sender, MouseEventArgs e)
    {
        String ItemId = ItemTreeView.SelectedNode.Name;
        Variables.CurrentItemID = ItemId;
        if (LoadedModules.Items)
        {
            //Here I would like a way to trigger ItemsModule.ButtonRefreshProperties_Click
        }
    }

}  
  

Комментарии:

1. Создайте событие, чтобы форма могла вызывать RefreshControls.

Ответ №1:

UserControl1 необходимо будет иметь ссылки на UserControl2 . Как только у вас есть ссылка, UserControl1 следует вызвать метод UserControl2 , который вызывает событие, вызываемое.

Вы можете передать ссылку на UserContro2 в UserControl1 через конструктор, вспомогательный элемент или свойство в зависимости от того, как структурировано ваше приложение. Вы должны сохранить ссылку в закрытом поле UserControl1 , чтобы вы могли получить к ней доступ из DoubleClick обработчика событий.

Это также можно настроить другими способами. Вы могли бы сделать UserControl2 быть свойством в родительской форме, тогда UserControl1 может привести это .Parent свойство к правильному типу и использовать это свойство в качестве ссылки.

Вы также могли бы настроить 3-й класс как singleton который имеет ссылку на UserControl2 .

Общим для всех этих решений является то, что каким-то образом UserControl1 необходимо иметь ссылку на UserControl2 , чтобы иметь возможность что-либо с этим делать.

Вы могли бы избежать проблемы со ссылкой, UserControl1 создав событие, которое прослушивает родительская форма. Поскольку родительская форма уже должна содержать ссылки на все элементы управления в ней, вы можете заставить форму передавать вызовы в UserControl2 для вас.

Комментарии:

1. к сожалению, первые решения не будут работать. Я добавил ссылку между 2 проектами (UserControls), щелкнув правой кнопкой мыши -> Добавить ссылку. и я не могу заставить это работать

2. Вы путаете два разных использования «ссылки» в .net. Я говорю о ссылке на переменную, а не о ссылке на сборку. Для использования в этом ответе считайте, что «ссылка на …» примерно эквивалентна «переменной, указывающей на …»