[英]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);
我的控件和列表框 (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>();
享受!
不理想,但試試這個......
將用戶控件更改為組件類(在代碼編輯器中),構建解決方案並刪除所有有錯誤的代碼(與用戶控件相關,但在組件中不可用,因此調試器會抱怨)
將用戶控件更改回用戶控件類...
現在它可以識別名稱和父屬性,但將組件顯示為不可見,因為它不再是可設計的。
((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.