2016-09-15 9 views
1

У меня есть DragDrop и DragEnter события на моем SplitContainer.Panel:RichTextBox блоки DragDrop событий

splitContainer.Panel.DragDrop += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragDrop); 
    splitContainer.Panel.DragEnter += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragEnter); 

Он отлично работает с каждым контролем внутри SplitContainer.Panel кроме RichTextBox управления.

Как это выглядит: enter image description here

Так DragDrop/DragEnter прекрасно работает каждый элемент управления внутри SplitContainer, за исключением контроля, который отмечен желтым цветом.

Что я пробовал:

1) Установить

RichTextBox.AllowDrop = false; 

Так что я даже DragEnter недоступен с "действие не разрешено" курсора.

2) Установить

RichTextBox.AllowDrop = true; 

После этого курсор в порядке, но он не работает, потому что ожидает дополнительный DragEventHandler в другом случае он не работает.

3) Установить

RichTextBox.EnableAutoDragDrop=false; 
RichTextBox.AllowDrop=true; 

тот же результат, как 2) варианта.

Я не хочу, чтобы установить DragDrop/DragEnter событие для каждыйRichTextBox внутри SplitContainer, потому что внутри FlowLayoutPanel они создаются динамически.

Вопрос в следующем: есть ли какой-либо метод, как e.PreventDefault аналог в C#? Или что я могу сделать, кроме настройки событий для каждого RichTextBox, чтобы заставить его работать?

+0

Вы пробовали [это] (HTTP: // StackOverflow .com/questions/1465988/capture-dragdrop-event-of-richtextbox-c-sharp? rq = 1): 'EnableAutoDragDrop = false; AllowDrop = true; ' – TaW

+0

Я не совсем понимаю, что вы хотите –

+0

Я хочу, чтобы события DragDrop/DragEnter работали над КАЖДОМ контролем внутри SplitContaner.Panel, но он не работает с RichTextBox. – DEADMC

ответ

1

Это работало для меня я создал 2 пользовательских элементов управления

Выборочная SplitControl

public partial class SplitControlCustom : SplitContainer 
    { 
     public SplitControlCustom() 
     { 
      InitializeComponent(); 
     } 

     public void ForceDrageDrop(DragEventArgs eventArgs) 
     { 
      OnDragDrop(eventArgs); 
     } 

     public void ForceDragEnter(DragEventArgs eventArgs) 
     { 
      OnDragEnter(eventArgs); 
     } 
    } 

Выборочная RichTextBox

public partial class RichTextBoxCustom : RichTextBox 
{ 
    public RichTextBoxCustom() 
    { 
     InitializeComponent(); 
     this.AllowDrop = true; 
    } 

    protected override void OnDragEnter(DragEventArgs drgevent) 
    { 
     SplitControlCustom parentSplitControl = Parent.Parent as SplitControlCustom; 
     if (parentSplitControl != null) 
     { 
      parentSplitControl.ForceDragEnter(drgevent); 
     } 
    } 

    protected override void OnDragDrop(DragEventArgs drgevent) 
    { 

     SplitControlCustom parentSplitControl = Parent.Parent as SplitControlCustom; 
     if (parentSplitControl != null) 
     { 
      parentSplitControl.ForceDrageDrop(drgevent); 
     } 
    } 
} 

Пожалуйста, дайте мне знать, если он работал

+0

Я попробую, спасибо. – DEADMC

+0

Так как это предполагает фиксированный уровень гнездования. – TaW

+0

Ну, он должен работать, но у меня проблемы с ним. Он ловит ForceDragDrop, но OnDragDrop не запускает событие DragDrop – DEADMC

0

Я не» Посмотрите, как вы можете сделать эту работу напрямую. Но, так как вы уже готовы добавить несколько строк кода при создании элементов управления, то почему бы не добавить необходимые события через несколько строк Lambda ..:

Давайте предположим, что вы только что создали RichTextBox и готовы добавить его в какой-то Controls коллекции ..:

RichTextBox richTextBox = new RichTextBox(); 
... 
richTextBox.AllowDrop = true; 

richTextBox.DragEnter += (ss, ee) => { ee.Effect = DragDropEffects.Copy; }; 
richTextBox.DragOver += (ss, ee) => { ee.Effect = DragDropEffects.Copy; }; 
richTextBox.DragDrop += (ss, ee) 
         => { splitContainer.Panel_DragDrop(splitContainer.Panel, ee); }; 

первые две лямбды установить эффект для копирования без каких-либо проверок; конечно, вы захотите добавить их и выбрать подходящий эффект.

Третья лямбда передает DragEventArgs на DragDrop в случае вмещающей панели, так что теперь RTB на самом деле «D & D-через» ..

+0

он не хочет устанавливать событие DragDrop/DragEnter для каждого RichTextBox внутри SplitContainer. –

+0

Я предполагаю, что он имел в виду, что он не хочет добавлять события в класс формы для динамически добавленные элементы управления. Ему все равно нужно устанавливать всевозможные свойства, поэтому три или четыре строки не должны быть проблемой. - Конечно, я бы не захотел добавить новый класс для этой крошечной «функциональности», даже если бы это сработало. – TaW

+0

Ну @CodeJoy прав, я не хочу реализовывать события для каждого richTextBox. Это хорошо, когда у вас 1-2 из них. Но я могу иметь сотни richtextbox, и это будет проблемой. Особенно, когда некоторые из них создаются во время выполнения, некоторые из них выходят из строя. – DEADMC