1

最近解決できなかった問題があります。私はこのコードを持っています

        foreach (Hashtable i in (ArrayList)inv["database"])
        {
            if (i != null)
            {
                if (i["type"].ToString() == "1")
                {
                    if (i["dataValue"].ToString() != "0")
                    {
                        inv{nn}.Image = Program.Properties.Resources._i["type"].ToString()+"-"+i["dataValue"].ToString();
                    }
                    else
                    {
                        inv{nn}.Image = Program.Properties.Resources._i["type"].ToString()
                    }
                }
            }
            nn++;
        }

私は36個のコントロールを持っています(これは私のプロジェクトにあるクラスなので、「バニラ」ではありません)、それぞれが単一の「ピクチャボックス」です。次の構文で 505 個の画像があります。データ値が 0 の場合は {typeID}.png、データ値が 0 より大きい場合は {typeID}-{dataValue}.png です。

たとえば、最初のループ、i["type"].ToString() = 1 および i["dataValue"].ToString() = 3 の場合、inv0 のイメージは Program.Proporties.Resources._1-3 に変更されます。 2番目のループが来るとinv1の画像が変化するなど... inv35まで

そのようなことは可能ですか?私は試した

InterpolationBox x = Form1.FindControl("inv"+nn)

System.Web.UIを使用したFindControl(FrameWork 4)などはないようです。

私は試した

InterpolationBox x = this.Controls.Find("inv" + nn, false);

そして、「System.Windows.Forms.Control[]」型のオブジェクトを「Program.InterpolatedBox」型にキャストできませんでした。とにかく、そのエラーを取り除くとしたら、コピーされた 'x' だけでなく、実際のピクチャボックスを変更できますか?

4

1 に答える 1

1
InterpolationBox x = this.Controls.Find("inv" + nn, false);

あなたの問題があるところです。

あなたが得たエラーは言っています:

タイプ 'System.Windows.Forms.Control[]' のオブジェクトをタイプ 'Program.InterpolatedBox' にキャストできません。

単一のコントロールが与えられSystem.Windows.Forms.Controlた場合、 の配列を適切な にキャストできないと言っていることがわかります。Program.InterpolationBoxInterpolationBox

このFindメソッドは、1 つだけではなく、コントロールの配列を返すため、配列を調べて、目的のコントロールを (最初のコントロールだけであっても) 取り出す必要があります。


x変更によって与えられたコントロールが変更されるかどうかについての質問についてControls.Find()は、答えは「はい」です。

.NET のオブジェクトは参照によるものです。つまり、メモリ内への参照でxはありません。InterpolationBoxInterpolationBox

あなたもできる:

var a = x;
var b = a;
var c = b;

c.DoSomething();

呼び出すコードcは同じオブジェクトに対して動作します。それらはすべて同じものを指す参照にすぎません。

于 2013-04-21T14:13:33.690 に答える