none
請問MouseDown事件與DragDrop事件是否無執行先後關連? RRS feed

  • 問題

  • 我希望能做一個類似VS.NET這樣的使用者介面。

    左邊有些工具,可以藉由拖曳的方式,直接拖到右邊的一個panel上呈現。

    左邊的工具是以PictureBox來做呈現,而拖過去右邊的panel後,同樣也是以新的PictureBox加入右邊的panel來呈現。

    我測試時,拖曳的動作是,先在左邊第一個PictureBox上按住左鍵不放,然後移動滑鼠至右邊panel上,然後放開左鍵(完成一個新增PictureBox至右方panel動作)。之後把滑鼠移到第二個PictureBox上按住左鍵不放,移到右邊,放開左鍵。再把滑鼠移到第三個上,按住左鍵不放,移到右邊,放開左鍵。

     

    我的程式是這樣子:

     

    1.在左邊PictureBox的MouseDown(sender, e)事件中,以轉型過的參數(PictureBox)sender.Name來判斷的紀錄目前拖曳的PictureBox是哪一個(紀錄於selectNum變數中)。

    2.在panel的DragEnter(sender, e)與DragDrop(sender, e)中置入程式碼。

    主要是在於DragDrop()中,我去讀取selectNum變數,來判斷目前要加入panel的是哪一個PictureBox,然後利用Panel.Controls.Add(...)這樣的方式來加入。

     

    我的問題是:

     

    當我按照我的操作執行一遍,會發現加入的總是我上一次點選的。也就是我拖第一個,增加的會是預設的PictureBox。拖第二個,增加的會是剛剛的第一個。拖第三個,增加在panel上的是剛剛的第二個。

     

    但是如果我更改了我測試的使用方式,先在PictureBox上點左鍵一下,再進行拖曳動作,則就完全符合我的期望。

     

    所以,我在想,會不會是當我的拖曳事件已經開始執行時,最初的mouseDown事件尚未執行結束呢?

    不知道這樣的猜想是否合理。倘若合理,那麼我該如何避免呢?

    也就是要強迫保證mouseDown事件裡的程式碼都執行完了,才去執行DragDrop事件裡的程式碼。

     

    謝謝

     

     

     

    2007年6月17日 下午 05:52

所有回覆

  • HI,

     

    聽起來您並不是使用標準的拖放運作機制來製作拖放的功能, 標準的拖放做法是在MouseDown中呼叫DoDragDrop方法, 指定被拖放的東西, 另外在DragDrop事件中利用e參數的Value屬性取得被拖放的資料, 再行使用. 這樣做的做, 應該不會有您說的問題發生

     

    tihs

    2007年6月18日 下午 11:19
  • 我在想,你要不要在那兩個事件設個中斷點,那你會更清楚它們跑的順序.

    或許是你的程式順序有點問題,導致先顯示,再把值存入變數內,導致拖拉時,所顯示的是上一筆記錄.

     

    這是MSDN內的範例參考,或許對你有幫助.

    http://msdn2.microsoft.com/zh-tw/library/system.windows.forms.control.dragdrop(VS.80).aspx

    2007年6月19日 上午 08:59
  • 我似乎找到解法了,很笨的原因,目前還在測試是否這樣子就完美了。

     

    就是在MouseDown裡面,呼叫DoDragDrop的順序,我原本是放在函式一開始,就出現原文說的非預期現象。

    然後我把DoDragDrop放到最後面,很快的就正常了。

     

    耍笨了我~~

     

    謝謝前輩的提醒

    2007年6月21日 上午 06:34