C# RichTextBox阻止DragDrop事件

C# RichTextBox阻止DragDrop事件,c#,winforms,richtextbox,C#,Winforms,Richtextbox,我的SplitContainer.Panel上有DragDrop和DragEnter事件: splitContainer.Panel.DragDrop += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragDrop); splitContainer.Panel.DragEnter += new System.Windows.Forms.DragEventHandler(this.split

我的
SplitContainer.Panel上有
DragDrop
DragEnter
事件:

    splitContainer.Panel.DragDrop += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragDrop);
    splitContainer.Panel.DragEnter += new System.Windows.Forms.DragEventHandler(this.splitContainerPanelDragEnter);
它适用于SplitContainer.Panel中的每个控件,除了RichTextBox控件之外

MyRichTextBox.DragOver += MyRichTextBox_DragOver;


private void MyRichTextBox_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}
它看起来是什么样子:

因此,DragDrop/DragEnter在SplitContainer内的每个控件中都能完美工作,但标记为黄色的控件除外

我尝试的是:

1) 设置

所以我甚至连DragEnter都无法使用“action is not allowed”光标

2) 设置

在此之后,光标是正常的,但它不工作,因为它需要额外的
DragEventHandler
,在其他情况下它不工作

3) 设置

结果与变体相同

我不想在SplitContainer内部为每个
RichTextBox
设置
DragDrop
/
DragEnter
事件,因为在
FlowLayoutPanel
内部它们是动态创建的

问题是:有没有像C#中的
e.PreventDefault
analog这样的方法?或者,除了为每个
RichTextBox
设置事件,我还能做什么呢?

这对我来说很有效 我创建了2个自定义控件

自定义拆分控件

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);
        }
    }
}

请让我知道它是否有效

我看不出你如何能直接做到这一点。但是,既然您已经愿意在生成控件时添加几行代码,为什么不通过几行Lambda添加必要的事件呢:

假设您刚刚创建了一个
RichTextBox
,并准备将其添加到一些
控件中

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); };
前两个lambda将效果设置为复制而不进行任何检查;当然,您需要添加这些内容并选择适当的效果


第三个lambda在包含面板的
DragDrop
事件上传递
DragEventArgs
,因此现在RTB实际上是“D&D-through”…

只需创建一个自定义
RichTextBox
并覆盖它的
DragDrop
事件

public class CustomRichTextBox : RichTextBox
{
    #region Methods

    #region Overrides

    protected override void OnDragEnter(DragEventArgs e)
    {
        // base.OnDragEnter(e);
    }

    protected override void OnDragOver(DragEventArgs e)
    {
        // base.OnDragOver(e);
    }

    protected override void OnDragLeave(DragEventArgs e)
    {
        // base.OnDragLeave(e);
    }

    protected override void OnDrop(DragEventArgs e)
    {
        // base.OnDrop(e);
    }

    #endregion

    #endregion
}
出于某种原因,
richtextbox
似乎默认处理所有
DragDrop
事件。
WPF
中,事件将传播到期望这些事件的控件。不过,我不确定WinForms的情况。

这就是我解决这个问题的原因

我定义了这两个事件,这应该足够好了

MyRichTextBox.DragEnter += MyRichTextBox_DragEnter;
MyRichTextBox.DragDrop += MyRichTextBox_DragDrop;
我发现,当使用内嵌在中的RichTextBox时,显然也需要这个 某些控制

MyRichTextBox.DragOver += MyRichTextBox_DragOver;


private void MyRichTextBox_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}

您是否尝试过:
EnableAutoDragDrop=false;AllowDrop=true我不太明白你想要什么我想让DragDrop/DragEnter事件在SplitContaner.Panel内的每个控件上工作,但它在RichTextBox上不工作。对我来说,在RichTextBox中拖放工作正常。你能更好地描述什么不工作更新的帖子吗。如果我直接将DragDrop设置为RichTextBox,它就会工作。但我将其设置为splitContainer.Panel。RichTextBox位于其中,不允许在其上拖动文件。所以,如果我试着将药物植入PictureBox,例如dragDrop就可以完美地工作。如果我在RichTextBox上做同样的事情-它不起作用。因为它是假设一个固定的嵌套级别。它应该起作用,但我有问题。它捕获ForceDragDrop,但OnDragDrop不运行DragDrop事件。如果在RichTextBoxCustom构造函数中将parentSplitControl作为参数传递,则很容易避免固定级别的嵌套。经过一些更改后,它工作得很好,谢谢,这个想法很好。他不想为SplitContainer中的每个RichTextBox设置DragDrop/DragEnter事件。我想他的意思是,他不想为动态添加的控件向form类添加事件。他需要设置所有类型的属性,所以三行或四行应该不是问题。-我当然不想为这个小小的“功能”添加一个新类,即使它起作用了。@CodeJoy是对的,我不想为每个richTextBox实现事件。如果你有1-2个,那就好了。但我可以拥有数百个richtextbox,这将是一个问题。特别是其中一些是在运行时创建的,一些是在设计中创建的。你真的理解我的帖子了吗?设置这些lambda与设置它们的位置或名称没有什么不同。除了这三条线之外,没有什么可以实施的。没有任何事件!比使用drop目标提供新类实例要干净得多。。
MyRichTextBox.DragEnter += MyRichTextBox_DragEnter;
MyRichTextBox.DragDrop += MyRichTextBox_DragDrop;
MyRichTextBox.DragOver += MyRichTextBox_DragOver;


private void MyRichTextBox_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Copy;
}