1

私は.NETプログラミングの初心者です。

実行時に複数のTextBoxを作成する必要があります。

私は次のVBNETコードを持っています:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   Dim textbox1 As New TextBox
   static Dim shiftDown As Integer
   static Dim counter As Integer

    counter += 1
    shiftDown = shiftDown + 30
    textbox1.Name = "Textbox" + counter.ToString()
    textbox1.Size = New Size(170, 10)
    textbox1.Location = New Point(10, 32 + shiftDown)
    textbox1.Visible = True
    GroupBox1.Controls.Add(textbox1)

End Sub

このコード例は、Button1をクリックした後、実行時にフォーム上に複数のテキストボックスを作成します。

ボタンがクリックされた後、作成されたテキストボックスがどこに保存されるかという私の質問はありますか?

4

3 に答える 3

2

@Darrenが書いたことは、理論的な問題として正しいです。それがあなたが探していたものかどうかはわかりませんが、ここにいくつかの詳細情報があります。

他のローカル変数と同様に、textbox1スコープはそれが定義されているメソッドに限定され、Subが戻ると「消えます」。それが参照するオブジェクト(以前はのインスタンスTextBoxとして知られていましたtextbox1)はまだそこにあり、現在はのControlsコレクションに格納されている参照を持っていますGroupBox1

明らかに、あなたはそれTextBoxを理由で作成しました、そしてそれをもう一度やりたいと思うでしょう-そしてあなたはそうすることができます。あなたがする必要があるのはGroupBox1.Controlsコレクションを見るだけです。TextBox開始時に空であると仮定すると、そこにあるすべての子オブジェクトが作成したコントロールであるという事実に依存できます。

これで、GroupBox1動的に作成されたコントロール以外のものが含まれている場合、動的テキストボックスのみを保存および取得するための他のオプションがあります。たとえば、クラスレベル(フォームなど)でコレクションを定義および作成し、各テキストボックスをそのコレクションに追加できButton1_Clickます。

さまざまなアプローチがありますが、うまくいけば、これで正しい方向に向けることができます。

于 2012-06-09T16:33:25.600 に答える
1

ATextBoxは単なる.NETクラスであり、textbox1オブジェクトはクラスの他のインスタンスと同様であり、共通言語ランタイム(CLR)によってメモリに保持されます。.NET Frameworkがこれを処理します(他のオブジェクトと同様)。電話をかけるとき:

GroupBox1.Controls.Add(textbox1)フレームワークはそのメモリ位置(テキストボックスオブジェクトを指している)を使用し、メモリアドレスの内容から新しいテキストボックスを作成します。

于 2012-06-09T15:24:37.503 に答える
1

それはひどく曖昧な質問です、少なくとも5つの正解があります。明白な答えから始めましょう:

  • TextBoxオブジェクトは、すべての.NET参照型オブジェクトが格納されている場所(ガベージコレクションされたヒープ)に格納されます。

混乱を最大化するように設計された、それほど明白ではないもの:

  • TextBoxクラスは、MarshalByRefObjectから派生するComponentから派生するControlから派生します。これにより、オブジェクトを別のAppDomainまたはプロセスに保存できます。このような場合、プログラムにはプロキシへの参照があります。これは珍しいことです。
  • プログラムは、TextBoxオブジェクトへの参照をGroupBox1.Controlsコレクションに格納するため、グループボックスがオブジェクトを「格納」していると考えることができます。Winformsはこの参照を使用して、フォームが閉じられたときにテキストボックスを自動的に破棄します
  • しかし、それは重要な参照ではありません。Controlsコレクションからテキストボックスを削除できますが、破棄されません。Winformsは、ウィンドウハンドルをコントロールオブジェクトにマップする内部テーブルを維持します。この参照は、たとえば、プログラムがメインフォームへの参照を保存していなくても、メインフォームを存続させるものです。また、Controls.RemoveまたはControls.Clearを使用してテキストボックスを削除すると、厄介なリークが発生します。コントロールは再ホストされ、「パーキングウィンドウ」という名前の非表示のウィンドウに「保存」されます。
  • TextBoxクラスは、実際にはEDITという名前のネイティブWindowsコントロールのマネージラッパーです。これは、すべてのWindowsコントロールの祖父であり、Windowsバージョン1から存在しています。これは氷山のようなもので、90%が水中にあり、見えません。Windowsは、同じデスクトップで実行されるすべてのプロセスによって共有されるヒープにウィンドウオブジェクトを格納します。Handleプロパティは、そのネイティブオブジェクトへの「参照」です。
于 2012-06-09T16:51:17.750 に答える