Winforms — элементы управления на панели обрезаны

#c# #winforms

#c# #winforms

Вопрос:

Я динамически добавляю элементы управления к элементу управления FlowLayoutPanel. Элементы управления, которые я добавляю в flowlayoutpanel, представляют собой панели, содержащие два элемента управления: метку разного размера и поле со списком фиксированного размера.

Проблема в том, что метка и поле со списком отображаются горизонтально на содержащей их панели (ну, я думаю). Поля со списком обрезаны и едва видны. Я попытался установить для свойства Autosize каждой панели значение true, но это не помогает.

Есть ли способ расположить элементы управления на панели сверху вниз (сложить их)? Может ли проблема быть в flowlayoutpanel?

Спасибо за помощь!

      private void PopulateQuestionFlowPanel()
        {
            foreach (var question in _viewModel.Questions)
            {
                //build question label
                var questionLabel = new Label();
                questionLabel.Text = question.Text;
                questionLabel.Tag = question.Id;

                //build answer combobox
                var answerCombo = CreateQuestionComboBox(question);

                //put question and answer into panel            
                var controlPanel = new Panel();
                controlPanel.Tag = question.Id;
                controlPanel.AutoSize = true;
                controlPanel.Controls.Add(questionLabel);
                controlPanel.Controls.Add(answerCombo);

                //add panels to flowpanel
                questionPanel.Controls.Add(controlPanel);
            }
        }
  

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

1. Панель управления не обеспечивает автоматическую компоновку. Задайте свойства местоположения и размера метки и комбинации. Или используйте пользовательский элемент управления. Или сначала выполните эту работу в конструкторе и посмотрите на сгенерированный дизайнером код, чтобы сделать это правильно.

2. Спасибо.. Я думаю, что usercontrol — хорошая идея

3. @HansPassant Решение для пользовательского управления отлично сработало. Если вы добавите ответ, я бы выбрал его.

4. @Nick: можете ли вы поделиться кодами и как вы создали пользовательский элемент управления

Ответ №1:

Может быть, лучше использовать TableLayoutPanel и удалить все столбцы, чем вы могли бы это сделать :

 int i = 0;
foreach (var question in _viewModel.Questions)
            {
                //build question label
                var questionLabel = new Label();
                questionLabel.Text = question.Text;
                questionLabel.Tag = question.Id;

                //build answer combobox
                var answerCombo = CreateQuestionComboBox(question);

                //put question and answer into panel            
                var controlPanel = new Panel();
                controlPanel.Tag = question.Id;
                controlPanel.AutoSize = true;
                controlPanel.Controls.Add(questionLabel);
                controlPanel.Controls.Add(answerCombo);

                //add panels to flowpanel
                tableLayoutPanel1.SetRow(controlPanel, i);
                tableLayoutPanel1.RowCount = i  ;
            }