2016-12-15 3 views
0

OK - здесь я снова - C# новичок par excellence!C# TableLayoutPanel - заполнять и дублировать элементы управления строками

Предположим, у меня есть TableLayoutPanel, как показано - с одной строки, а число столбцов ... я заселить, что один ряд с блоком управления (наклейки, текстовые поля и т.д.).

Теперь я хочу, чтобы дублировал, что строка 'n' раз и индексирует каждое из элементов управления как элемент массива (элементов управления) - например. labelName [rowIndex] .Text = «Новый текст»

  • есть ли лучший способ сделать это ...?

1] Большое спасибо - моя последняя попытка сделать это было много лет назад с VB6!

ответ

1

Один из способов - создать List<List<Control>>. Затем каждая строка, заполняющая таблицу tablelayout, будет находиться в List<Control>. Предполагая, 3 колонки, это будет выглядеть примерно так:

List<List<Control>> contrlList = new List<List<Control>>(); 
for (int row = 0; row < tableLayoutPanel1.RowCount; row++) 
{ 
    List<Control> rowControls = new List<Control>() 
     { 
      new DateTimePicker(), 
      new TextBox(), 
      new Label() 
     }; 
    for (int col = 0; col < tableLayoutPanel1.ColumnCount; col++) 
    { 
     tableLayoutPanel1.Controls.Add(rowControls[col], col, row); 
     contrlList.Add(rowControls); 
    } 
} 

Для доступа общих свойств вы могли бы назвать это так:

contrlList[0][1].Text = "Whatever"; 

Чтобы получить специфические свойства, уникальные для каждого типа управления, вы будете должны привести его к соответствующему типу:

((DateTimePicker)contrlList[0][0]).CalendarTitleBackColor = Color.AliceBlue; 

чтобы создать обработчики событий, которые каждый тип управления может использовать, загрузите один из этого типа в конструкторе. В окне свойств в заголовке находится значок, похожий на молнию. Появится список событий, которые будут иметь этот тип контроля. Дважды щелкните событие, которое вы хотите обработать. Это создаст фрагмент кода. Переименуйте метод, чтобы он не указывал на конкретный экземпляр этого элемента управления (например, ComboBox_SelectedIndexChanged вместо comboBox1_SelectedIndexChanged). Теперь просто добавить этот обработчик событий, чтобы элемент управления знал, где именно это событие.

List<List<Control>> contrlList = new List<List<Control>>(); 
for (int row = 0; row < tableLayoutPanel1.RowCount; row++) 
{ 
    DateTimePicker newDTP = new DateTimePicker(); 
    ComboBox newCB = new ComboBox(); 
    newCB.SelectedIndexChanged += comboBox_SelectedIndexChanged; 
    Label newL = new Label(); 
    List<Control> rowControls = new List<Control>() 
     { 
      newDTP, 
      newCB, 
      newL 
     }; 
    for (int col = 0; col < tableLayoutPanel1.ColumnCount; col++) 
    { 
     tableLayoutPanel1.Controls.Add(rowControls[col], col, row); 
     contrlList.Add(rowControls); 
    } 
} 
+0

OK - позвольте мне подумать об этом! Все это имеет смысл, но менее интуитивно понятным и читаемым, чем я ожидал. –

+0

Да, мне нравится относительная простота этого. Я знаю, что элемент управления списком был предложен выше, но ваш пост более читабельен для дорка, как я! –

+0

Мне это удалось, но у меня есть anoher twist, который может решить несколько вопросов в целом ... Предполагая, что некоторые из загруженных элементов управления являются comboBoxes ... как я могу их заполнить (и получить событие, когда оно изменения. –