gpt4 book ai didi

c# - 如何从面板中加载的子用户控件访问父类功能/控件

转载 作者:太空狗 更新时间:2023-10-30 00:11:06 25 4
gpt4 key购买 nike

我有一个主窗体,其中包含一个面板,该面板将不同的用户控件加载到面板中。现在我需要从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com