DoDragDrop干扰绑定源

时间:2013-02-05 21:22:21

标签: c# winforms

好的,我有一个代表数据集的bindingsource。 该绑定源绑定到列表框。这完全按预期工作,因为它填充了指定列中的所有名称。不是问题。

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

这里没什么新东西,或者确实很复杂,它是非常标准的东西,并且完全符合预期。

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

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

其中current被设置为bindingsource1.Current.Row["Name"]的当前对象。

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

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

注释掉DoDragDrop系列,所有内容似乎完全符合预期。

由此我只能推断出DoDragDrop会以某种方式阻止某些事件被触发,但我不知道为什么/如果这是期望的行为/如何对它进行肮脏的工作/如何正确地解决它... < / p>

帮助我Obi-Wan Kenobi,你是我唯一的希望......

编辑:我已经创建了一个简化的问题实现:dropbox.com/s/qxfsvr28ftojdax/BindingDragDrop.zip注释掉dodragdrop和顶部的标签更改,将dodragdrop放入其中甚至不注册...... -

1 个答案:

答案 0 :(得分:1)

赞成代码的荣誉。您可以通过为标签添加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中使用数据绑定的原因......