Как создать управление полем комбинированного списка с невыбираемыми объектами? Например, такой groupnames или categorynames, которые визуально делят объекты на dropdownlist в некоторые группы или категории.
Вместо добавления строк в поле со списком вы можете добавить специальный класс и использовать выбранный элемент, чтобы определить, выбран этот элемент или нет.
public partial class Form1 : Form
{
private class ComboBoxItem
{
public int Value { get; set; }
public string Text { get; set; }
public bool Selectable { get; set; }
}
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
this.comboBox1.ValueMember = "Value";
this.comboBox1.DisplayMember = "Text";
this.comboBox1.Items.AddRange(new[] {
new ComboBoxItem() { Selectable = false, Text="Unselectable", Value=0},
new ComboBoxItem() { Selectable = true, Text="Selectable1", Value=1},
new ComboBoxItem() { Selectable = true, Text="Selectable2", Value=2},
new ComboBoxItem() { Selectable = false, Text="Unselectable", Value=3},
new ComboBoxItem() { Selectable = true, Text="Selectable3", Value=4},
new ComboBoxItem() { Selectable = true, Text="Selectable4", Value=5},
});
this.comboBox1.SelectedIndexChanged += (cbSender, cbe) => {
var cb = cbSender as ComboBox;
if (cb.SelectedItem != null && cb.SelectedItem is ComboBoxItem && ((ComboBoxItem) cb.SelectedItem).Selectable == false) {
// deselect item
cb.SelectedIndex = -1;
}
};
}
}
Посмотрите здесь на CodeProject поле со списком только для чтения, вот еще одна статья, чтобы сделать поле со списком только для чтения "приличным" ... Вот еще одно, которое показывает, как переопределить базовое стандартное поле со списком, чтобы сделать его только для чтения , как предложил Сани.