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”);