Получить доступ к родительскому элементу управления от пользователя - C # - PullRequest
28 голосов
/ 11 января 2012

Как мне получить доступ к родительским элементам управления пользователя в C # (winform).Я использую следующий код, но он не применим ко всем элементам управления, таким как ListBox.

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

На самом деле, я должен добавить элементы в Listbox, помещенные в родительскую «форму» из пользовательского элемента управления.

Ответы [ 8 ]

51 голосов
/ 11 января 2012

Описание

Вы можете получить родительский элемент управления, используя Control.Parent.

Образец

Так что если у вас есть элемент управления, помещенный в форму, this.Parent будет вашимФорма.

В вашем контроле вы можете сделать

Form parentForm = (this.Parent as Form);

Дополнительная информация

Обновление после комментария Фарид-ур-Рахмана ( Он задавал вопрос )

Мой элемент управления и список (listBox1) оба размещены наФорма (Форма1).Я должен добавить элемент в listBox1, когда пользователь нажимает кнопку, размещенную в моем элементе управления.

У вас есть два возможных способов сделать это.

1.Используйте `Control.Parent

Sample

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

    }
}
10 голосов
/ 11 января 2012

Вы можете использовать Control.Parent для получения родителя элемента управления или Control.FindForm для получения первого родителя Form, когда элемент управления включен. Существует различие между этими двумя понятиями с точки зрения поиска форм, поэтому один из них может быть более подходящим для использования, чем другой .:

Значение родительского свойства элемента управления может не совпадать с формой возвращается методом FindForm. Например, если элемент управления RadioButton содержится в элементе управления GroupBox, а GroupBox находится в форме, Родителем элемента управления RadioButton является GroupBox и GroupBox Родителем элемента управления является Форма.

2 голосов
/ 11 января 2012

Элемент управления имеет свойство Parent, которое дает родительский элемент управления. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspx

например Control p = this.Parent;

2 голосов
/ 11 января 2012

Вы можете получить Родителя элемента управления через

myControl.Parent

См. MSDN: Control.Parent

1 голос
/ 23 мая 2016

Общий способ получить родительский элемент для элемента управления, который я использовал:

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

Наслаждайтесь!

1 голос
/ 19 ноября 2013

Не идеально, но попробуйте это ...

Измените usercontrol на класс Component (в редакторе кода), создайте решение и удалите весь код с ошибками (относится к usercontrols, но недоступен в компонентах, поэтому отладчик жалуется на это)

Измените usercontrol обратно на класс usercontrol ...

Теперь он распознает имя и родительское свойство, но показывает компонент как невизуальный, поскольку он больше не предназначен.

0 голосов
/ 03 мая 2016

Если вы хотите получить любого родителя от любого дочернего элемента управления, вы можете использовать этот код, и когда вы найдете 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";
        }
    }

}
0 голосов
/ 23 апреля 2014
((frmMain)this.Owner).MyListControl.Items.Add("abc");

Обязательно укажите желаемый уровень доступа в свойствах Модификаторов, кроме Частного, для MyListControl в frmMain

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...