Подтвердить что ты не робот

Получить доступ к родительскому элементу управления из пользовательского элемента управления - С#

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

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

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

4b9b3361

Ответ 1

Описание

Вы можете получить родительский элемент управления с помощью 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");

    }
}

Ответ 2

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

Значение свойства Parent для управления может отличаться от формы возвращен методом FindForm. Например, если элемент управления RadioButton содержащихся в элементе управления GroupBox, и GroupBox находится в форме, Элемент управления RadioButton Parent - это GroupBox и GroupBox control Parent - это форма.

Ответ 3

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

myControl.Parent

См. MSDN: Control.Parent

Ответ 5

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

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

Измените usercontrol обратно в usercontrol class...

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

Если вы хотите получить любого родителя с помощью любого дочернего элемента управления, вы можете использовать этот код, и когда вы найдете UserControl/Form/Panel или другие, вы можете вызвать funnctions или установить/получить значения:

Control myControl= this;
while (myControl.Parent != null)
{

    if (myControl.Parent!=null)
    {
        myControl = myControl.Parent;
        if  (myControl.Name== "MyCustomUserControl")
        {
            ((MyCustomUserControl)myControl).lblTitle.Text = "FOUND IT";
        }
    }

}