0

controls以下のように、実行時にいくつか作成しています。

pnl1.Controls.Add(New TextBox() With _
{
    .Name = "ItemName", _
    .Anchor = AnchorStyles.Left + AnchorStyles.Right _
}

そして、その修飾子を として設定しようとしましたPublic。残念ながら、私の試みはすべて失敗しました。
私の質問は: 動的に作成されたコントロールに修飾子を設定できますか?

そうでない場合、どうすればcontrols他のものにアクセスできますformsか? (例: の内部にあるcontrolをForm1動的に作成した場合)。ctrl1Form2MDI containerForm1

ctrl1からアクセスするにはどうすればよいForm2ですか? (public修飾子を設定ctrl1しないと、このようform1にアクセスできませんでした)Form2me.parentform.ctrl1

4

2 に答える 2

2

実行時ではなく、コンパイル時にフォームのクラスを記述するためにアクセス修飾子があることを見逃しています。アクセス修飾子はセキュリティ メカニズムではありません。

For example add 3 TextBoxes to a form. Give them the access modifier Private, now create an instance of your form and run the following code:

Dim form as Form1

For Each c As Control In form.Controls
    MessageBox.Show(c.Name)

アクセスMessageBox修飾TextBox子がPrivate. との違いPublicは、次のようなコードを記述できないことです。

MessageBox.Show(form.TextBox1.Name)

この方法では、クラスのプライベートメンバーにアクセスできません。ただし、メンバーはコンパイル時に使用できます。クラスと一緒に宣言します。この場合、それらは へのアクセスを簡素化しますControl

実行時にフォームにコントロールを追加しても、クラスに新しいメンバーは作成されません! クラスを変更、再コンパイル、再インスタンス化する必要があるため、できません。

結論

  1. メンバーを宣言してPrivateも、オブジェクトがカプセル化したコントロールにアクセスすることは妨げられません。
  2. 実行時にコントロールを作成しても、クラスには影響しません。
  3. おそらくMVCMVVMのようなデザイン パターンを探しているでしょう。
于 2013-04-03T07:37:22.840 に答える
1

動的でない場合、Visual Studio は既定でコントロールを として設定しFriend With Events、Vb.NET では、フォームに追加する前にそれらを宣言します。同じことを行い、Public を宣言しList(Of Control)(たとえば)、動的に作成するときにそこにコントロールを追加できます。

またはさらに良いDictionary(Of String, Control)のは、その名前でコントロールにアクセスすることです。

または、フォームから取得することもできます。を使用Form1.Controlsすると、フォーム内のすべてのコントロールにアクセスできます。コントロールが別のコントロール内にある場合、そのコントロール内のコントロールに到達する必要があります。次に例を示します。

Dim btn As Label = Ctype(Form1.Controls("GroupBox1").Controls("Label1"), Label)
于 2013-04-03T07:36:39.817 に答える