1

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

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

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

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

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

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

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

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

注释掉 DoDragDrop 行,一切似乎都按预期工作。

由此我只能推断 DoDragDrop 以某种方式阻止某些事件触发,但我不知道为什么/如果这是所需的行为/如何肮脏地解决它/如何正确地解决它......

帮帮我欧比旺克诺比,你是我唯一的希望……

编辑:我已经创建了问题的简化实现:dropbox.com/s/qxfsvr28ftojdax/BindingDragDrop.zip 注释掉顶部更改的dodragdrop和标签,放入dodragdrop,它甚至没有注册...... ——</p>

4

1 回答 1

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 中使用数据绑定的原因......

于 2013-02-06T21:14:10.657 回答