5

編集:これが起こっている中途半端な理由のために下部を見てください

私は非常に奇妙なIndexOutOfRangeExceptionを持っています(タイトルで述べたように)。これは、foreachを使用してコントロールのコントロールを反復処理するときに発生します(再帰的なFindControl)。

奇妙なエラー1

次に、確認するチェックを追加することを考えましたroot.Controls.Count > 0。ただし、デバッガーが明確に言っている間、私は例外を受け取り続けますCount == 0

奇妙なエラー2

問題のルートはFormViewです。単純なプロパティチェックでIndexOutOfRangeExceptionがスローされる理由を誰かが知っている場合は、私に教えてください。

例外stackTrace(はい、完了しています):

   at System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)

コード:

public static Control FindControlRecursive(this Control root, string id)
{
    if (root.ID == id)
    {
        return root;
    }

    if (root.Controls.Count > 0)
    {
        foreach (Control c in root.Controls)
        {
            Control t = c.FindControlRecursive(id);
            if (t != null)
            {
                return t;
            }
        }
    }

    return null;
}

編集:

ネイティブ関数を使用しようとしましたがFindControl、これは同じエラーをスローします。


具体的な質問:

foreachがネイティブコレクションにIndexOutOfRangeExceptionをスローするにはどうすればよいですか。


EDIT2:

どういうわけか、これはObjectDataSourceの使用に関連しているようです。入力パラメーターを正しく入力していませんでしたが、エラーは発生しませんでした。おそらく、これにより、(そのデータソースを使用していた)FormViewが何らかの形で破損しました。チャイルドコントロールにアクセスする前にエラーがスローされることなく、これがどのように発生するかを知りたいと思っています。

4

2 に答える 2

3

Controls.Countではなく、Control.HasControls()を使用してみてください。問題を回避できる可能性があります。

于 2013-01-18T10:53:25.603 に答える
0

特定の質問:foreachがネイティブコレクションにIndexOutOfRangeExceptionをスローする方法

foreachとは関係ありません。例外は、コントロールのControlsプロパティにアクセスしているときに発生します。これが、root.Controls.Countを取得しようとしたときにも発生する理由です。これは、CountがControlsコレクションのプロパティであり、Countを要求する前に、最初にコレクションにアクセスしようとしているためです。

この関数を呼び出しているコントロールとその時点を確認する必要があります。コントロールが破損したリソースからロードされているか、適切にロードされる前にコントロールコレクションにアクセスしようとしている可能性があります。あなたのコードをもっと見ずに言うのは難しい。

この関数をプレーンなバニラフォームで使用してみてください。正しく読み込まれた後で呼び出して、機能するかどうかを確認してください。

于 2013-01-18T12:13:22.503 に答える