Как я могу получить доступ к моему ListView для добавления элементов из отдельного класса на C#

#c# #winforms

#c# #winforms

Вопрос:

У меня есть элемент ListView в Form1, и у меня есть отдельный класс с именем Common, который обрабатывает некоторые функции. Моя проблема в том, что я не могу получить к нему прямой доступ для добавления элементов. Пытался найти некоторые полезные ресурсы, но все еще не могу заставить его работать. Вот мой код:

Form1

 namespace myTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void tempAddToList( ListViewItem items )
        {

            ListView1.Items.AddRange(new ListViewItem[] { items });

        }
    }
}
  

Common.cs

 namespace myTest
{
    class Common
    {
        private Form1 mainForm;

        public Common()
        {

        }
        public Common(Form1 mMainForm)
        {
            mainForm = mMainForm;
        }

        ListViewItem item1 = new ListViewItem("1");
        item1.SubItems.Add("1");
        item1.SubItems.Add("2");
        item1.SubItems.Add("3");
        item1.SubItems.Add("4");
        item1.SubItems.Add("5");
        item1.SubItems.Add("6");
        item1.SubItems.Add("7");
        item1.SubItems.Add("8");

        mainForm.tempAddToList(item1);
    }
}
  

В основном вызов MainForm.tempAddToList(item1); не работает. Я всегда получаю

Необработанное исключение типа ‘System.NullReferenceException’ произошло в myTest.exe Дополнительная информация: Ссылка на объект не установлена для экземпляра объекта.

Дополнительный вопрос: Могу ли я получить доступ к ListView1 из Form1, чтобы я мог вызывать и добавлять непосредственно в Common? Например

 ListViewItem item1 = new ListViewItem("1");
item1.SubItems.Add("1");
item1.SubItems.Add("2");
item1.SubItems.Add("3");
item1.SubItems.Add("4");
item1.SubItems.Add("5");
item1.SubItems.Add("6");
item1.SubItems.Add("7");
item1.SubItems.Add("8");
Form1.ListView1.Items.AddRange(new ListViewItem[] { items });
  

Комментарии:

1. Можете ли вы подробнее рассказать о том, как ваш код «не работает». Чего вы ожидали и что на самом деле произошло? Если вы получили исключение, опубликуйте строку, в которой оно произошло, и сведения об исключении. Кроме того, где вы когда-либо вызывали конструктор Common (с перегрузкой)?

2. Вы должны быть уверены, что находитесь в потоке пользовательского интерфейса form1 при вызове add .

3. Этот код не компилируется. Код, который создает элемент ListViewItem, находится вне любого метода класса Common

4. @huMptyduMpty: это winforms, а не xaml…

5. @code4life Какая разница? События и обработчики событий существуют в обеих технологиях. Они являются особенностью C #.

Ответ №1:

Ваш код недействителен.
Строки кода, которые добавляются в ListViewItem, должны находиться внутри метода класса Common

 namespace myTest
{
    class Common
    {
        private Form1 mainForm;

        public Common()
        {

        }
        public Common(Form1 mMainForm)
        {
            mainForm = mMainForm;
        }

        public void AddItemToListView()
        {
            if(mainForm == null)
                throw new InvalidOperationException("Class instance intialized with wrong constructor!");

            ListViewItem item1 = new ListViewItem("1");
            item1.SubItems.Add("1");
            item1.SubItems.Add("2");
            item1.SubItems.Add("3");
            item1.SubItems.Add("4");
            item1.SubItems.Add("5");
            item1.SubItems.Add("6");
            item1.SubItems.Add("7");
            item1.SubItems.Add("8");

            mainForm.tempAddToList(item1);
        }
    }
}
  

Теперь вы можете писать, когда у вас есть экземпляр Form1

  Common cm = new Common(instanceOfForm1);
 cm.AddItemToListView();
  

Обратите внимание, что вам нужно создать экземпляр класса, общего с конструктором, который принимает экземпляр Form1, в противном случае вызов экземпляра null вызовет исключение NullReference .
Проверка перед добавлением элементов в ListView может защитить ваш код от этого исключения.

Комментарии:

1. Функция tempAddToList() в Form1 настолько бесполезна, что я вызываю ее туда и обратно в Common.

2. Можете ли вы тогда объяснить, зачем вам нужен общий класс с этой функциональностью?

3. Общие хранилища для подключения к БД и некоторых функций. Это похоже на общую функцию для всех форм в моем проекте.

4. В этом ответе было бы лучше исключить конструктор без параметров.

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

Ответ №2:

Вы никогда не вызываете mainFormObject mMainForm. Вместо

 mainForm.tempAddToList(item1);
  

Попробуйте

 mMainForm.tempAddToList(item1);
  

Комментарии:

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

2. Ах, очень верно. Спасибо за это. Извините @wpleet