2015-09-08 45 views
1

我跟着this tutorial來實現Drag & Drop在我的數據網格上。我根據this link更改了它,以便能夠在組之間移動元素。MouseMove事件可以防止ComboBox被「打開」

我的datagrid包含一個按鈕的列,所以我跟着this answer使按鈕再次可用。我也有3列與組合框,他們不能使用(你可以點擊它們,然後他們看起來像組合框,但第二次點擊不會擴大它)。

其中兩個定義爲DataGridComboBoxColumn,一個定義爲DataGridTemplateColumnComboBox在標籤DataGridTemplateColumn.CellEditingTemplate中。

前兩個是這樣的:

<DataGridComboBoxColumn Header="Entity" 
    ItemsSource="{StaticResource tl}" 
    DisplayMemberPath="Name" 
    SelectedValuePath="Name" 
    SelectedValueBinding="{Binding Entity}" 
    x:Name="cmbEntity"></DataGridComboBoxColumn> 

數據網格的定義是這樣的:

<DataGrid Grid.Row="1" Name="myGrid" IsManipulationEnabled="True" ItemsSource="{Binding Source={StaticResource cvs}}" AutoGenerateColumns="False" 
RowEditEnding="myGrid_RowEditEnding" PreviewKeyDown="myGrid_PreviewKeyDown" SelectedCellsChanged="myGrid_SelectedCellsChanged" 
AllowDrop="True" MouseMove="DataGrid_MouseMove" PreviewMouseLeftButtonDown="DataGrid_PreviewMouseLeftButtonDown" Drop="DataGridView_Drop"> 

並且如上所述,該方法根據教程實現。我已經嘗試在事件處理程序中使用e.Handled=false,但它沒有幫助(並且它可能無用,因爲打開組合框不是事件?)

通過一次刪除一個事件處理程序,我發現MouseMove事件的問題,代碼如下:

void DataGrid_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) { 

      Console.Out.WriteLine("MouseButtonState.Pressed"); 

      DataGrid dataGrid = sender as DataGrid; 
      prevRowIndex = GetDataGridItemCurrentRowIndex(dataGrid, e.GetPosition); 

      if (prevRowIndex < 0) { return;} 

      dataGrid.SelectedIndex = prevRowIndex; 
      DefaultValue selectedDV = dataGrid.Items[prevRowIndex] as DefaultValue; 

      if (selectedDV == null) { return; } 

      DragDropEffects dragDropEffects = DragDropEffects.Move; 
      if (DragDrop.DoDragDrop(dataGrid, selectedDV, dragDropEffects) != DragDropEffects.None) 
      { 
       dataGrid.SelectedItem = selectedDV; 
      }  
     } 
    } 

我不完全理解爲什麼發生這種情況,因爲我真的不移動鼠標,我只要按一下含有組合的細胞框。是否有可能同時擁有,拖動&拖放和ComboBoxes?

編輯:我修改從the tutorial我用於顯示我有問題的項目:Download from my dropbox 我改變了薪酬列是一個組合框(當然也添加了分組,因爲我認爲這可能是重要的)

+0

如果你可以發佈一個簡單的項目來顯示這個問題,那很好,否則你需要花費所有的教程來重現你的錯誤。 – netaholic

+0

好吧,我會這樣做,但這需要我一些時間(我無法上傳完整的項目,因爲它記錄了我自己的代碼)。 –

+0

那麼,它怎麼樣? – netaholic

回答

0

首先,問題是什麼。

即使沒有移動鼠標,鼠標移動事件也會被解僱。快速搜索表明,這是出於行爲。 然後datagrid會嘗試將單擊的單元格放入編輯模式,但是鼠標移動事件代碼會調用以防止出現組合框。

,我建議的解決辦法是做到以下幾點:

定義在主窗口:

 Point mousePositionOnButtonPress; 
     double deltaToStartDrag = 10; 

和修改您的MouseMove事件到以下幾點:

if (e.LeftButton == MouseButtonState.Pressed) 
      { 
       var position = e.GetPosition(this); 
       if (mousePositionOnButtonPress == new Point()) 
       { 
        mousePositionOnButtonPress = new Point(position.X, position.Y); 
       } 
       else 
        if (Math.Abs(mousePositionOnButtonPress.X - position.X) > deltaToStartDrag || Math.Abs(mousePositionOnButtonPress.Y - position.Y) > deltaToStartDrag) 
        { 
         Console.Out.WriteLine("MouseButtonState.Pressed"); 

         DataGrid dataGrid = sender as DataGrid; 
         prevRowIndex = GetDataGridItemCurrentRowIndex(dataGrid, e.GetPosition); 

         if (prevRowIndex < 0) { return; } 

         dataGrid.SelectedIndex = prevRowIndex; 
         Employee selectedDV = dataGrid.Items[prevRowIndex] as Employee; 

         if (selectedDV == null) { return; } 

         DragDropEffects dragDropEffects = DragDropEffects.Move; 
         if (DragDrop.DoDragDrop(dataGrid, selectedDV, dragDropEffects) != DragDropEffects.None) 
         { 
          dataGrid.SelectedItem = selectedDV; 
         } 
        } 
       // 
      } 

還訂閱DataGrid的MouseUp事件如下

private void dgEmployee_MouseUp(object sender, MouseButtonEventArgs e) 
     { 
      mousePositionOnButtonPress = new Point(); 
     } 

這將推遲拖放的開始,直到用戶將其鼠標按下至10個像素爲止。這是我不得不說的關於你的問題。 我也建議你看看這篇文章http://www.hardcodet.net/2009/03/moving-data-grid-rows-using-drag-and-drop 海事組織它有更多更乾淨的代碼,它看起來更好。 我相信,通過一些調整,你可以使它與羣組一起工作。

+0

真酷!我認爲它可能是這樣的(MouseMove被開除而沒有移動),但這對我來說沒有意義... –