Чистый способ отобразить / скрыть кучу кнопок на основе выбора ComboBox - PullRequest
0 голосов
/ 15 апреля 2010

Я пишу отдельное приложение в VB.NET с использованием Visual Studio 2005.

Я хочу отобразить / скрыть группу Button с на основе выбранного значения ComboBox. Каждый выбор будет иметь различный набор Button с для отображения, и я бы хотел, чтобы они были расположены в красивой сетке.

Управление TabControl со значением ComboBox было бы таким поведением, которое я хочу, но я не хочу, чтобы он выглядел для пользователя как TabControl, потому что это может сбивать с толку.

Есть ли способ сделать это?

По сути, я бы хотел, чтобы Selection1 в ComboBox отображал кнопки 1-4, Selection2 для отображения кнопок 5-11, Selection3 для отображения (возможно) кнопок 1, 3, 5, 6 и 8 и т. Д. они хорошо расположены, и графический интерфейс показывает только ComboBox и кнопки.

Заранее спасибо как всегда!

Ответы [ 3 ]

2 голосов
/ 09 июля 2010

Вы можете разместить все свои кнопки на панели формы. Затем, когда происходит событие SelectedIndex в выпадающем списке, вы можете переключаться между кнопками на панели и включать и выключать их в зависимости от их свойства Tag.

В этом примере вы должны установить свойство Tag каждой кнопки равным индексу выпадающего списка или индексам, для которых вы хотите включить его. Если вы хотите, чтобы он был видим более чем для одного комбинированного выбора, просто запишите значения индекса в свойстве тега через запятую.

Вам не нужно отключать индекс выпадающего списка. Вы можете использовать выделенный текст, например. Если вы это сделали, просто поместите тексты для отображения кнопки в свойстве tag и измените код с ComboBox1.SelectedIndex.ToString на ComboBox1.SelectedText.

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

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    For Each ctrl As Control In Me.Panel1.Controls
        If TypeOf ctrl Is Button Then
            If Array.IndexOf(Split(ctrl.Tag, ","), ComboBox1.SelectedIndex.ToString) > -1 Then
                ctrl.Visible = True
            Else
                ctrl.Visible = False
            End If
        End If
    Next
End Sub
2 голосов
/ 15 апреля 2010

Используйте элемент управления Panel (или несколько, если элементы не сгруппированы рядом друг с другом) и установите видимость соответствующим образом.

(Добавлено) Вы МОЖЕТЕ сложить панели друг на друга, чтобы все кнопки выглядели так, как будто они находятся в одном месте. но это становится кошмаром обслуживания, и я не рекомендую это.,

Предупреждение о взломе - это взлом, но это работает.

Другой вариант - использовать элемент управления вкладкой, но скрыть кнопки вкладки. (Это можно сделать, разместив панель над кнопками, но вы должны быть осторожны, чтобы позволить пользователю изменить размер формы.) Затем вы устанавливаете TabIndex на основе изменения раскрывающегося списка.

Изменить еще раз - добавлено за комментарий

Если вы используете хак, вы можете добавить это в выбранное событие изменения индекса ComboBox ....

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

TabControl1.SelectedIndex = ComboBox1.SelectedIndex
1 голос
/ 15 апреля 2010

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

...