3

asp.netでテキストボックスを動的に作成しました。今、次のコードを使用して値を抽出しています。

string[] sublist = new string[] { };
int[] maxmarkslist = new int[] { };
int i;
for (i = 0; i < Convert.ToInt32(Label15.Text); i++)
{
    string sub = "subject" + i;
    string marks = "maxmarks" + i;
    TextBox subject = (TextBox)PlaceHolder1.FindControl(sub);
    TextBox maxmarks = (TextBox)PlaceHolder1.FindControl(marks);
    sublist[i] = subject.Text;
    maxmarkslist[i] = Convert.ToInt32(maxmarks.Text);
}

しかし、次の2行で「インデックスが配列の境界外でした」というエラーが表示されます。

sublist[i] = subject.Text;
maxmarkslist[i] = Convert.ToInt32(maxmarks.Text);

私がデバッグしたとき、値は subject.Text と maxmarks.Text に入っていますが、配列には入っていません。

配列を間違った方法で定義しましたか?

4

2 に答える 2

2

両方の配列を空の配列として定義します。そのため、それらにインデックスを作成しようとすると、インデックスがバインドされていないエラーが発生します。

配列は動的に拡張されません。それが必要な場合は、コレクション型を使用し、後で配列に変換できます。

これを試して:

int length = Convert.ToInt32(Label15.Text);
string[] sublist = new string[length-1];
int[] maxmarkslist = new int[length-1];

for (int i = 0; i < length; i++)
{
    string sub = "subject" + i;
    string marks = "maxmarks" + i;
    TextBox subject = (TextBox)PlaceHolder1.FindControl(sub);
    TextBox maxmarks = (TextBox)PlaceHolder1.FindControl(marks);
    sublist[i] = subject.Text;
    maxmarkslist[i] = Convert.ToInt32(maxmarks.Text);
}

または、コレクション(リスト)タイプでこれを行う方法は次のとおりです。

        int length = Convert.ToInt32(Label15.Text);
        List<string> sublist1 = new List<string>();
        List<int> maxmarkslist1 = new List<int>();

        for (int i = 0; i < Convert.ToInt32(Label15.Text); i++)
        {
            string sub = "subject" + i;
            string marks = "maxmarks" + i;
            TextBox subject = (TextBox)PlaceHolder1.FindControl(sub);
            TextBox maxmarks = (TextBox)PlaceHolder1.FindControl(marks);
            sublist1.Add(subject.Text);
            maxmarkslist1.Add(Convert.ToInt32(maxmarks.Text));
        }

        string[] sublist = sublist1.ToArray();
        int[] maxmarkslist = maxmarkslist1.ToArray();

コレクションでは、事前にサイズを指定する必要がないことに注意してください。ただし、必要に応じて拡張できるため、アイテムを追加し続けてください。しかし、配列はこれを行うことができません。

Your string[] sublist = new string[] { };は、配列を作成して初期化するショートカット メソッドです。サイズを指定する必要はありませんが、コンパイラは {} 間の要素をカウントし、サイズを適切に設定します。あなたの場合、 {} 内に要素がないため、空の配列が作成されます。

于 2012-11-29T16:05:24.733 に答える
1
        string[] sublist = new string[100];
        int[] maxmarkslist = new int[100];

これを入れてください..100をループの最大値に置き換えてください...しかし、これは良い習慣ではありません...もっと良いものを見つけたら、このスレッドに戻ってきます...

于 2012-11-29T16:14:55.547 に答える