10

.NETについてはまだ十分に理解していないかもしれませんが、この単純なVB6コードを.NETで簡単に実装するための十分な方法はまだわかりません(このコードが配列Command1()とNにN個のCommandButtonを持つフォーム上にあると仮定します配列Text1())のTextBoxes:

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

あまり有用なコードではないことは知っていますが、VB6で制御配列を簡単に使用できることを示しています。C#またはVB.NETで最も単純な同等物は何ですか?

4

9 に答える 9

5

テキストボックスの一般的なリストを作成します。

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;
}
于 2008-09-02T13:51:33.183 に答える
4

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
于 2008-09-02T13:49:00.710 に答える
3

.Netには実際の1対1のアナログはありません。もちろん、特定のタイプのコントロールの配列またはリストを作成することはできますが、それを自動的に行うものはありません。

ただし、.Netでより良いものにリファクタリングできないコントロール配列を見たことがありません。その好例があなたの例です。投稿したシナリオでは、コントロール配列を使用してボタンをテキストボックスとペアリングしています。.Netでは、おそらくカスタムコントロールを使用してこれを行います。カスタムコントロールは、ボタン、テキストボックス、および共有/静的タイマーで構成されます。フォームは、このカスタムコントロールのいくつかのインスタンスを使用します。コントロールに必要なロジックを一度実装すると、独自のソースファイルに分離され、より大きなフォームクラスとのマージを必要とせずにソース管理で追跡および編集したり、複数のフォームや複数のプロジェクトで簡単に再利用したりできます。 。また、コマンドボタンのインデックスがテキストボックスのインデックスと一致していることを確認する必要もありません。

コントロール配列の代わりにこのためのカスタムコントロールを使用することは、インデックスの代わりに名前を取得するという点で、配列の代わりにクラスを使用してデータをグループ化することに大まかに似ています。

于 2008-09-02T14:11:27.583 に答える
2

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
于 2008-09-02T13:50:54.917 に答える
1

VisualBasic .NETの互換性ライブラリには、強い型の制御配列が含まれています。これは、アップグレードウィザードが現在のVB6コントロールアレイを置き換えるために使用するものです。

ただし、VB6のコントロール配列は、VB6が表面上で構文の魔法を実行しているオブジェクトのコレクションにすぎません。.NETの世界では、これを削除することで、より良いプラクティスを強制しています。

最後に、ジェネリック医薬品の登場により、使用を妨げるものは何もありません。

List<YourControl> MyControlArray.
于 2008-09-02T13:50:48.490 に答える
0

VB6のコントロールアレイの2つの主な利点は、次のとおりです。(1)コントロールのコレクションを反復処理する方法を提供しました。(2)コントロール間でイベントを共有できました。

(1)コントロールの配列を使用して.Netで実行できます(2)1つのイベントで複数のコントロールを処理することで実行できます(sender代わりに引数を使用するため、構文は少し異なりますmyArray(index))。

.Netの良い点の1つは、これらの機能が分離されていることです。したがって、たとえば、配列の一部ではなく、名前やタイプが異なる場合でも、イベントを共有するコントロールを使用できます。また、まったく異なるイベントがある場合でも、コントロールのコレクションを反復処理できます。

于 2010-01-20T05:20:05.400 に答える
0

コントロールの配列を作成します。

TextBox[] textboxes = new TextBox[] {
    textBox1,
    textBox2,
    textBox3
};
于 2008-09-02T13:45:55.617 に答える
0

同じクリックイベントで、.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
于 2008-09-02T13:54:51.680 に答える