簡體   English   中英

從用戶控件獲取對父控件的訪問權限 - C#

[英]Get access to parent control from user control - C#

如何在 C# (winform) 中訪問用戶控件的父控件。 我正在使用以下代碼,但它不適用於所有類型的控件,例如 ListBox。

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

實際上,我必須在用戶控件的父“表單”上的列表框中添加項目。

描述

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

樣本

因此,如果您在表單上放置了一個控件this.Parent將是您的表單。

在您的控制范圍內,您可以做到

Form parentForm = (this.Parent as Form);

更多信息

在 Farid-ur-Rahman 發表評論后更新(他在問這個問題

我的控件和列表框 (listBox1) 都放在表單 (Form1) 上。 當用戶按下放置在我的控件中的按鈕時,我必須在 listBox1 中添加項目。

您有兩種可能的方法來完成這項工作。

1.使用`Control.Parent

樣本

我的用戶控件

    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; } public MyForm ParentForm { get; set; } public MyForm ParentForm { get; set; }到你的UserControl
  • 在您的表單中設置屬性
  • 假設您的ListBox名為listBox1否則更改名稱

樣本

我的表格

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

我的用戶控件

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");

    }
}

您可以使用Control.Parent得到控制或父Control.FindForm拿到的第一個父Form的控制上。 兩者在查找形式方面存在差異,因此一種可能比另一種更適合使用:

控件的 Parent 屬性值可能與 FindForm 方法返回的 Form 不同。 例如,如果 RadioButton 控件包含在 GroupBox 控件中,而 GroupBox 位於窗體上,則 RadioButton 控件的父級是 GroupBox,而 GroupBox 控件的父級是窗體。

控件有一個名為 Parent 的屬性,它將賦予父控件。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspx

例如Control p = this.Parent;

獲取我使用過的控件的父級的通用方法是:

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>();

享受!

您可以通過以下方式獲取控件的父級

myControl.Parent

請參閱 MSDN: Control.Parent

不理想,但試試這個......

將用戶控件更改為組件類(在代碼編輯器中),構建解決方案並刪除所有有錯誤的代碼(與用戶控件相關,但在組件中不可用,因此調試器會抱怨)

將用戶控件更改回用戶控件類...

現在它可以識別名稱和父屬性,但將組件顯示為不可見,因為它不再是可設計的。

根據拉斯金斯的回答和這里的評論我想出了以下(遞歸)解決方案:

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);
}
((frmMain)this.Owner).MyListControl.Items.Add("abc");

確保在frmMain MyListControl Private 以外的 Modifiers 屬性中提供您想要的訪問級別

如果您想通過任何子控件獲取任何父控件,您可以使用此代碼,當您找到UserControl/Form/Panel或其他控件時,您可以調用函數或設置/獲取值:

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

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM