从数组中删除行

时间:2014-05-07 13:02:08

标签: arrays vb.net lines vb-power-pack

我有一系列线条,我想在某些时候删除它们中的一些。 以下是代码示例:

Dim canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
Dim lines(20) As PowerPacks.LineShape
Dim it As Integer = 0

Private Sub GoldenSpi_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    canvas.Parent = Me
    lines.Initialize()
    iter.Text = 0
End Sub
Private Sub iter_TextChanged(sender As Object, e As EventArgs) Handles iter.TextChanged
   If (it > iter.Text And iter.Text <> 0) Then
        ReDim Preserve lines(iter.Text - 1)
   End If
   If (it <> iter.Text) Then
        it = iter.Text
   End If

   For i As Integer = 1 To iter.Text
      lines(i - 1) = New PowerPacks.LineShape(canvas)
      lines(i - 1).StartPoint = pA(i)
      lines(i - 1).EndPoint = pB(i)
      lines(i - 1).BringToFront()
   Next
End Sub

执行程序后,会创建行。但是当我给我的文本框中的值小于变量'it'时,它只删除最后一行而不是其余行。我也在调试时看到了数组的大小减少了。这意味着超出尺寸的内容仍然保留?这是为什么?。任何帮助表示赞赏。感谢。

编辑:我试图像这样创建List:

Dim lines As New Generic.List(Of PowerPacks.LineShape)

Private Sub iter_ValueChanged(blabla) Handles iter.ValueChanged
    If (it > iter.Value And iter.Value <> 0) Then
        lines.RemoveRange(iter.Value - 1, lines.Count - iter.Value)
   End If

   For i As Integer = 1 To iter.Value
      InitPoints()

      If i - 1 = lines.Count Then
        Dim line As New PowerPacks.LineShape
        With line
            .StartPoint = pA(i)
            .EndPoint = pB(i)
            .BringToFront()
            .Parent = canvas
        End With
        lines.Add(line)
      End If
   Next

End Sub

但是线条在表格中仍然可见。我调试了它,发现列表大小减少了。当我有一个数组时同样的问题。怎么回事?...

2 个答案:

答案 0 :(得分:1)

我建议将iter.Text更改为cint(iter.Text),因为有可能将这两个值作为文本进行比较(比较不同)。

我还建议将Dim lines(20) As PowerPacks.LineShape更改为Dim lines As new generic.list(of PowerPacks.LineShape)

这样你就不必担心ReDim Preserve(当你在循环中这样做时可能会很慢),如果你想要,你可以轻松地将项目插入任何索引

答案 1 :(得分:0)

您应该在项目中使用Option Strict On,以避免类型之间的隐式转换,这会导致错误或更糟糕的意外行为。

另一方面,除非有需要,否则不应该有TextBox来存储号码。例如,使用NumericUpDown。看看MSDN Documentation

现在,对于数组,我建议使用List,它具有您需要处理元素的所有方法,并且具有.ToArray()方法,该方法将为您提供数组需要的。

尝试这样的事情:

Dim it As Integer = 0
Dim lines As New List(Of PowerPacks.LineShape)()

Sub iter_TextChanged(sender As Object, e As EventArgs) Handles iter.TextChanged
    Dim iTxt As Integer

    Try 
        iTxt = Integer.Parse(iter.Text)

        If it > iTxt AndAlso iTxt <> 0 Then

        End If

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub

我打算给你写一个例子,但我意识到我并不确切地知道你要做什么。你能解释一下吗?