如何在另一个类中创建Form1中的对象?

时间:2014-05-26 11:17:18

标签: c# winforms class

我正在尝试使用C#编写程序来动态创建另一个类的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窗口中没有定义)。如果类Table中的过程移动到Form1类它完美地工作,但我想从其他类控制它以减少Form1中的代码大小。我试图在类表中创建Form1对象:

Form1 frm1 = new Form1();

没有帮助。我做错了什么,或者对这个问题使用不好的方法?

3 个答案:

答案 0 :(得分:0)

注意:在您的代码中,您从Form1继承表。这意味着Table表示一个新表单,而不是对当前现有表单的引用,因此它不会做任何事情。

在原始表单的Controls属性中,您只是添加了另一个表单,这绝对不是您需要的行为。

我已经把你的代码作为一个开始并稍微改编了一下。 我认为这应该有用。

创建您的类表,但是DON&#39; T继承自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); }
    }
}

我相信这应该有用,但我还没有测试过。另请注意,此代码未进行优化。您应该将参数传递给函数,以使其更通用。

答案 1 :(得分: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)}
        }
 }

答案 2 :(得分:0)

//你需要将mapbox控件添加到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]);
            }
        }