简体   繁体   中英

How do I properly add a custom control to another custom control so that it will render in a form?

I've created a custom control in C#. A highly-simplified version of it is shown below:

class WellControl : Control
    {                
        Pen circlePen = new Pen(Color.Black, 5);
        Brush wellShader = new SolidBrush(Color.BlueViolet);
        Brush wellBlanker = new SolidBrush(Color.LightGray);

        public WellControl(int wellNum)
        {
            InitializeComponent();
        }

        private void DrawWell()
        {
            using (Graphics well = this.CreateGraphics())
            {
                this.Size = new Size(WellSize, WellSize);
                if (this.selected)
                {
                    well.FillEllipse(wellShader, ellipseCoords);
                }
                else
                {
                    well.FillEllipse(wellBlanker, ellipseCoords);
                }

                well.DrawEllipse(circlePen, ellipseCoords);
                using (Font wellNumberFont = new Font("Arial", 14, FontStyle.Bold))
                {
                    well.DrawString(WellNum.ToString(), wellNumberFont, Brushes.Black, new Point(13, 13));
                }
            }
        }

        private void WellPaintEventHandler(object sender, EventArgs e)
        {
            DrawWell();
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            this.Paint += new System.Windows.Forms.PaintEventHandler(WellPaintEventHandler);
            this.ResumeLayout();
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            if (disposing)
            {
                //dispose all the custom stuff
            }
        }
    }

When I add it to a form, it renders properly (again, simplified example):

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            for (int i = 0; i < 4; i++)
            {
                WellControl newWell = new WellControl(i + 1);             
                newWell.Location = new Point(15, 50 * i);
                newWell.Size = new System.Drawing.Size(45, 45);
                this.Controls.Add(newWell);
            }
        }
     }

I have another custom control, "Plate", which is intended to hold many "Wells". The code intended to draw the wells evenly across the plate probably sucks right now but I'm just trying to see something :

class PlateControl : Control
    {

        Pen blackPen = new Pen(Color.Black, 3);

        public PlateControl()
        {
            this.Size = new Size(600, 800);
            List<WellControl> plateWells = new List<WellControl>();
            int column = 1;
            int row = 0;
            for (int i = 1; i <= 96; i++)
            {
                column = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(i / 8)));
                row = i % 8;
                WellControl newWell = new WellControl(i + 1);
                newWell.Name = "wellControl" + i;
                newWell.Location = new Point(column * 50, row * 50);
                newWell.Size = new System.Drawing.Size(45, 45);
                newWell.TabIndex = i;
                newWell.WellSize = 45;
                plateWells.Add(newWell);
                newWell.Visible = true;
            }
            InitializeComponent();
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            this.Paint += new System.Windows.Forms.PaintEventHandler(PlatePaintEventHandler);
            this.ResumeLayout();
        }

        private void DrawPlate()
        {
            using (Graphics plate = this.CreateGraphics())
            {
                Point topLeft = new Point(0, 0);
                Point topRight = new Point(600, 0);
                Point bottomRight = new Point(600, 400);
                Point bottomLeft = new Point(0, 400);

                plate.DrawLine(blackPen, topLeft, topRight);
                plate.DrawLine(blackPen, topRight, bottomRight);
                plate.DrawLine(blackPen, bottomRight, bottomLeft);
                plate.DrawLine(blackPen, bottomLeft, topLeft);
            }
        }

        private void PlatePaintEventHandler(object sender, EventArgs e)
        {
            DrawPlate();
        }
    }

If I add this control to a Winform using this.Controls.Add(new PlateControl()), the rectangle renders, but not the WellControls I added to the PlateControl in the constructor loop. What am I doing incorrectly?

You need to add List of WallControl to plate control.

public PlateControl()
        {
            this.Size = new Size(600, 800);
            List<WellControl> plateWells = new List<WellControl>();
            int column = 1;
            int row = 0;
            for (int i = 1; i <= 96; i++)
            {
                column = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(i / 8)));
                row = i % 8;
                WellControl newWell = new WellControl(i + 1);
                newWell.Name = "wellControl" + i;
                newWell.Location = new Point(column * 50, row * 50);
                newWell.Size = new System.Drawing.Size(45, 45);
                newWell.TabIndex = i;
                newWell.WellSize = 45;
                plateWells.Add(newWell);
                newWell.Visible = true;
            }
            this.Controls.AddRange(plateWells.ToArray());
            InitializeComponent();
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM