2015-08-07 2 views
2

Короткая версия:Можно ли расширить элемент управления DataGridView без подкласса?

Есть ли способ, я могу добавить свойства и переопределить OnMouseDown/OnMouseUp функции по контролю DataGridView, не создавая собственный элемент управления, который расширяет DataGridView?

Длинная версия (с пояснением):

Я реализую перетаскивание перемещения нескольких строк между сетками в существующем приложении. У меня есть расширенный элемент управления DataGridView с требуемой функциональностью, и он отлично перемещает строки между экземплярами этой сетки.

Это расширенная DGV коды класса:

public partial class DragDropGrid : DataGridView 
{ 
    /// <summary> 
    /// When set, the mouse down event and click events don't happen until the mouse button is released. 
    /// </summary> 
    public bool DelayMouseDown = false; 

    public int MouseDownRowIndex = -1; 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     if (DelayMouseDown) 
     { 
      return; 
     } 
     base.OnMouseDown(e); 
    } 

    protected override void OnMouseUp(MouseEventArgs e) 
    { 
     if (DelayMouseDown) 
     { 
      base.OnMouseDown(e); 
     } 
     base.OnMouseUp(e); 
    } 
} 

Однако, у меня есть другая сетка (пользовательские UserControl), который мне нужно, чтобы быть в состоянии справиться с таким же функциональностью перетаскивания. Эта сетка представляет собой составной пользовательский элемент управления из нашего набора базового класса и имеет DataGridView вместе с множеством других вещей, которые находятся на элементе управления.

Я попытался следующие реализовать такую ​​же функциональность как базовой DataGridView я продлен успешно, но не было удачи, получая его на работу:

  • Расширение моего базового класса сетки так же, как DataGridView , Этот не работает, поскольку переопределение методов MouseDown/MouseUp делает это на пользовательском UserControl , а не на DataGridView, который находится на элементе управления - поэтому нажатие на сетку не вызывает переопределенные методы.

  • Обновление решетки базового класса со свойствами/переопределенными методами. У этой проблемы, как указано выше; MouseDown/MouseUp - , переопределяя методы UserControl, поэтому нажатие DataGridView на
    элемент управления не попадает на переопределенные методы.

Я надеялся только добавить свойства и переопределить методы на весь класс DataGridView, так что DGV на пользовательских UserControl бы подобрать функциональность наряду с другими элементами управления DataGridView.

Помощь!

+0

Можете ли вы не добавлять обработчики непосредственно к операциям мыши? Если ваш DataGridView называется dgv, то dgv.OnCellMouseDown + = MyHandlerMethodName? – Alex

+1

Возможно, я не был достаточно ясен в вопросе, но я не хочу подписываться на события MouseDown/MouseUp, я хочу переопределить функции OnMouseDown/OnMouseUp для сетки. Я отредактирую код расширения на вопрос, чтобы вы могли видеть, что я имею в виду. –

+0

Извинения, я неправильно понял. С беглым взглядом, ответ Луаана выглядит как хороший подход. – Alex

ответ

2

Кажется, что ваш пользовательский контроль имеет DataGridView внутри.

Таким образом, вместо привязки существующих событий MouseDown/MouseUp и т. Д. (Которые действительно являются событиями пользовательского элемента управления, а не сетки), просто добавьте новые события в свой пользовательский элемент управления и позвольте им перейти к представлению сетки. Например:

public event MouseEventHandler GridMouseDown 
{ 
    add { dataGrid.MouseDown += value; } 
    remove { dataGrid.MouseDown -= value; } 
} 

EDIT:

Хорошо, так как вы спрашиваете конкретно о перекрывая OnMouseDown методов, ответ прост: создание производного типа является единственным способом.

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

+0

Я думаю, что вы, возможно, были введены в заблуждение моим низким выбором слов - извините! Я не хочу ничего делать с событиями (хотя я и сказал события - я отредактирую это, чтобы уточнить); Я должен был переопределить ** базовую функциональность **, которая обрабатывает мыши и события мыши. Идея состоит в том, что я могу установить для свойства «DelayMouseDown» значение true в событии mouse down в моем приложении, а затем при последующем щелчке мыши не происходит (поэтому выбор не изменяется) до тех пор, пока кнопка мыши выпущен. –

+0

@PauLF Хорошо, тогда это невозможно. Есть ли причина, почему вы не используете обычные API перетаскивания? – Luaan

+0

Существует недостаток в том, как DGV обрабатывает щелчки мыши при попытке использовать многоэкранный выбор наряду с перетаскиванием. Например: выберите несколько строк в сетке, затем попытайтесь запустить перетаскивание - левый клик, который начинает перетаскивание, также вызывает MouseDown и Click, запускает SelectionChanged и меняет выбранные строки только на одну строку, на которой произошла MouseDown. Перемещение MouseDown позволяет сохранить выбор строки при запуске перетаскивания. http://stackoverflow.com/questions/1942636/how-do-i-mimic-windows-explorer-multi-select-drag-n-drop-behavior-in-a-datagridv –

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