昨天我问了一个问题,如何从另一个表单访问我的主窗体以使其成为焦点。
Giving focus back to main form
解决方案是在调用新表单时添加对mainform的引用。
这适用于.focus()
:
Form mainform_instance;
public NewForm(Form mainform)
{
this.mainform_instance = mainform;
InitializeComponent();
}
但是现在我需要从我的新表单访问主表单上的“自定义函数”。
但我无法访问它,因为它被声明为Form mainform_instance
而Form
类型没有我的自定义函数。 (至少那是我认为出了什么问题。)
所以我想我尝试了:
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();
}
答案 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();
}
还有Action<T>
...确定并检查出来。如果您的方法需要退货,则需要查看Func<TResult>
对于记录,我建议重新考虑发送对主表单的引用。