如何在C#(winform)中访问用户控件的父控件。我使用以下代码,但它不适用于所有类型的控件,如ListBox。
Control[] Co = this.TopLevelControl.Controls.Find("label7", true);
Co[0].Text = "HelloText"
实际上,我必须在用户控件中放置在父“Form”上的Listbox中添加项目。
答案 0 :(得分:51)
您可以使用Control.Parent
获取父控件。
因此,如果您在表单this.Parent
上放置了一个控件,则表示您的表单。
在你的控制中,你可以做到
Form parentForm = (this.Parent as Form);
我的控件和列表框(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)
答案 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}}
答案 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);
}