2013-02-05 43 views
1

好的,我有一個表示數據集的綁定源。 該綁定源綁定到一個列表框。這完全按照預期工作,因爲它填充了指定列中的所有名稱。不是問題。DoDragDrop干擾綁定源

我有第二個列表框,綁定到一個不同的bindingsource1,它本身綁定到bindingsource1,但使用一個數據庫表示一個到數據集中不同表的關係。結果是當我點擊第一個列表中的一個項目時,第二個列表顯示所有相關的東西。

這裏沒有什麼新東西,或者確實很複雜,它是非常標準的東西,並且完全按照預期工作。

但是,我試圖在第一個列表框中實現拖放功能。我爲mousedown添加了一個事件處理程序。這裏面,我打電話

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

其中電流設置爲當前對象從bindingsource1.Current.Row["Name"]

現在,這是奇怪的地方。即使列表框本身已被正確更新(因爲新選擇的項目被突出顯示,索引和項目都按預期返回,新選擇的項目/索引)bindingsource1.Current尚未更新,實際上,第二個列表框仍然顯示與先前選擇的項目相關的數據。

使用箭頭鍵上下移動會導致列表框突出顯示按預期更改,並且還會按預期方式更新listbox2中的數據。

評論DoDragDrop行和一切似乎完全按預期工作。

從這我只能推斷DoDragDrop是以某種方式阻止某些事件發射,但我不知道爲什麼/如果這是所需的行爲/如何骯髒的工作圍繞它/如何正確工作它...

幫助我歐比旺·克諾比,你是我唯一的希望......

編輯:我創建了一個簡單的實現問題:dropbox.com/s/qxfsvr28ftojdax/BindingDragDrop.zip註釋掉在頂部的dodragdrop和標籤改變,將dodragdrop放入,甚至不會註冊... -

+0

Guesing無碼看:異常在d + d事件處理程序吞噬。 Debug + Exceptions,勾選Thrown複選框以查看CLR異常。 –

回答

1

repro代碼的榮譽。您可以通過爲標籤的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 ...

+0

我沒有在bindingsource上發現Position屬性 - 我試圖用數據源上的Current屬性做很多事情,直到我注意到當前是隻讀的。 乾杯!我開始知道綁定無疑是一把雙刃劍! –