У меня очень странная проблема, когда я создаю список некоторых объектов в одном классе, а затем пытаюсь получить к нему доступ в другом классе, но он становится пустым в другом классе:

Мой первый класс, где я заполняю список:

namespace dragdrop
{
    struct BR
    {
        private string var;
        public string Var
        {
            get { return var; }
            set { var = value; }
        }
        private string equalsTo;

        public string EqualsTo
        {
            get { return equalsTo; }
            set { equalsTo = value; }
        }
        private string output;

        public string Output
        {
            get { return output; }
            set { output = value; }
        }
        private string els;

        public string Els
        {
            get { return els; }
            set { els = value; }
        }
        private string elsOutput;

        public string ElsOutput
        {
            get { return elsOutput; }
            set { elsOutput = value; }
        }



    }
    public partial class Form1 : Form
    {
    //******************
        private List<BR> list = new List<BR>(); //This is the list!
    //******************

        internal List<BR> List
        {
            get { return list; }
            set { list = value; }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string[] vars = new string[] { "Name", "Gender", "Age", "Address", "email" };

            comboBox1.DataSource = vars;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            BR b = new BR();
            b.Var = comboBox1.SelectedItem.ToString();
            b.EqualsTo = textBox1.Text;
            b.Output = textBox2.Text;
            list.Add(b);
    //*****************
            textBox1.Text = List.Count.ToString(); //This gives the correct count value!
    //*****************
            //this.Close();
        }

    }
}

Я обращаюсь к нему во втором классе, например:

namespace dragdrop
{
    public partial class Ribbon1
    {
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {

        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            Form1 form = new Form1();
            List<BR> l = form.List; ;         
            //*******************
            MessageBox.Show(form.List.Count.ToString()); //This strangely gives count 0!
            //*******************
        }

    }
}

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

-1
Abdul Jabbar 16 Окт 2014 в 10:46
Вы заполняете свой список нажатием кнопки, но пытаетесь получить доступ к вновь созданной форме Form1, где вы не нажимаете кнопку и не заполняете свой список
 – 
Grundy
16 Окт 2014 в 10:49
Список должен быть заполнен, когда я нажимаю вторую кнопку, я делаю их по порядку .. первый щелчок form1, затем щелчок второго класса
 – 
Abdul Jabbar
16 Окт 2014 в 10:50
1
Вы фактически создаете новый объект Form1 и получаете доступ к списку без инициализации
 – 
vallabha
16 Окт 2014 в 10:51
1
Да, но когда вы нажимаете кнопку на ленте, кнопка в форме не нажимается, поэтому в вашем списке ничего не будет.
 – 
failedprogramming
16 Окт 2014 в 10:57
1
Кажется, вам не хватает фундаментального понимания объектно-ориентированного программирования, поэтому очень сложно дать вам правильный совет. Ищите экземпляры по сравнению с классами во вводном курсе/книге/что угодно.
 – 
flindeberg
16 Окт 2014 в 11:06

2 ответа

Между Form1 и Ribbon1 нет никакой связи, как тогда можно получить доступ к экземпляру другого?

С этим:

        Form1 form = new Form1(); // new instance of Form1
        List<BR> l = form.List; ; // of course the list is empty in a new instance!

Вы никогда не сможете получить доступ к значениям из другого экземпляра Form1.

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

1
flindeberg 16 Окт 2014 в 11:01

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

private static List<BR> list = new List<BR>();
-1
Abdul Jabbar 16 Окт 2014 в 11:22
2
Если у вас есть несколько экземпляров Form1, теперь все они будут использовать один и тот же List. Иногда это то, что вы хотите, но часто это не так. Так что это может работать в этом случае, но это не очень хорошее решение.
 – 
Pieter Witvoet
16 Окт 2014 в 11:29
Как говорит Питер, это не очень хорошее решение; он не обрабатывает несколько экземпляров Form1, что произойдет, если у вас одновременно открыто несколько экземпляров Word?
 – 
flindeberg
16 Окт 2014 в 11:31
Честно и без обид, вам не хватает очень важных и базовых навыков программирования. Если это связано с работой, это, вероятно, потерпит неудачу. Я рекомендую вам пройти обучение.
 – 
Ignacio Soler Garcia
16 Окт 2014 в 12:16