2014-02-20 90 views
0

我有一個datagrid,我編程地添加一定數量的用戶控制對象在行定義基於用戶的選擇。當用戶選擇一個新選項時,我試圖清除標題以外的每一行,但是我一直髮現最後一行定義由於某種原因在我的標題頂部以可視方式結束。這裏是我的代碼:DataGrid行刪除導致錯誤

此處,我添加一行,將用戶控制:

  For Each qTask As QTask In QBD.Tasks 
       Dim rowDef As New RowDefinition 
       rowDef.Height = New GridLength(0, GridUnitType.Auto) 
       grdQBD.RowDefinitions.Add(rowDef) 

       Dim newTask As New QBDControls 
       newTask.DataContext = qTask 

       ... 

       Grid.SetRow(newTask, grdQBD.RowDefinitions.Count - 1) 
       Grid.SetColumn(newTask, 0) 
       Grid.SetColumnSpan(newTask, 7) 
       grdQBD.Children.Add(newTask) 

此處,我刪除這些行(除第一次外,我的頭):

Dim rows As Integer = grdQBD.RowDefinitions.Count 
    If rows > 1 Then 
     For child As Integer = rows - 1 To 1 Step -1 
      grdQBD.RowDefinitions.RemoveAt(child) 
      'I'VE ALSO TRIED .REMOVERANGE 
     Next 
    End If 

Here's the before Here's the after

請注意,最後一行覆蓋標題。

+0

小心讓我們知道實際的錯誤是什麼?也許也讓我們知道你爲什麼試圖做這個可怕的事情...無論如何...在WPF中,我確信*有更多*更好的方式來實現你的*實際*目標。 – Sheridan

回答

1

那麼,你的問題是,你只是刪除RowDefinitions而不是實際的UserControls

由於左側只有一個RowDefinition,所有UserControls將在剩餘的一箇中,全部彼此重疊,最後一個添加爲最上面一個。

爲了得到你想要的行爲,我想你也必須刪除UserControls

您可以通過查看Grid的子項並刪除循環中當前行索引的子項來完成此操作。

Dim rows = g1.RowDefinitions.Count 

If rows > 1 Then 
    For i As Integer = rows - 1 To 1 Step -1 
     g1.RowDefinitions.RemoveAt(i) 

     ' Find the control in the row and remove it 
     Dim controlToRemove = g1.Children.Cast(Of UIElement)() 
      .Single(Function(c) Grid.GetRow(c) = i) 

     g1.Children.Remove(controlToRemove) 
    Next 
End If 
+0

謝謝彼得。您的解決方案奏效我錯誤地認爲控件是在行內設置的,刪除行也會刪除控件。 – user