Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Доработка ComboBox


Автор: Chef 30.5.2008, 22:20
user posted image
user posted image

Доработка ComboBox


http://www.codeproject.com/KB/miscctrl/customcombos.aspx
Введение
В течение развития вашего приложения, сталкиваешься с тем что возможностей стандартных компонентов не хватает. 
Код
Весь combos унаследованы от базового класса CustomCombo, который осуществлен в UtilityLibrary\Combos\CustomComboBox.cs файле. Базовый класс абстрактен, и все наследники должны осуществить такие методы
Код

protected abstract void OnPrevScrollItems();
protected abstract void OnNextScrollItems();
protected abstract void OnDropDownControlBinding( EventArgsBindDropDownControl e );
protected abstract void OnValueChanged();

Описание:
OnPrevScrollItems – говорит контролу изменить значение  элемента  на предыдущее
OnNextScrollItems – говорит контролу изменить значение  элемента  на следующее
OnDropDownControlBinding - Специальный метод, используемый наследниками, чтобы прикрепить собственный всплывающий контрол на combo.
OnValueChanged () - метод проверяет правильность значение combo.
Также контроль имеет некоторые дополнительные методы, которые могут быть унаследованы наследниками: 
Код

protected virtual bool OnValueValidate( string value );
protected virtual void OnDropDownSizeChanged();
protected virtual void OnDropDownFormLocation();

Описание:
OnValueValidate - метод  проверяет корректность вводимых данных.
OnDropDownSizeChanged - метод вычисляет размер всплывающей формы.
OnDropDownFormLocation - метод вычисляет, где всплывающую форму нужно показать.

Также абстрактный класс имеет некоторые вспомогательный методы, которые могут использоваться пользователем, чтобы увеличить combo (Dock Fill)
 
Код

public void BeginUpdate();
public void EndUpdate();


Описание:
BeginUpdate –  котрол пропускает весь некорректный код в классе.
EndUpdate - control start to invalidate itself after changes

Первый шаг

ComboBox разработан с поддержкой двух режимов: только чтение (ReadOnly)  и редактирования(Editable). В режиме только для чтения котрол не отображает данные, в режиме редактирования все данные отображаются, работа происходит через внутренний контрол TextBox. Текущее состояние контрола можно контролировать в свойстве ReadOnly.

Следующий шаг

На втором шаге  выполнения необходимо выбрать какой контрол должен использоваться в качестве ниспадающего элемента. Для этой цели используем абстрактный метод  OnDropDownControlBinding
 
Код

 protected override void OnDropDownControlBinding( CustomCombo.EventArgsBindDropDownControl e )
  {
    e.BindedControl = m_tree; // m_tree - TreeView контрол
    m_tree.ImageList = m_imgList;
    RaiseFillTreeByData( e );
    
    //В случае если данные загружаються на сообщении прокрутки
    
    m_ctrlBinded = m_tree;
    m_bControlBinded = true;
  }


Третий шаг

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

protected virtual void OnItemSizeCalculate( object sender, CustomCombo.EventArgsEditCustomSize e )
  {
    if( m_imgList != null )
    {
      int iWidth = m_imgList.ImageSize.Width + 2;
      e.xPos  += iWidth;
      e.Width -= iWidth;
    }
  }

  protected override void OnPaintCustomData(System.Windows.Forms.PaintEventArgs pevent)
  {
    Graphics g = pevent.Graphics;
    Rectangle rc = pevent.ClipRectangle;

    if( m_tree.SelectedNode != null && m_imgList != null )
    {
      Rectangle rcOut = new Rectangle( rc.X + 2, rc.Y+2, m_imgList.ImageSize.Width, rc.Height - 4 );
      int index = m_tree.SelectedNode.ImageIndex;
      
      if( m_imgList.Images.Count > index && m_imgList.Images.Count > 0 )
      {
        if( index < 0 ) index = 0;
        Image img = m_imgList.Images[ index ];
        g.DrawImage( img, rcOut );
      }
    }
  }


Первый метод вычисляет область, в которой разработчик хочет рисовать.  Второй метод - метод рисования. CustomCombo дает возможность изменить и осуществить ваш метод отрисовки всех элементов контрола.  Метод отрисовки может быть логически разбит на подготовку фона и рисование элементов. В большинстве случаев обработка фона не нужна, но вы можете сделать это.

Работа с данными

Когда пользователь напечатает любой текст в combo, тогда мы сначала проверяем данные, старые они или новые, для проверки данных вызываем метод OnValueValidate, и если он возращает true тогда вызываем OnValueChanged метод.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)