Цикл событий & массив объектов класса
Каким образом мне надо сделать поле класса из массива, чтобы туда через textbox добавлялись имена(для их последующего использования в таблице, например)? Или массив объектов класса. На Windows Form
namespace л_б
{
public class Box
{
private string[] name;
private int width;
private int length;
private int weight;
private int age;
private int counter;
public Box(string name) => Name = name;
public string Name
{
get => name[counter];
set
{
if (string.IsNullOrWhiteSpace(value));
throw new ArgumentNullException("Не может быть пустого значения!");
}
}
}
}
namespace л_б
{
static class Program
{
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Box[] NameBox = new Box[5];
}
}
}
namespace л_б
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
Box[] NameBox = new Box[5];
for (int i = 0; i < 5; i++)
{
Box.Name[i] = new Box(textBox1.Text);
}
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
}
}
Ответы (1 шт):
Я не понял предназначение класса Box. Не понял почему внутри него массив и зачем вносить изменения после каждого изменения внутри textbox.
Сделал для Вас пример. На форме находится 3 элемента. TextBox, ListBox и Button. Так же у нас есть список из объектов NameHolder. Всякий раз когда пользователь нажимает на Button, мы создаем объект NameHolder и помещаем его в список. Так же мы обновляем ListBox, чтобы показать текущий список.
Листинг :
public class NameHolder
{
public string Name { get; }
public NameHolder(string name)
{
if(string.IsNullOrWhiteSpace(name))
throw new ArgumentException($"{nameof(name)} cannot be null or empty");
Name = name;
}
public override string ToString() => Name;
}
public partial class Form1 : Form
{
private readonly List<NameHolder> _nameHolders = new List<NameHolder>();
public Form1()
{
InitializeComponent();
listBox1.DataSource = _nameHolders;
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.DataSource = null;
_nameHolders.Add(new NameHolder(textBox1.Text));
listBox1.DataSource = _nameHolders;
listBox1.Refresh();
}
}
Пример работы программы :
P.S. По поводу того что я там в событии кнопки манипулирую с DataSource - я это выяснил опытным путем. Так как Refresh() контрола ничего мне не дал. Поэтому я и подумал, что можно по идее просто сделать перепривязку. Я не знаю что будет если в листе будет находиться более 100 элементов, как это повлияет. Я не рекомендую использовать такую перепривязку. Я считаю что это плохая практика. В рамках обзорного решения примера, я ее оставлю.
UPD Если нужны массивы:
private readonly NameHolder[] _nameHolders = new NameHolder[5];
public Form1()
{
InitializeComponent();
listBox1.DataSource = _nameHolders;
listBox1.Refresh();
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.DataSource = null;
for (var index = 0; index < _nameHolders.Length; ++index)
{
if(_nameHolders[index] != null)
continue;
_nameHolders[index] = new NameHolder(textBox1.Text);
break;
}
listBox1.DataSource = _nameHolders;
listBox1.Refresh();
}
