#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