2015-05-13 1 views
-2

В моем проекте у меня есть пользовательский контроль; когда нажата кнопка на этом пользовательском элементе, я хочу, чтобы она изменила переменную, которая хранится в основной winform, а не пользовательском элементе управления.Как управлять другими частями winform из пользовательского элемента управления на C#?

Как это можно сделать?

Я попробовал этот

namespace.class.variable =

, но он говорит, что не может быть доступна из-за его защиты.

+1

Лучшим способом было бы использовать события –

+0

Если переменная является статической, вам, вероятно, необходимо сделать ее общедоступной. – Adil

+0

Можете ли вы рассказать мне об этом? @SamiKuhmonen –

ответ

0

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

Подумайте о том, как сделать обычный элемент управления Button, заполнить какой-либо текст в обычном элементе управления TextBox?

TextBox не знает о кнопке, и кнопка не знает о вашем текстовом поле. Это отдельные элементы управления. Что вы делаете, это подписка на событие нажатия кнопки, а затем сообщите элементу управления текстовым полем изменить его текст.

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

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

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

Ниже приведен краткий пример того, как и как работает. Найти больше информации here

Это должно быть внутри пользовательского элемента управления

//A delegate that describe's your event's signature 
public delegate void ChangedEventHandler(object sender, EventArgs e); 

//The actual Event declaration 
public event ChangedEventHandler Changed; 

//When appropriate, trigger the event from the user control 
if (Changed != null) { 
    Changed(this, e); 
} 
+0

Прошу прощения, но я все еще смущен. Если у меня есть 'button1' на' userControl1', как я могу заставить эту кнопку изменить текст в 'label1' на« hello », если' label1' не находится в пользовательском элементе управления, а находится в winform, в котором находится 'userControl1'? –

+0

Вы не должны делать это напрямую. Это то, что я вам говорю. Все, что находится внутри UserControl **, не должно ** обращаться к другим элементам управления вне пользовательского элемента управления. Для этого не нужны пользовательские элементы управления. Вы можете объявить, что кнопка1 будет общедоступна внутри вашего пользовательского элемента управления, затем из формы, подпишитесь на событие click1 button1 и оттуда установите текст на ярлыке1. – irreal

0

Малый интро к тому, что вам нужно сделать. Это небольшая программа MVP, которая покажет сообщение при нажатии кнопки.

//Your MainForm class 
    public class MainForm: Form,IMainView 
    { 

     public event Action ButtonClicked; 

     public MainForm() 
     { 
      InitializeComponent(); 
      button.Click += (sender, args) => 
      { 
       var handler = ButtonClicked; 
       if (handler != null) handler(sender, args); 
      }; 
     } 

     public void ShowError(string message) 
     { 
      MessageBox.Show(message); 
     } 
    } 

    //Your MainForm interface. What lies here will become accessible in Presenter 
    public interface IMainView : IView 
    { 
     event Action ButtonClicked; 
    } 

    //View interface 
    public interface IView 
    { 
     void ShowError(string message); 
    } 

    //Your MainForm Presenter class which will do all work behind GUI 
    public class MainPresenter : BasePresenter<IMainView> 
    { 
     public MainPresenter(IMainView view) 
      : base(view) 
     { 
      view.ButtonClicked += view_ButtonClicked; 
     } 

     void view_ButtonClicked() 
     { 
      View.ShowError("Clicked!"); 
     } 
    } 

    //Base class for all presenters 
    public abstract class BasePresenter<TView> : IPresenter 
     where TView : IView 
    { 
     protected TView View { get; private set; } 

     protected BasePresenter(TView view) 
     { 
      View = view; 
     } 
    } 

    //Presenter interface 
    public interface IPresenter 
    { 
    } 
+0

Довольно сложный способ сделать простой обработчик событий ... –

Смежные вопросы