在我的项目中,我有一个用户控件;按下此用户控件上的按钮时,我希望它更改存储在主winform上的变量,而不是用户控件。
如何做到这一点?
我试过这个
namespace.class.variable =
但它表示由于它的保护而无法访问它。
答案 0 :(得分:0)
用户控件应该是一个孤立的整体,一个容器。 你需要使用事件。
考虑如何使常规Button控件在常规TextBox控件中填充一些文本?
TextBox不知道按钮,按钮不知道您的文本框。它们是单独的控件。 你所做的是订阅按钮的点击事件,然后告诉文本框控件更改它的文本。
与此类似,您的用户控件需要提供您可以在按钮单击或其他操作发生时触发的事件。
控件应该执行 all ,提供事件并触发它。
然后,您可以从容纳用户控件的表单订阅该事件,并在该事件处理程序中根据需要更改其他控件的属性。
以下是how和Event的工作原理的简要示例。查找更多信息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);
}
答案 1 :(得分: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
{
}