1

OK、データセットを表すバインディングソースがあります。そのbindingsourceはリストボックスにバインドされています。これは、指定された列のすべての名前が入力されるという点で、意図したとおりに機能します。問題ない。

別のbindingsource1にバインドされた2番目のリストボックスがあります。これ自体はbindingsource1にバインドされていますが、データセット内の別のテーブルへの関係の1つを表すデータメンバーを使用しています。その結果、最初のリストの項目をクリックすると、2番目のリストに関連するすべてのものが表示されます。

ここでは新しいものはなく、実際に複雑なものもありません。これはかなり標準的なものであり、意図したとおりに機能します。

ただし、最初のリストボックスにドラッグアンドドロップ機能を実装しようとしています。mousedownのイベントハンドラーを追加しました。この中で、私は呼んでいます

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

ここで、currentはからの現在のオブジェクトに設定されますbindingsource1.Current.Row["Name"]

さて、これはそれが奇妙になるところです。リストボックス自体が正しく更新されていても(新しく選択されたアイテムが強調表示され、インデックスとアイテムがすべて期待どおりに返され、新しく選択されたアイテム/インデックス)、bindingsource1.Currentは更新されていません。実際、2番目のリストボックスはまだ更新されていません。以前に選択したアイテムに関連するデータを表示します。

矢印キーを使用して上下に移動すると、リストボックスのハイライトが期待どおりに変更され、リストボックス2のデータも期待どおりに更新されます。

DoDragDrop行をコメントアウトすると、すべてが意図したとおりに機能するようです。

このことから、DoDragDropが特定のイベントの発生を何らかの形で妨げていると推測することしかできませんが、なぜ/これが望ましい動作であるか/それを汚す方法/適切に回避する方法がわかりません...

オビ=ワン・ケノービを助けてください、あなたは私の唯一の希望です...

編集:問題の簡略化された実装を作成しました:dropbox.com/s/qxfsvr28ftojdax/BindingDragDrop.zip dodragdropと上部のラベルをコメントアウトし、dodragdropを入れても、登録されません... – </ p>

4

1 に答える 1

1

再現コードの称賛。これを診断するには、ラベルの TextChanged イベントのイベント ハンドラーを追加し、DoDragDrop をコメント アウトしてブレークポイントを設定します。2 回目は、リストの選択を変更すると壊れます。コール スタックを見てください。バインディング リストを更新したのは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 に答える