- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个主窗体,其中包含一个面板,该面板将不同的用户控件加载到面板中。现在我需要从 UserControl 访问主窗体中的函数。下面我给出了我的代码;
这是我的主要 Windows 窗体类:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
loadlogin();
}
private void loadlogin()
{
login log = new login();
mainPannel.Controls.Clear();
mainPannel.Controls.Add(log);
}
public void mytest()
{
}
}
如您所见,我正在将用户控件加载到 mainPannel。现在让我们看看用户控件:
public partial class login : UserControl
{
string MyConString = "";
public login()
{
InitializeComponent();
}
public void button1_Click_1(object sender, EventArgs e)
{
//I want to call the parent function mytest(); HOW????
}
}
我想在我们单击 button1 时访问 mytest() 函数。我尝试了很多其他解决方案,但我仍然感到困惑。我用过:
Form my = this.FindForm();
my.Text = "asdasfasf";
这给了我对父级的引用,我可以更改表单文本,但我如何访问它的功能???
最佳答案
好的,上面的答案可行,但将“父表单”传递给用户控件并不是好的编码习惯。 UserControls 应该位于与您的表单项目不同的项目中,并且您的表单项目应该引用您的控件项目以获得对它们的可见性。比方说,您希望这个 UserControl 在某个时候嵌套在另一个 UserControl 中。如果不重载构造函数,您的代码将不再有效。更好的解决方案是使用事件。我提供了一个使用 CustomEventArg 的实现。通过这样做,您的登录 UserControl 可以坐在任何东西上并且仍然可以工作。如果不需要更改父文本的功能,则无需注册该事件。这是代码,希望这对某人有帮助。
表单代码如下:
public Form1()
{
InitializeComponent();
loadlogin();
}
private void loadlogin()
{
login log = new login();
//Registers the UserControl event
log.changeParentTextWithCustomEvent += new EventHandler<TextChangedEventArgs>(log_changeParentTextWithCustomEvent);
mainPannel.Controls.Clear();
mainPannel.Controls.Add(log);
}
private void log_changeParentTextWithCustomEvent(object sender, TextChangedEventArgs e)
{
this.Text = e.Text;
}
这是“登录”用户控件代码(在我的测试解决方案中,只是一个带有按钮的用户控件)
public partial class login : UserControl
{
//Declare Event with CustomArgs
public event EventHandler<TextChangedEventArgs> changeParentTextWithCustomEvent;
private String customEventText = "Custom Events FTW!!!";
public login()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Check to see if the event is registered...
//If not then do not fire event
if (changeParentTextWithCustomEvent != null)
{
changeParentTextWithCustomEvent(sender, new TextChangedEventArgs(customEventText));
}
}
}
最后,CustomEventArgs 类:
public class TextChangedEventArgs : EventArgs
{
private String text;
//Did not implement a "Set" so that the only way to give it the Text value is in the constructor
public String Text
{
get { return text; }
}
public TextChangedEventArgs(String theText)
: base()
{
text = theText;
}
}
以这种方式编写您的控件,对窗体不可见将使您的用户控件完全可重用,并且不绑定(bind)到任何类型或种类的父级。只需定义 UserControl 可以触发的行为并在必要时注册它们。我知道这是一篇旧文章,但希望这能帮助人们编写更好的用户控件。
关于c# - 如何从面板中加载的子用户控件访问父类功能/控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727053/
我是一名优秀的程序员,十分优秀!