2011-02-03 4 views
0

У меня есть ToolStripDropDownButton, содержащий ToolStripControlHost, содержащий CheckedListBox в C#, например так:ToolstripControlHost'ed CheckedListBox проблема переполнения

checkedListBox = new CheckedListBox(); 
dropDownButton = new ToolStripDropDownButton("Button"); 
host = new ToolStripControlHost(checkedListBox); 
dropDownButton.DropDownItems.Add(host); 

Все отлично, пока количество элементов в CheckedListBox работает растет checklistbox вне экрана границ и ToolStripDropDown рисует «крошечную треугольную кнопку» вверху и внизу, чтобы прокручивать меню вверх или вниз. Всякий раз, когда я нажимаю для прокрутки, я сбой в System.Windows.Forms.ToolStripItemCollection.this[].get с этим исключением:

Индекс был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс

Я подозреваю, что, поскольку ToolStripDropDownButton только действительно имеет один элемент (узел), это является причиной моего исключения. Если это так, у кого-нибудь есть обходные пути?

ответ

0

Ваша догадка правильная. Проблема находится в .NET логике при для отображения кнопок скроллбара (в ToolStrip.SetDisplayedItems), который:

bool verticallyContained = clientBounds.Contains(clientBounds.X, item.Bounds.Top) && 
         clientBounds.Contains(clientBounds.X, item.Bounds.Bottom); 
if (!verticallyContained) { 
    allContained = false; 
} 

логика: «Если у нас есть контроль от основания, позволяет прокрутке». Однако для прокрутки нет дополнительного элемента управления.

Лучший ответ: «Не делайте этого».


EDIT: Во избежание сбоя создайте и добавьте второй инструмент ToolStripControlHost. Вы по-прежнему не сможете получить доступ к элементам нижней проверки, но, по крайней мере, приложение сохранится.

+0

Я нашел один обход, который, по крайней мере, предотвратит сбой: добавьте второй элемент dropDownButton. См. Код выше –

+0

Спасибо John. В конце концов я переработал логику, но ваше объяснение по-прежнему весьма полезно. –

Смежные вопросы