C# VSTO Winform Control Доступ к элементам управления из динамически созданной формы

У меня есть надстройка Excel, которая вызывает форму Windows со списком. Прежде чем показать форму, я хочу заполнить ListBox динамически на основе значений из Excel.

Winform выглядит следующим образом:

введите здесь описание изображения

Нажатие кнопки на ленте выглядит следующим образом:

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    Form1 fm = new Form1();
    System.Windows.Forms.ListBox lbx = fm.Controls.Find("listBox1", true).FirstOrDefault() as System.Windows.Forms.ListBox;
    lbx.Items.AddRange(new object[] { 1, 2, 3, 4, 5 });
    fm.Show();
}

Is

System.Windows.Forms.ListBox lbx = fm.Controls.Find("listBox1", true).FirstOrDefault() as System.Windows.Forms.ListBox;

лучший способ получить доступ к ListBox и добавить к нему Items?
Или есть другой способ?


person ProgSky    schedule 08.08.2018    source источник
comment
Вы должны создать свойство ListBoxData в Form1 с типом object[], а установщик свойства должен добавить значения в список. И вы присваиваете значения этому свойству, выполняя fm.ListBoxData = new object[] { 1, 2, 3, 4, 5 };   -  person Chetan Ranpariya    schedule 08.08.2018
comment
Здорово. спасибо за подсказку. Не могли бы вы проверить, хорошо ли выглядит моя реализация. Я разместил как ответ?   -  person ProgSky    schedule 08.08.2018


Ответы (2)


В вашем сценарии, поскольку вы создаете новый экземпляр Form1 каждый раз, когда хотите его показать, и поскольку это настраиваемая форма, я бы просто изменил конструктор формы, чтобы он принимал входные данные.

public Form1(object[] ListBoxData)
{
   ...
   listBox1.Items.AddRange(ListBoxData);
}

Затем вы можете просто передать значения при нажатии кнопки;

Form1 fm = new Form1(new object[] { 1, 2, 3, 4, 5 });
fm.Show();
person Mark Diedericks    schedule 08.08.2018

По предложению Четана: Недвижимость:

 public object[] ListBoxData
        {
            set
            {
                listBox1.Items.AddRange(value);
            }
        }

Изменение нажатия кнопки:

 Form1 fm = new Form1();
            fm.ListBoxData = new object[] { 1, 2, 3, 4, 5 };
            fm.Show();
person ProgSky    schedule 08.08.2018
comment
В этой реализации вы никогда не будете устанавливать объекты в списке, а будете добавлять их. Вместо этого вы должны использовать listBox1.Items.Clear(), чтобы очистить список, а затем добавить новые элементы. - person Mark Diedericks; 09.08.2018