5

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

这给了我对父级的引用,我可以更改表单文本,但我如何访问它的功能???

4

3 回答 3

15

好的,上面的答案会起作用,但是将“父表单”传递给用户控件并不是一个好的编码习惯。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;
    }
}

以这种方式编写控件,对窗体不可见,这将使您的 UserControls 完全可重用,并且不绑定到任何类型或类型的父级。只需定义 UserControl 可以触发的行为并在必要时注册它们。我知道这是一篇旧文章,但希望这会帮助某人编写更好的用户控件。

于 2013-10-15T15:18:25.600 回答
6

这可能会有所帮助:

public partial class Form1 : Form
{
    //Other codes

    private void loadlogin()
    {
        login log = new login(this);    //CHANGE HERE
        mainPannel.Controls.Clear();
        mainPannel.Controls.Add(log);
    }

    //Other codes
}

public partial class login : UserControl
{
    Form1 _parent;                       //ADD THIS

    public login(Form1 parent)
    {
        InitializeComponent();
        this._parent = parent;          //ADD THIS
    }

    public void button1_Click_1(object sender, EventArgs e)
    {
         this._parent.mytest();         //CALL WHAT YOU WANT
    }
}
于 2013-03-31T07:15:32.083 回答
0

从您的用户控件:

((Form1)Parent).mytest();
于 2016-07-22T12:54:45.233 回答