Динамическая генерация групповых блоков

#c# #winforms

#c# #winforms

Вопрос:

Я работаю над программой инвентаризации и завершил основную функциональность в качестве консольного приложения командной строки. Сейчас я работаю над версией для winforms. Я хочу включить его для динамической генерации группового поля, содержащего несколько текстовых полей. Я бы предпочел не создавать более 50 строк из нескольких текстовых полей. Имейте в виду, что я довольно новичок в программировании, начав с C # год назад. Я почти ничего не знаю о Winforms.

Я пытался использовать dynamic item = new Groupbox(); в качестве аналогичного метода разрешенную генерацию объектов во время выполнения. В приложении командной строки это работает так, что на основе предоставленной информации определенное количество объектов передается в список _AllItems . Я думал о создании групповых полей с помощью:

 private void InitializeGroupBox()
        {
            foreach (Product product in Product._AllItems)
            {
                dynamic Item = new GroupBox();
            }

        }
 

Но у меня такое чувство, что я далек от правильного метода. Спасибо всем, кто помогает.

Комментарии:

1. groupbox — это контроллер контейнерного типа, и обычно в него встроены другие элементы управления. Лучше создать список и поместить его в групповое поле

2. Возможно, вы захотите вместо этого взглянуть на DataGridView . В качестве альтернативы, создайте одну панель FlowLayoutPanel перед циклом, затем динамически создайте текстовые поля внутри цикла и добавьте их в панель FlowLayoutPanel.

3. Ну, начало правильное, но вам также нужно добавить новые элементы управления к родительскому элементу управления, скорее всего, к форме или странице вкладок.: dynamic Item = new GroupBox(); Item.Parent = thisOrSomeTabPage; ; Также отличная идея добавить их групповые поля в словарь> строка, групповое поле> с красивым именем в качестве ключа, чтобы вы могли ссылаться наих позже, когда вы добавите текстовые поля или что-то еще..

4. Вы объединяете динамическую генерацию с динамической типизацией. Вам не нужно использовать динамическую типизацию. Загляните в код .designer.cs для вашей формы, чтобы получить представление о том, как добавлять элементы управления программно — используемые там шаблоны, которые были сгенерированы дизайнером, могут быть записаны в любом другом месте вашей программы для добавления элементов управления «на лету».

Ответ №1:

Вам нужно будет узнать немного больше, но вот что я обычно делаю, чтобы добиться того, о чем вы просили.

 internal class DynamicForm : Form
{
    private FlowLayoutPanel mFlowLayoutPanel;

    public DynamicForm() 
    {
        mFlowLayoutPanel = new FlowLayoutPanel();
        mFlowLayoutPanel.Dock = DockStyle.Fill;

        // Add to this Form
        this.Controls.Add(mFlowLayoutPanel);

        InitializeGroupBox();
    }

    private void InitializeGroupBox()
    {
        mFlowLayoutPanel.SuspendLayout(); // Performance

        for (int i = 1; i <= 20; i  ) {
            var groupBox = new GroupBox();
            groupBox.Text = "GroupBox #"   i;
            groupBox.Size = new Size(200, 50);

            var textBox = new TextBox();
            textBox.Dock = DockStyle.Fill;

            // Add the TextBox to GroupBox
            groupBox.Controls.Add(textBox);

            // Add to this Form
            mFlowLayoutPanel.Controls.Add(groupBox);
        }

        mFlowLayoutPanel.ResumeLayout(); // after suspend, resume!
    }
}