试图使用对我的mainform的引用

时间:2011-08-29 20:23:28

标签: c#

昨天我问了一个问题,如何从另一个表单访问我的主窗体以使其成为焦点。

Giving focus back to main form

解决方案是在调用新表单时添加对mainform的引用。

这适用于.focus()

Form mainform_instance;

public NewForm(Form mainform)
{
    this.mainform_instance = mainform;
    InitializeComponent();
}

但是现在我需要从我的新表单访问主表单上的“自定义函数”。

但我无法访问它,因为它被声明为Form mainform_instanceForm类型没有我的自定义函数。 (至少那是我认为出了什么问题。)

所以我想我尝试了:

MainForm mainform_instance;

Namespace.MainForm mainform_instance;

但两者都不起作用。

如何从新表单访问mainform上的函数(foo())?

修改

按照Adam Maras的评论要求:

namespace Namespace
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

EDIT2

调用NewForm的MainForm代码:

newForm = new Namespace.NewForm(this);
newForm.Show();

NewForm构造:

namespace Namespace
{
    public partial class NewForm : Form
    {
        // here I tried to do MainForm mainform_instance as well as in the construct param
        Form mainform_instance;

        public NewForm(Form mainform)
        {
            this.mainform_instance = mainform;
            InitializeComponent();
        }

4 个答案:

答案 0 :(得分:1)

如果您确切知道要使用哪种表单类型,只需更改代码以引用该类型的表单。

MainForm mainform_instance;

public NewForm(MainForm mainform)
{
    this.mainform_instance = mainform;
    InitializeComponent();
}

如果您可以有多种类型的表单,那么您可以尝试在使用之前将其强制转换为MainForm,如果成功,则使用它。

MainForm mainForm = mainform_instance as MainForm;
if (mainForm != null) mainForm.foo();

答案 1 :(得分:1)

在NewForm对象的Load事件中,如果你通过ShowDialog(this)调用调用NewForm,this.Owner将返回你的主窗体对象。

// in your MainForm
NewForm nwForm = new NewForm();
nwForm.ShowDialog(this);

// inside your NewForm object, after loading
(this.Owner as MainForm).Foo();

我意识到我在你之前的帖子中误导了你,要求你使用this.Parent();我应该记得它是这个。所有者()。道歉!

答案 2 :(得分:0)

将自定义函数设为public并将主窗体的引用传递给新窗体。然后使用主表单的引用,您将能够从新表单中调用主表单的任何公共方法

答案 3 :(得分:0)

您的函数是否已声明private

我从不推荐任何其他形式的主表单引用......总有一种更好的方法。也就是说,如果你有一个需要从表单执行的方法,你必须传递对该主表单方法的引用。

public NewForm(Form mainform, Action mainFormMethod)
{
    this.mainform_instance = mainform;
    InitializeComponent();

    mainFormMethod.Invoke(); //  or just mainFormMethod();
}

请参阅MSDN: Action Delegate

还有Action<T> ...确定并检查出来。如果您的方法需要退货,则需要查看Func<TResult>

对于记录,我建议重新考虑发送对主表单的引用。