从用户控件-C#获取对父控件的访问权限
本文关键字:控件 访问 访问权 权限 用户 -C# 获取 | 更新日期: 2023-09-27 18:19:56
如何访问C#(winform)中用户控件的父控件。我使用以下代码,但它不适用于ListBox等所有类型的控件。
Control[] Co = this.TopLevelControl.Controls.Find("label7", true);
Co[0].Text = "HelloText"
实际上,我必须在Listbox中添加从用户控件放置在父"Form"上的项。
描述
您可以使用Control.Parent
获取父控件。
样品
因此,如果你在表格上放置了一个控件,this.Parent
将是你的表格。
在您的控制范围内,您可以进行
Form parentForm = (this.Parent as Form);
更多信息
- MSDN:Control.PParent属性
Farid ur Rahman评论后更新(他在问这个问题)
"我的控件"和列表框(listBox1)都位于窗体(Form1)上。当用户按下我控件中的按钮时,我必须在listBox1中添加项目。
您有两种可能的方法来完成这项工作。
1.使用`Control.PParent
样品
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");
}
}
您可以使用Control.PParent获取控件的父级,也可以使用Control.FindForm获取控件所在的第一个父级Form
。两者在查找表单方面存在差异,因此其中一个可能比另一个更适合使用。:
控件的Parent属性值可能与Form不同由FindForm方法返回。例如,如果RadioButton控件包含在GroupBox控件中,并且GroupBox在Form上,RadioButton控件的父控件是GroupBox和GroupBox控件的父级是Form.
Control有一个名为Parent的属性,它将赋予父控件。http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspx
例如Control p = this.Parent;
您可以通过获取控件的父级
myControl.Parent
请参阅MSDN:Control.父
获取我使用过的控件的父级的通用方法是:
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>();
享受吧!
根据Ruskins的回答和这里的评论,我提出了以下(递归)解决方案:
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);
}
不理想,但试试这个。。。
将用户控件更改为组件类(在代码编辑器中),构建解决方案并删除所有有错误的代码(与用户控件相关,但在组件中不可用,因此调试器会抱怨)
将usercontrol更改回usercontrol类。。。
现在,它识别名称和父属性,但显示组件为非可视组件,因为它不再是可设计的。
((frmMain)this.Owner).MyListControl.Items.Add("abc");
确保在Modifiers属性中为frmMain
上的MyListControl
提供除Private之外的访问级别
如果您想通过任何子控件获取任何父控件,您可以使用此代码,当您找到UserControl/Form/Panel或其他可以调用函数或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";
}
}
}