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にアイテムを追加する必要があります。
これを行うには、two可能な方法があります。
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");
}
}
Control.Parent を使用して、コントロールの親を取得するか、 Control.FindForm を使用して、コントロールがオンになっている最初の親Form
を取得できます。フォームの検索に関しては2つの間に違いがあるため、一方が他方よりも使用に適している場合があります。
コントロールのParentプロパティの値は、FindFormメソッドによって返されるFormとは異なる場合があります。たとえば、RadioButtonコントロールがGroupBoxコントロール内に含まれ、GroupBoxがフォーム上にある場合、RadioButtonコントロールの親はGroupBoxであり、GroupBoxコントロールの親はフォームです。
私が使用したコントロールの親を取得する一般的な方法は次のとおりです。
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>();
楽しい!
コントロールにはParentというプロパティがあり、これにより親コントロールが提供されます。 http://msdn.Microsoft.com/en-us/library/system.windows.forms.control.parent.aspx
例Control p = this.Parent;
理想的ではありませんが、これを試してください...
ユーザーコントロールをコンポーネントクラスに変更し(コードエディターで)、ソリューションをビルドし、エラーのあるすべてのコードを削除します(ユーザーコントロールに関連しているが、コンポーネントで使用できないため、デバッガーは文句を言います)
ユーザーコントロールをユーザーコントロールクラスに戻します...
現在は、名前と親プロパティを認識しますが、コンポーネントは設計可能ではないため、非ビジュアルとして表示されます。
子コントロールによって親を取得する場合は、このコードを使用できます。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";
}
}
}
((frmMain)this.Owner).MyListControl.Items.Add("abc");
MyListControl
at frmMain
のPrivate以外のModifiersプロパティで、必要なアクセスレベルを必ず提供してください。