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当第二个循环到来时,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转换为 aProgram.InterpolationBox是明智的,因为InterpolationBox它是单个控件。

Find方法返回一个控件数组,而不仅仅是一个,因此您需要在数组中查找并取出您想要的控件(即使它只是第一个)。


至于您关于更改是否x会更改您使用答案获得的控制权Controls.Find()的问题是肯定的。

.NET 中的对象是通过引用的,这意味着x它不是对内存中InterpolationBox的引用。InterpolationBox

你甚至可以这样做:

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

c.DoSomething();

您调用的代码c将针对同一个对象进行操作,它们都只是指向同一事物的引用。

于 2013-04-21T14:13:33.690 回答