c # winforms элементы массива удаляются - PullRequest
0 голосов
/ 04 декабря 2018

Я знаю, это может выглядеть глупо, но у меня странная проблема в моем winforms.У меня есть приложение Windows, в котором после завершения определенного набора операций я хочу заполнить Проверено ComboBox .Я делаю это, используя два класса.Я хочу скопировать массив из вспомогательного класса в класс формы .Массив копируется при вызове метода AddArrayItems.Но когда я вижу ComboBox в форме, его ноль.После отладки с помощью переменных наблюдения я узнал, что проблема заключается в том, что после копирования массива в массив Form1 элемент управления возвращается к вызывающей стороне, элементы массива удаляются.Я пытался копировать свои вещи, не совсем, но все еще похоже на то, что я делаю.

Мой код выглядит так:

using System;
using System.Windows.Forms;

namespace DemoApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }    
        string[] cboxAr;    

        public void AddCmboBoxItems(string[] cbArry)
        {
            cboxAr = new string[cbArry.Length];
            Array.Copy(cbArry, 0, cboxAr, 0, cbArry.Length); 
            //cbArry.CopyTo(cboxAr, 0);
            //foreach (string s in cboxAr)
                //comboBox1.Items.Add(s);
            comboBox1.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            HelperClass.DoSomething();
        }
    }

    public class HelperClass
    {
        public HelperClass()
        {
        }

        public void HelperMethod()
        {
            SomeMethod();
        }

        private void SomeMethod()
        {
            string[] partnrName = new string[5] { "str1", "str2", "str3", "str4", "str5"};

            Form1 f = new Form1();
            f.AddCmboBoxItems(partnrName);
        }

        public static void DoSomething()
        {
            new HelperClass().HelperMethod();
        }
    }
}

Я не понимаю, в чем именно проблема здесь,Может кто-нибудь, пожалуйста, подтолкнуть меня в правильном направлении.Заранее спасибо.

1 Ответ

0 голосов
/ 04 декабря 2018

Вы никогда не показываете форму после изменения ее элементов управления:

Form1 f = new Form1();
f.AddCmboBoxItems(partnrName);

Но вы вызываете это из существующей формы:

private void button1_Click(object sender, EventArgs e)
{
    HelperClass.DoSomething();
}

Предположительно, вы хотите изменить элементы управления на этой форме?Тогда вам понадобится ссылка на эту форму.Передайте один метод:

private void button1_Click(object sender, EventArgs e)
{
    HelperClass.DoSomething(this);
}

И примите его в определении метода:

public static void DoSomething(Form1 form)
{
    new HelperClass().HelperMethod(form);
}

И так до точки, где вам нужно его использовать.(Примечание: у вас много странных косвенных указаний, происходящих здесь с кажущейся случайной смесью статических и экземпляров методов и классов. Вы можете упростить многое, что приведет к меньшему количеству изменений кода.)

В конечном счете, SomeMethod требуется изменить экземпляр формы:

private void SomeMethod(Form1 form)
{
    string[] partnrName = new string[5] { "str1", "str2", "str3", "str4", "str5"};

     form.AddCmboBoxItems(partnrName);
}

Чтобы проиллюстрировать общую точку зрения, рассмотрим аналогию ...

Автомобиль съезжает ссборочная линия.Вы открываете сундук и кладете чемодан внутрь.Через несколько мгновений другая машина сошла с той же сборочной линии.Он идентичен первому автомобилю во всех отношениях.Когда вы открываете багажник второй машины, ожидаете ли вы найти в ней свой чемодан?

A Form - это такой же объект, как и любой другой.Изменения, внесенные в один экземпляр объекта, не отражаются в других экземплярах того же объекта.Каждый экземпляр поддерживает свое собственное состояние.Чтобы изменить конкретный экземпляр, вам нужна ссылка на этот экземпляр.

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