从用户控件中访问表单

3

我有一个用户控件,需要访问Form1.cs上的变量和静态类。我在谷歌上找不到有效的示例。请给一些提示?谢谢!

namespace WinApp1
{
public partial class Form1 : Form
{
    Public MyCustomClass myClass; // need to access this
    public Form1()
    {

    }
}
public static class Global {
   public static myGlobalVar; // Need to Access This
}
}
6个回答

8

在用户控件中使用 this.Parent 可以获取父窗体:

Form1 myParent = (Form1)this.Parent;

那么您可以访问公共字段/属性:

myParent.myClass 

请注意,如果UserControl位于Form内的Panel中,您需要获取父级控件的父级控件。
您可以通过其名称访问静态类:
Global.myGlobalVar 

谢谢!我把代码放在我的用户控件的按钮单击事件中,但是我遇到了这个引用错误:找不到类型或命名空间名称“Form1”。谢谢! - Kristian
@Kristian 你为Form1和用户控件设置了不同的命名空间吗? - Abdusalam Ben Haj
命名空间为“WinApp1”,既用于窗体又用于用户控件。 - Kristian
@Kristian 你可以直接调用全局类的名称和方法名称来访问它,我会更新我的答案。 - Abdusalam Ben Haj
哦,非常感谢您的帮助,一切都完美地解决了! - Kristian
显示剩余5条评论

5

你可以使用FindForm()方法。

但是,你应该退一步,看看这是否是最好的解决方案。这是一个强依赖项,降低了控件的可测试性和重用性。

例如,考虑引入一个接口,其中包含你需要的成员,并在父级层次结构中搜索它,或将其作为参数注入,...

从那里开始,你就可以在我的情况下使用控件。可能还有许多其他解决方案。只是想让你考虑是否有比依赖表单更好的东西..


3

使用:

frm_main frm;     //frm_main is your main form which user control is on it
frm=(frm_main)this.FindForm();     //It finds the parent form and sets it to the frm

现在您有了主窗体。对frm的任何更改都会反映在主窗体上。 如果您想访问主窗体上的某个指定控件,请使用以下步骤: 1-创建要访问的控件类型(例如Label)的控件:
Label lbl_main;

2-将从搜索结果返回的控件设置为标签:

frm.Controls.FindControl("controlId",true);

3-在标签上进行您的更改:

lbl_main.Text="new value changed by user control";

您所做的更改将反映在控件上。 希望这能有所帮助。


1
在您的用户控件代码中,在“Click”事件或其他事件下:
private void sendParamToMainForm_Button_Click(object sender, EventArgs e)
{
    mainForm wForm;
    wForm = (mainForm)this.FindForm();

    wForm.lblRetrieveText.text = "whatever ...";
}

希望这有所帮助 :-)


1
我认为this.Parent返回的是用户控件所在的实际页面?然后您可以访问公共成员。

0

如果您的用户控件位于面板内,且您想要访问表单
您可以使用以下方法:

        Main_Form myform = (Main_Form)ParentForm;
        MessageBox.Show(myform.Label2.Text);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接