DoDragDrop干扰绑定源

本文关键字:绑定 干扰 DoDragDrop | 更新日期: 2023-09-27 17:58:05

好的,我有一个表示数据集的绑定源。该绑定源绑定到一个列表框。这完全符合预期,因为它使用指定列中的所有名称填充。没问题。

我有第二个列表框,绑定到另一个bindingsource1,它本身绑定到bindingssource1,但使用的数据成员表示与数据集中另一个表的关系之一。这样做的结果是,当我点击第一个列表中的一个项目时,第二个列表会显示所有相关的内容。

这里没有什么新的东西,也没有什么复杂的东西,这是非常标准的东西,完全按照预期工作。

但是,我正在尝试在第一个列表框上实现拖放功能。我为mousedown添加了一个事件处理程序。在里面,我打电话给

DoDragDrop(current, DragDropEffects.Copy | DragDropEffects.Move);

其中current被设置为来自CCD_ 2的当前对象。

现在,这就是它变得奇怪的地方。即使列表框本身被正确更新(因为新选择的项目被突出显示,索引和项目都按预期返回,新选择的项/索引),bindingsource1.Current尚未更新,事实上,第二个列表框仍然显示与先前选择的项目相关的数据。

使用箭头键上下移动会导致列表框高亮显示按预期更改,并且列表框2中的数据也会按预期更新。

评论DoDragDrop行,一切似乎都完全按照预期进行。

由此,我只能推断DoDragDrop在某种程度上阻止了某些事件的发生,但我不知道为什么/如果这是所需的行为/如何绕过它/如何正确绕过它。。。

帮帮我欧比-万·克诺比,你是我唯一的希望。。。

edit:我已经创建了一个简化的问题实现:dropbox.com/s/qxfsvr28ftojdax/BindingDragDrop.zip注释掉dodragdrop和顶部的标签更改,放入dodragdoop,它甚至没有注册…-

DoDragDrop干扰绑定源

repo代码值得称赞。您可以通过为标签的TextChanged事件添加一个事件处理程序并在其上设置一个断点(DoDragDrop已注释掉)来诊断此问题。第二次,当您在调用堆栈中更改列表选择外观时,它会中断。您将看到更新绑定列表的是MouseUp事件

当您在MouseDown事件中调用DoDragDrop时,这是一个问题。ListBox的MouseUp事件将不再被触发,通知将被D+D逻辑吞噬并取消拖动。一个可能的解决方法是显式更新绑定,这样您就不必依赖它自动发生。这起到了作用:

private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
    bindingSource1.Position = listBox1.SelectedIndex;
    DoDragDrop(new object(), DragDropEffects.Move);
}

顺便说一句,像这样的问题就是为什么我从不在Winforms中使用数据绑定。。。