Ошибка конструктора при попытке изменить высоту элемента управления

я создал класс, производный от CheckedListBox, поэтому я могу изменить высоту элемента следующим образом:

[ClassInterface(ClassInterfaceType.AutoDispatch)]    
[ComVisible(true)]
public class ExpandableChecked : CheckedListBox
{
    public ExpandableChecked()
        : base()
    {            
    }

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [Browsable(false)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public override int ItemHeight
    {
        get;
        set;
    }        
}
  • все в порядке кроме изменения высоты управления в дизайнере
  • когда я пытаюсь растянуть его ширину или перемещение, это здорово, но растягивание высоты дает это сообщение об ошибке:

Пытался делить на ноль

что с этим не так?

обновление: могу ли я также добавить свойство itemHeight в окно свойств ??


person Alaa Jabre    schedule 01.04.2012    source источник


Ответы (2)


Это происходит неправильно из-за свойства IntegralHeight, по умолчанию оно равно True. С этим набором элемент управления гарантирует, что высота всегда кратна высоте элемента, поэтому частичные элементы не видны. Это делается путем деления ClientSize.Height на ItemHeight.

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

Очень неясно, как вы собираетесь использовать это переопределенное свойство и почему вы вообще его переопределяете. Начните с установки для IntegralHeight значения False в конструкторе в качестве одного из обходных путей.

person Hans Passant    schedule 01.04.2012
comment
Большое спасибо, я только что изменил свойство IntegralHeight на false, как вы сказали. - person Alaa Jabre; 01.04.2012

Попробуйте указать базовые значения:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override int ItemHeight {
  get { return base.ItemHeight; }
  set { }
}

Дизайнер, очевидно, использует значение «получить», поэтому вы должны указать это значение.

Хотя особого смысла в этом нет. Базовый класс не позволит вам изменить высоту элемента. Для такой функциональности может быть лучше просто использовать ListBox с DrawMode=OwnerDrawFixed и самостоятельно обрабатывать флажок с помощью событий DrawItem, MouseDown и KeyPress.

person LarsTech    schedule 01.04.2012
comment
все работает отлично, но эта проблема в режиме разработки, когда я реализую функциональность базового класса, я не получаю то, что хочу - person Alaa Jabre; 01.04.2012