2014-01-17 2 views
0

Я создал пользовательский элемент управления на C#. Очень-упрощенная версия этого показан ниже:Как правильно добавить настраиваемый элемент управления в другой настраиваемый элемент управления, чтобы он отображался в форме?

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 
      } 
     } 
    } 

Когда я добавить его в форму, он делает правильно (опять-таки, упрощенный пример):

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); 
      } 
     } 
    } 

У меня есть другой пользовательский элемент управления, " Plate ", который предназначен для размещения многих« колодцев ». Код предназначен для равномерного начертить скважины через пластину, вероятно сосет прямо сейчас, но я просто пытаюсь увидеть что-то :

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(); 
     } 
    } 

Если добавить этот элемент управления с помощью Winform this.Controls.Add (новый PlateControl()), прямоугольник визуализирует, но не WellControls, который я добавил в PlateControl в цикле конструктора. Что я делаю неправильно?

+1

Вы указали нам свой упрощенный код, но, по-моему, вы его упростили, он не будет компилировать, вам не хватает определений для некоторых переменных. –

+0

У WellControl есть ошибка компиляции. – Ramashankar

ответ

2

Вам необходимо добавить список элементов управления WallControl для управления табличкой.

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(); 
     } 
+0

Дох, ты тоже избил меня, плохая моя медленная печать. – Amleth

+0

Это сделало. Спасибо! – DeeDee

Смежные вопросы