我有一个数据网格,我根据用户的选择以编程方式在行定义中添加一定数量的用户控件对象。当用户选择一个新选项时,我试图清除除标题之外的每一行,但我仍然发现最后一行定义由于某种原因在我的标题顶部以可视方式结束。这是我的代码:
这是我在其中添加带有用户控件的行:
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
请注意,最后一行包含标题。
答案 0 :(得分:1)
好吧,您的问题是,您只是删除了RowDefinitions
而不是实际的UserControls
。
由于只剩下一个RowDefinition
,所有UserControls
将在剩下的一个中,全部在彼此之上,最后一个添加为最顶层的。{/ p>
为了获得您想要的行为,我猜您也必须删除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