Как создать объект в Form1 из другого класса?

1

Я пытаюсь написать программу с С# для динамического создания 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();

Это не помогло. Что я делаю неправильно, или, может быть, плохой подход к этой проблеме?

Теги:
class
winforms

3 ответа

0
Лучший ответ

Примечание: в вашем коде вы наследуете таблицу из 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); }
    }
}

Я считаю, что это должно сработать, но я не проверял его. Также обратите внимание, что этот код не оптимизирован. У вас должны быть параметры, переданные функции, чтобы сделать их более универсальными.

  • 0
    Спасибо, этот ответ работает как шарм :)
  • 0
    Благодарю. Попробуйте пометить мой ответ как принятый. Для меня, но и для других пользователей, которые имеют ту же проблему.
Показать ещё 2 комментария
0

Вы можете вернуть 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)}
        }
 }
  • 0
    Это именно то, что я объяснил выше.
  • 0
    Не видел ваш ответ при ответе :)
Показать ещё 2 комментария
0

//Вам нужно добавить элемент управления изображением для управления 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]);
            }
        }
  • 0
    Используйте форматирование в вашем коде. Это не читается.
  • 0
    Не удалось найти способ передать Form1 в качестве параметра.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню