Я пытаюсь написать программу с С# для динамического создания PictureBox'ов из другого класса.
Вот что делается:
В классе Form1 создается объект другого класса и процедура вызова в том классе, который создает объекты (многие PictureBox'es), я хочу
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Lines_online
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//trying to draw NxM table
//where N is horizontal cell count M is vertical cell count
Table tbl = new Table();
tbl.Tablenm(9, 9);
}
}
}
Класс Таблица:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
namespace Lines_online
{
public class Table : Form1
{
List<PictureBox> cell = new List<PictureBox>();
public void Tablenm(int n, int m)
{
for (int i = 0; i < n*m; i++)
{
PictureBox pict = new PictureBox();
cell.Add(pict);
cell[i].Size = new Size(20, 20);
cell[i].Location = new Point(30 + (i % n) * 19, 30 + (i / m) * 19);
cell[i].Image = Properties.Resources.lang20x20;
Controls.Add(cell[i]);
}
}
}
}
Затем выполняется код, он ничего не делает и не дает ошибок (я думаю, что он создает объекты где-то, но определенно не в окне Form1). Если процедура в таблице классов переместилась в класс Form1, она отлично работает, но я хочу контролировать ее из другого класса, чтобы уменьшить размер кода в Form1. Я попытался создать объект Form1 в таблице классов:
Form1 frm1 = new Form1();
Это не помогло. Что я делаю неправильно, или, может быть, плохой подход к этой проблеме?
Примечание: в вашем коде вы наследуете таблицу из Form1. Это означает, что таблица представляет новую форму вместо ссылки на существующую существующую форму, и поэтому она ничего не делает.
В свойстве Controls вашей оригинальной формы вы просто добавляете другую форму, которая определенно не соответствует поведению, которое вам нужно.
Я взял ваш код в качестве начала и немного адаптировал его. Я думаю, что это должно сработать.
Создайте таблицу классов, но не наследуйте Form1. Сделайте свой класс таким, чтобы он выглядел следующим образом:
public class Table
{
public List<PictureBox> Render(int n, int m)
{
List<PictureBox> returnList = new List<PictureBox>();
for (int i = 0; i < n*m; i++)
{
PictureBox pict = new PictureBox();
pict.Size = new Size(20, 20);
pict.Location = new Point(30 + (i % n) * 19, 30 + (i / m) * 19);
pict.Image = Properties.Resources.lang20x20;
returnList.Add(pict);
}
return returnList;
}
}
Затем в вашей основной форме вы можете вызвать свой метод:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
var table = new Table();
IEnumerable<Control> controls = table.Render(10, 10);
foreach (var control in controls)
{ this.Controls.Add(control); }
}
}
Я считаю, что это должно сработать, но я не проверял его. Также обратите внимание, что этот код не оптимизирован. У вас должны быть параметры, переданные функции, чтобы сделать их более универсальными.
Вы можете вернуть List<PictureBox>
в Form1
public List<PictureBox> Tablenm(int n, int m)
{
for (int i = 0; i < n*m; i++)
{
PictureBox pict = new PictureBox();
cell.Add(pict);
cell[i].Size = new Size(20, 20);
cell[i].Location = new Point(30 + (i % n) * 19, 30 + (i / m) * 19);
cell[i].Image = Properties.Resources.lang20x20;
}
return cell;
}
Затем добавьте его внутри формы:
private void Form1_Load(object sender, EventArgs e)
{
//trying to draw NxM table
//where N is horizontal cell count M is vertical cell count
Table tbl = new Table();
var pictureBoxes = tbl.Tablenm(9, 9)
foreach (var pictureBox in pictureBoxes)
{
Controls.Add(picturebox)}
}
}
//Вам нужно добавить элемент управления изображением для управления form1 в цикле, //Form1.Control.Add(cell[i]);
/ / -------------------
public void Tablenm(int n, int m, Form Form1)
{
for (int i = 0; i < n*m; i++)
{
PictureBox pict = new PictureBox();
cell.Add(pict);
cell[i].Size = new Size(20, 20);
cell[i].Location = new Point(30 + (i % n) * 19, 30 + (i / m) * 19);
cell[i].Image = Properties.Resources.lang20x20;
Form1.Control.Add(cell[i]);
}
}