2015-09-21 2 views
2

У меня возникли проблемы с динамически добавлять класс элементов управления, которые должны при работе выглядеть следующим образом:Динамически Добавление Класс управления

enter image description here

Когда новый один добавляется он должен появиться в левой панели под инструментальная панель. До сих пор у меня возникли проблемы с их появлением (один в середине - это только тот проект, который я сделал).

enter image description here

Вот код:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     //Problem Occurs Here 
     EquationBox[] EquationBoxArray = new EquationBox[12]; 
     for (int x = 0; x < 12; x++) 
     { 
      EquationBoxArray[x] = new EquationBox(); 
      ActiveForm.Controls.Add(EquationBoxArray[x].mainPanel); 
      ActiveForm.Controls.Add(EquationBoxArray[x].colorPanel); 
     } 
    } 

    private void add_line_Click(object sender, EventArgs e) //Add Line 
    { 

    } 

    private void clear_Click(object sender, EventArgs e) //Clear Lines 
    { 

    } 
} 

public class EquationBox 
{   
    public Panel colorPanel = new Panel(); 
    public Panel mainPanel = new Panel(); 
    public TextBox equationBox = new TextBox(); 
    public CheckBox isVisibleBox = new CheckBox(); 

    public EquationBox() 
    { 
     mainPanel.Size = new Size(200, 72); 
     colorPanel.Size = new Size(33, 72); 
     mainPanel.Location = new Point(50, 50); 
     colorPanel.Location = new Point(50, 50); 

     colorPanel.BackColor = Color.Red; 
    } 
} 

Проблема возникает здесь:

//Problem Occurs Here 
    EquationBox[] EquationBoxArray = new EquationBox[12]; 
    for (int x = 0; x < 12; x++) 
    { 
     EquationBoxArray[x] = new EquationBox(); 
     ActiveForm.Controls.Add(EquationBoxArray[x].mainPanel); 
     ActiveForm.Controls.Add(EquationBoxArray[x].colorPanel); 
    } 

Когда я запускаю его, он вернется с:

Additional information: Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.

И даже до того, как это произошло, EqautionBox не появится.

Заранее спасибо, это действительно беспокоит меня.

Для конструктора EquationBox:

public EquationBox() 
{ 
    mainPanel.Size = new Size(200, 72); 
    colorPanel.Size = new Size(33, 72); 
    mainPanel.Location = new Point(50, 50); 
    colorPanel.Location = new Point(50, 50); 

    colorPanel.BackColor = Color.Red; 
} 
+1

Как выглядит конструктор EquationBox? –

+0

Вы имеете в виду это? 'public EquationBox() { mainPanel.Size = new Размер (200, 72); цветPanel.Size = новый размер (33, 72); mainPanel.Location = new Point (50, 50); colorPanel.Location = new Point (50, 50); цветPanel.BackColor = Color.Red; } ' –

+1

Попробуйте' User Controls': щелкните правой кнопкой мыши ваш проект, выберите Добавить ..., User Control ..., Назовите User Control и нажмите OK. Перетащите TextBox, CheckBox и т. Д. В элемент управления пользователя. Теперь вы можете создать экземпляр и добавить его в форму. –

ответ

2

Во-первых, появился элемент управления, но mainPanel перекрытие colorPanel и вы не можете увидеть mainPanel (такой же цвет BG в качестве формы), так своп, который добавил первый решил

EquationBox[] EquationBoxArray = new EquationBox[12]; 
for (int x = 0; x < 12; x++) 
{ 
    EquationBoxArray[x] = new EquationBox(); 
    this.Controls.Add(EquationBoxArray[x].colorPanel); 
    this.Controls.Add(EquationBoxArray[x].mainPanel); 
} 

Я использую this.Controls, не уверен, о ActiveForm.Controls части, может быть, на строительство, ваш Form1 не является активным один, так что произошла ошибка.

Пс: Предлагаю добавить colorPanel в mainPanel и добавить только добавление mainPanel в форму. И UserControl - хорошее решение здесь, как сказал Стив Велленс.

1

Существуют различные проблемы с EquationBox текстового поля и CheckBox не в панели. Было бы проще сделать это UserControl.

Затем сделать позиционирование использовать FlowLayoutPanel.

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