VB6 コントロール配列に相当する最も単純な .NET は何ですか?
-
09-06-2019 - |
質問
おそらく私が .NET をまだ十分に理解していないだけかもしれませんが、この単純な VB6 コードを .NET で簡単に実装する満足のいく方法がまだ見つかりません (このコードが配列 Command1() と N 個のコマンド ボタンを持つフォーム上にあると仮定します)配列 Text1()) 内の TextBox:
Private Sub Command1_Click(Index As Integer)
Text1(Index).Text = Timer
End Sub
あまり有用なコードではないことは承知していますが、VB6 でコントロール配列を簡単に使用できることを示しています。C# または VB.NET で最も単純に相当するものは何ですか?
解決
テキストボックスの一般的なリストを作成します。
var textBoxes = new List<TextBox>();
// Create 10 textboxes in the collection
for (int i = 0; i < 10; i++)
{
var textBox = new TextBox();
textBox.Text = "Textbox " + i;
textBoxes.Add(textBox);
}
// Loop through and set new values on textboxes in collection
for (int i = 0; i < textBoxes.Count; i++)
{
textBoxes[i].Text = "New value " + i;
// or like this
var textBox = textBoxes[i];
textBox.Text = "New val " + i;
}
他のヒント
VB .NET のもう 1 つの優れた点は、複数のコントロールを処理する単一のイベント ハンドラーがあることです。
Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles TextBox1.TextChanged, _
TextBox2.TextChanged, _
TextBox3.TextChanged
End Sub
ありません 本物 .Net での 1 対 1 アナログ。確かに、特定のタイプのコントロールの配列やリストを作成することはできますが、それを自動的に行ってくれる機能はありません。
ただし、.Net で何かにリファクタリングできないコントロール配列を見たことがありません。 より良い. 。その好例があなたの例です。投稿したシナリオでは、コントロール配列を使用してボタンとテキストボックスを組み合わせています。.Net では、おそらくカスタム コントロールを使用してこれを行うでしょう。カスタム コントロールは、ボタン、テキスト ボックス、および場合によっては共有/静的タイマーで構成されます。フォームは、このカスタム コントロールのいくつかのインスタンスを使用します。コントロールに必要なロジックを一度実装すると、そのロジックは独自のソース ファイルに分離され、より大きなフォーム クラスとのマージを必要とせずにソース管理内で追跡および編集したり、複数のフォームや複数のプロジェクトで簡単に再利用したりできます。 。また、コマンド ボタンのインデックスがテキスト ボックスのインデックスと一致するかどうかを心配する必要もありません。
コントロール配列の代わりにカスタム コントロールを使用することは、インデックスの代わりに名前を取得するという点で、配列の代わりにクラスを使用してデータをグループ化することにほぼ似ています。
2つの側面があります。
.NET はコントロールの配列をすぐにサポートしますが、VB6 は回避策を使用する必要がありました。そうしないとイベントを接続するのが非常に困難だからです。.NET では、イベントを動的に接続するのは簡単です。
ただし、.NET フォーム デザイナは、次のような単純な理由でコントロール配列をサポートしていません。コントロールの配列は実行時に作成/拡張されます。コンパイル時に必要なコントロールの数がわかっている場合は (当然のことですが)、それらに別の名前を付け、配列には入れません。
あまり有用なコードではないことは承知しています
まさにそれがポイントです。役に立たない機能があるのはなぜでしょうか?
必要に応じて、名前でコントロールにアクセスすることもでき、次のようになります。
Private Sub Command_Click(sender As Object, e As EventArgs) Handles Command1.Click, Command2.Click …
Dim name As String = DirectCast(sender, Control).Name
Dim index As Integer = Integer.Parse(name.Substring("Command".Length))
Controls(String.Format("Text {0}", index)).Text = Timer.Value.ToString()
End Sub
VisualBasic .NET の互換性ライブラリには、強力な型指定されたコントロール配列が含まれています。これは、アップグレード ウィザードが現在の VB6 コントロール アレイを置き換えるために使用するものです。
ただし、VB6 のコントロール配列は、VB6 が表面上でいくつかの構文魔法を実行する単なるオブジェクトのコレクションです。.NET の世界では、これを削除することで、より良い実践方法を強制することになります。
最後に、ジェネリック医薬品の出現により、使用を妨げるものは何もありません。
List<YourControl> MyControlArray.
コントロールの配列を作成します。
TextBox[] textboxes = new TextBox[] {
textBox1,
textBox2,
textBox3
};
同じクリック イベントで、.Net の複数のボタンからのボタン押下を処理できます。次に、Tag プロパティで検索するテキスト ボックスを追加できますか?
Private Sub AllButton_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
Dim c As Control = CType(sender, Control)
Dim t As TextBox = FindControl(CType(c.Tag, String))
If t Is Not Nothing Then
t.Text = "Clicked"
End If
End Sub
VB6 のコントロール配列の主な利点は次の 2 つです。(1)彼らはあなたがコントロールのコレクションを繰り返す方法を提供しました(2)彼らはあなたがコントロール間でイベントを共有することを許可しました
(1)一連のコントロールを使用して.NETで達成できます(2)は、1つのイベントをハンドルして複数のコントロールを処理することで実現できます(構文は少し異なります。 sender
の代わりに引数 myArray(index)
).
.Net の優れた点の 1 つは、これらの機能が分離されていることです。したがって、たとえば、配列の一部ではなく、名前やタイプが異なる場合でも、イベントを共有するコントロールを作成できます。また、コントロールのコレクションにまったく異なるイベントがある場合でも、コントロールのコレクションを反復処理できます。