RichTextBox阻止DragDrop事件

时间:2016-09-15 07:57:02

标签: c# winforms richtextbox

DragDrop上有DragEnterSplitContainer.Panel个事件:

    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)变体相同的结果。

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

问题是:在C#中是否存在类似e.PreventDefault模拟的方法?或者我可以做什么,除了为每个RichTextBox设置事件以使其有效?

4 个答案:

答案 0 :(得分:1)

这对我有用 我创建了2个自定义控件

自定义SplitControl

 CREATE TABLE TBLUSER_INFO
    (
    ID INT IDENTITY(1,1)not null PRIMARY KEY,
    LNAME VARCHAR(50)not null,
    FNAME VARCHAR(50)not null,
    MNAME VARCHAR (50)not null,
    ADDRESS VARCHAR(50)not null,
    AGE INT not null,
    GENDER VARCHAR(10)not null,
    CONTACTNO varchar(50) not null, 
    BIRTHDATE datetime
    );

    CREATE TABLE TBLUSER_ACCOUNT
    (
    ID INT IDENTITY(1,1) not null PRIMARY KEY,
    ID_TBLUSER_INFO INT,
    USERNAME VARCHAR(50)not null,
    USERPASS NVARCHAR(50)not null,
    SECURITYQUESTION VARCHAR(4000) not null,
    SECURITYANSWER VARCHAR(50)not null,
    FOREIGN KEY (ID_TBLUSER_INFO) REFERENCES TBLUSER_INFO(ID)
    );

自定义RichTextBox

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

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

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

如果有效,请告诉我

答案 1 :(得分: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); };

前两个lambdas将效果设置为不经任何检查复制;当然你会想要添加它们并选择合适的效果。

第三个lambda传递了包含面板的DragEventArgs事件的DragDrop,所以现在RTB实际上是'D& D-through'..

答案 2 :(得分:0)

只需创建自定义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
}

由于某些原因,RichTextBoxes似乎默认处理所有DragDrop事件。 在WPF中,事件将传播,直到到达期望这些事件的控件为止。我不确定WinForms

答案 3 :(得分:0)

这就是为我解决此问题的原因。

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

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