web-dev-qa-db-ja.com

ユーザーコントロールから親コントロールへのアクセスを取得する-C#

C#(winform)でユーザーコントロールの親コントロールにアクセスするにはどうすればよいですか。次のコードを使用していますが、ListBoxなどのすべてのタイプのコントロールに適用できるわけではありません。

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

実際、ユーザーコントロールから親 'フォーム'に配置されたリストボックスにアイテムを追加する必要があります。

29
Farid-ur-Rahman

説明

Control.Parentを使用して親コントロールを取得できます。

サンプル

したがって、フォームにコントロールを配置すると、this.Parentがフォームになります。

コントロール内でできること

Form parentForm = (this.Parent as Form);

詳しくは

Farid-ur-Rahmanによるコメントの後の更新(彼は質問をしていた

私のコントロールとリストボックス(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");

    }
}
52
dknaack

Control.Parent を使用して、コントロールの親を取得するか、 Control.FindForm を使用して、コントロールがオンになっている最初の親Formを取得できます。フォームの検索に関しては2つの間に違いがあるため、一方が他方よりも使用に適している場合があります。

コントロールのParentプロパティの値は、FindFormメソッドによって返されるFormとは異なる場合があります。たとえば、RadioButtonコントロールがGroupBoxコントロール内に含まれ、GroupBoxがフォーム上にある場合、RadioButtonコントロールの親はGroupBoxであり、GroupBoxコントロールの親はフォームです。

10
keyboardP

私が使用したコントロールの親を取得する一般的な方法は次のとおりです。

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

楽しい!

2
Ruskin

を介してコントロールの親を取得できます

myControl.Parent

MSDNを参照してください: Control.Parent

2
chaosr

コントロールにはParentというプロパティがあり、これにより親コントロールが提供されます。 http://msdn.Microsoft.com/en-us/library/system.windows.forms.control.parent.aspx

Control p = this.Parent;

2
Sprintstar

理想的ではありませんが、これを試してください...

ユーザーコントロールをコンポーネントクラスに変更し(コードエディターで)、ソリューションをビルドし、エラーのあるすべてのコードを削除します(ユーザーコントロールに関連しているが、コンポーネントで使用できないため、デバッガーは文句を言います)

ユーザーコントロールをユーザーコントロールクラスに戻します...

現在は、名前と親プロパティを認識しますが、コンポーネントは設計可能ではないため、非ビジュアルとして表示されます。

1
Tery Aldon

子コントロールによって親を取得する場合は、このコードを使用できます。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";
        }
    }

}
0
daniele3004
((frmMain)this.Owner).MyListControl.Items.Add("abc");

MyListControl at frmMainのPrivate以外のModifiersプロパティで、必要なアクセスレベルを必ず提供してください。

0
Asaf