AllowDrop属性不适用于ToolStripItems

时间:2011-11-15 22:11:19

标签: c# winforms drag-and-drop toolstrip

我已成功使用用户控件创建了DragDrop功能。现在我尝试在某些组件上允许DragDrop功能,例如ToolStripButton。

基类ToolStripItem支持AllowDrop和DragEnter / DragDrop事件......

ToolStripButton在设计器中隐藏了这些属性,但它们是公共可访问的。

最初我尝试为每个ToolStripButton执行以下操作:

button.AllowDrop = true;
button.DragEnter += new DragEventHandler(button_DragEnter);
button.DragDrop += new DragEventHandler(button_DragDrop);

然而,这些事件并没有被解雇。这些按钮包含在MenuStrip中,因此我将MenuStrip.AllowDrop更改为true。然后我开始获取DragEnter和DragDrop事件,但由于访问ToolStripItem的Tag属性时出现线程/调用问题,DragDrop事件将失败。

无法调用ToolStripItems。所以我尝试使用相同的函数调用它们的容器,MenuStrip。我仍然遇到一个线程/调用问题,一旦我尝试访问ToolStripItem,线程就会停止运行。

以下是我在调用后用于检索标记信息的代码:

void button_DragDrop(object sender, DragEventArgs e)
{
    menuStrip.Invoke(new DragEventHandler(MyDragFunction), new object[] { sender, e });
}

void MyDragFunction(object sender, DragEventArgs e)
{
    int id = (int)((ToolStripButton)sender).Tag;
    // Debugging never reaches this line
    int dragId = (int)e.Data.GetData(DataFormatName, false);

    MoveItem(id, dragId);
}

拖放到像ToolStripItem这样的组件根本不可能吗?或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

以下是我为我工作的代码。

我在表单构造函数中分配DragDrop属性,因为它们隐藏在设计器中。

foreach (object o in menuStrip.Items)
{
    if (o is ToolStripButton)
    {
        ToolStripItem item = (ToolStripItem)o;

        item.AllowDrop = true;
        item.DragEnter += new DragEventHandler(item_DragEnter);
        item.DragOver += new DragEventHandler(item_DragOver);
        item.DragDrop += new DragEventHandler(item_DragDrop);
    }
}

private void item_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormatName, false))
    {
        e.Effect = DragDropEffects.Move;
    }
}

private void item_DragOver(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormatName, false))
    {
        e.Effect = DragDropEffects.Move;
    }
}

private void item_DragDrop(object sender, DragEventArgs e)
{
    int id = (int)e.Data.GetData(DataFormatName, false);
    int category = Convert.ToInt32((sender as ToolStripButton).Tag);

    MyFunction(category, id);
}