2

パネルに約 6 つのコントロールがあるパネルがあります。パネルからコントロールを削除したかったのですが、最終的には MyPanel.Clear() で削除しました。しかし、その前に、ボタンのクリックから実行される次のコードを試しました。

    For Each b As Control In MyItem.MyPanel.Controls

        MyItem.MyPanel.Controls.Remove(b)

    Next

ボタンをクリックして、デバッグで MyItem.MyPanel.Controls.Count と同様に監視します。処理が進むにつれて、カウントは減少し、5 から 4 から 3 に減少し、終了します。ボタンをもう一度クリックすると、さらに2つが削除され、3回目のクリックで最後の1つが削除されるため、それらはすべて法案に適合し、何も変更せずにすべて削除されました. なぜ 3 回のクリックが必要なのですか? ここでは明らかに単純なものが欠けていると思いますが、それが何であるかはわかりません。本当に理解したいと思います。特定のコントロールを削除する必要があった場合、問題が発生したようです。

4

3 に答える 3

2

奇妙なことに、VB.NET でこれを行うこともできますが、本質的には、反復処理中のコレクションを編集することです。理解を深めるために、1 から 6 までの通常の for ループを使用しているふりをして、最初の繰り返しでオブジェクト 1 を削除し、5 つのオブジェクトを残して、古い番号 2 のオブジェクトを最初にします。次の反復では、以前は 3 番目だった 2 番目のものを削除します。ほとんどの言語では、これは実行時エラーです。

于 2013-08-30T18:26:37.867 に答える
0

何が起こっているかというと、最初の位置から最後に移動するコントロールを削除しているということです。リストに6つのレコードがあり、あなたがそうであるようにそれらを削除し始めると、プログラム的に次のように言っています:

remove(0)
remove(1)
...
remove(5)

あなたがそれをしている間、リストは小さくなっています。最初の項目を削除すると、6 位から 5 位、次に 4 位、3 位、というように下がります。したがって、コードの途中で、位置 3 (4 番目の項目) の項目を削除しようとしますが、既に 3 項目を削除しているため、リストのsize にはアイテムが 3 つしか含まれておらず、その位置は存在しません。

それらをすべて適切に削除するには、リストの後ろから始めて前に移動する必要があります。

おそらく次のようなものです:

For i As Integer = (MyItem.MyPanel.Controls.Count- 1) To 0 Step -1
    MyItem.mypanel.Controls(i).Dispose()
Next
于 2013-08-30T18:33:00.393 に答える