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