C# 指由变量定义的对象

C# 指由变量定义的对象,c#,C#,我有一个问题,最近解决不了。 我有这个密码 foreach (Hashtable i in (ArrayList)inv["database"]) { if (i != null) { if (i["type"].ToString() == "1") { if (i["dataValue"].ToString()

我有一个问题,最近解决不了。 我有这个密码

        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个控件(这是我项目中的一个类,所以不是“普通”控件),每个控件都是一个“picturebox”。我有505张图片,语法如下: 如果数据值为0,则为{typeID}.png;如果数据值大于0,则为{typeID}-{dataValue}.png

因此,例如,如果它是第一个循环,i[“type”].ToString()=1和i[“dataValue”].ToString()=3,inv0的映像将更改为Program.Proporties.Resources 当第二个循环出现时,inv1的图像会发生变化等。。。直到35年

这可能吗?我试过了

InterpolationBox x = Form1.FindControl("inv"+nn)
我似乎没有使用System.Web.UI的FindControl(框架4)

我试过了

InterpolationBox x = this.Controls.Find("inv" + nn, false);
我无法将“System.Windows.Forms.Control[]”类型的对象强制转换为“Program.InterpolatedBox”。不管怎样,如果我能消除这个错误,我能改变那个真实的图片盒,而不仅仅是复制的“x”一个吗

InterpolationBox x = this.Controls.Find("inv" + nn, false);
这就是你的问题所在

您得到的错误说明:

无法将“System.Windows.Forms.Control[]”类型的对象强制转换为 “Program.InterpolatedBox”

你可以看到它说它不能将
System.Windows.Forms.Control
数组强制转换为
程序。给定
InterpolationBox
是一个单独的控件,InterpolationBox
是合理的

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


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

NET中的对象是通过引用的,这意味着
x
不是
插值框
它是对内存中
插值框
的引用

你甚至可以:

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

c.DoSomething();
您针对
c
调用的代码将针对同一对象运行,它们都只是指向同一事物的引用

这就是你的问题所在

您得到的错误说明:

无法将“System.Windows.Forms.Control[]”类型的对象强制转换为 “Program.InterpolatedBox”

你可以看到它说它不能将
System.Windows.Forms.Control
数组强制转换为
程序。给定
InterpolationBox
是一个单独的控件,InterpolationBox
是合理的

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


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

NET中的对象是通过引用的,这意味着
x
不是
插值框
它是对内存中
插值框
的引用

你甚至可以:

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

c.DoSomething();

您针对
c
调用的代码将针对同一对象运行,它们都只是指向同一对象的引用。

谢谢您的回复,那么我如何从该数组中获取插值框呢?我可以对资源做类似的事情吗?插值框x=this.Controls.Find(“inv”+nn,false).FirstOrDefault();这将返回它找到的第一个控件,或者null,因此在使用它之前,您需要检查x是否为null,您可以根据自己的决定如何找到您要查找的控件,它是一个数组,因此您可以通过它查找并找到一个。至于资源,我不确定,我会看看MSDN上的资源文档。谢谢,工作得很好。我使用obj=RM.GetObject(I[“type”].ToString()+“-”+I[“dataValue”].ToString())解决了资源的问题;其中RM为:ResourceManager RM=newresourcemager(“MyProgram.Properties.Resources”,Assembly.Load(“MyProgram”);谢谢你的回复,那么我怎样才能从这个数组中得到插值框呢?我可以对资源做类似的事情吗?插值框x=this.Controls.Find(“inv”+nn,false).FirstOrDefault();这将返回它找到的第一个控件,或者null,因此在使用它之前,您需要检查x是否为null,您可以根据自己的决定如何找到您要查找的控件,它是一个数组,因此您可以通过它查找并找到一个。至于资源,我不确定,我会看看MSDN上的资源文档。谢谢,工作得很好。我使用obj=RM.GetObject(I[“type”].ToString()+“-”+I[“dataValue”].ToString())解决了资源的问题;其中RM为:ResourceManager RM=newresourcemager(“MyProgram.Properties.Resources”,Assembly.Load(“MyProgram”);