从用户控件访问父控件 - C#

时间:2012-01-11 14:05:27

标签: c# winforms user-controls

如何在C#(winform)中访问用户控件的父控件。我使用以下代码,但它不适用于所有类型的控件,如ListBox。

Control[] Co = this.TopLevelControl.Controls.Find("label7", true);
Co[0].Text = "HelloText"

实际上,我必须在用户控件中放置在父“Form”上的Listbox中添加项目。

9 个答案:

答案 0 :(得分:51)

描述

您可以使用Control.Parent获取父控件。

示例

因此,如果您在表单this.Parent上放置了一个控件,则表示您的表单。

在你的控制中,你可以做到

Form parentForm = (this.Parent as Form);

更多信息

Farid-ur-Rahman发表评论后更新(他在问这个问题

  

我的控件和列表框(listBox1)都放在窗体(Form1)上。当用户按下放在我的控件中的按钮时,我必须在listBox1中添加项目。

您有两种可能的方法来完成此任务。

<强> 1。使用`Control.Parent

示例

<强>的MyUserControl

    private void button1_Click(object sender, EventArgs e)
    {
        if (this.Parent == null || this.Parent.GetType() != typeof(MyForm))
            return;

        ListBox listBox = (this.Parent as MyForm).Controls["listBox1"] as ListBox;
        listBox.Items.Add("Test");
    }

2。

  • 将属性public MyForm ParentForm { get; set; }添加到您的UserControl
  • 在表单
  • 中设置属性
  • 假设您的ListBox被命名为listBox1,否则更改名称

示例

<强> MyForm的

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        this.myUserControl1.ParentForm = this;
    }
}

<强>的MyUserControl

public partial class MyUserControl : UserControl
{
    public MyForm ParentForm { get; set; }

    public MyUserControl()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (ParentForm == null)
            return;

        ListBox listBox = (ParentForm.Controls["listBox1"] as ListBox);
        listBox.Items.Add("Test");

    }
}

答案 1 :(得分:10)

您可以使用Control.Parent获取控件的父级,或使用Control.FindForm获取控件所在的第一个父级Form。在寻找表格方面,两者之间存在差异,因此一个可能比另一个更适合使用。:

  

控件的Parent属性值可能与Form不同   由FindForm方法返回。例如,如果是RadioButton控件   包含在GroupBox控件中,GroupBox位于Form上,   RadioButton控件的Parent是GroupBox和GroupBox   control的父级是表格。

答案 2 :(得分:2)

您可以通过

获取控件的父级
myControl.Parent

请参阅MSDN: Control.Parent

答案 3 :(得分:2)

Control有一个名为Parent的属性,它将为父控件提供。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspx

例如Control p = this.Parent;

答案 4 :(得分:1)

不理想,但试试这个......

将usercontrol更改为Component类(在代码编辑器中),构建解决方案并删除所有带错误的代码(与usercontrols相关但在组件中不可用,以便调试器抱怨它)

将usercontrol更改回usercontrol类...

现在它识别名称和父属性,但将组件显示为非可视,因为它不再可设计。

答案 5 :(得分:1)

获取我使用的控件的父级的一般方法是:

public static T GetParentOfType<T>(this Control control)
{
    const int loopLimit = 100; // could have outside method
    var current = control;
    var i = 0;

    do
    {
        current = current.Parent;

        if (current == null) throw new Exception("Could not find parent of specified type");
        if (i++ > loopLimit) throw new Exception("Exceeded loop limit");

    } while (current.GetType() != typeof(T));

    return (T)Convert.ChangeType(current, typeof(T));
}

它需要一些工作(例如,如果找不到则返回null或错误)......但希望可以帮助某人。

用法:

var parent = currentControl.GetParentOfType<TypeWanted>();

享受!

答案 6 :(得分:0)

((frmMain)this.Owner).MyListControl.Items.Add("abc");

确保在MyListControl的{​​{1}}

提供除{Private}属性以外的修饰符属性所需的访问级别

答案 7 :(得分:0)

如果您想通过任何子控件获取任何父级,您可以使用此代码, 当您找到 UserControl / Form / Panel 或其他人时,您可以调用funnctions或 set / get 值:

Control myControl= this;
while (myControl.Parent != null)
{

    if (myControl.Parent!=null)
    {
        myControl = myControl.Parent;
        if  (myControl.Name== "MyCustomUserControl")
        {
            ((MyCustomUserControl)myControl).lblTitle.Text = "FOUND IT";
        }
    }

}

答案 8 :(得分:0)

根据拉斯金斯的回答和评论here,我提出了以下(递归)解决方案:

public static T GetParentOfType<T>(this Control control) where T : class
{
    if (control?.Parent == null)
        return null;

    if (control.Parent is T parent)
        return parent;

    return GetParentOfType<T>(control.Parent);
}