数组中的c#用户界面元素
我对C#很陌生,有一个小项目要扩展。代码乱七八糟,我试图以某种方式加以改进,但似乎达到了语言的某些极限 基本上,我从最多四个传感器中读取传感器值,并在标签中显示其中的一些。因为循环总是相同的,所以我想迭代,而不是用不同的GUI元素将相同的代码重写四次,以存储值。我的研究表明,我可以手动将标签放入数组中,但每当我更改GUI中的任何内容时,VisualStudio编辑器都会覆盖此内容。所以我的方法是创建一个对元素的引用数组,比如数组中的c#用户界面元素,c#,arrays,user-interface,reference,C#,Arrays,User Interface,Reference,我对C#很陌生,有一个小项目要扩展。代码乱七八糟,我试图以某种方式加以改进,但似乎达到了语言的某些极限 基本上,我从最多四个传感器中读取传感器值,并在标签中显示其中的一些。因为循环总是相同的,所以我想迭代,而不是用不同的GUI元素将相同的代码重写四次,以存储值。我的研究表明,我可以手动将标签放入数组中,但每当我更改GUI中的任何内容时,VisualStudio编辑器都会覆盖此内容。所以我的方法是创建一个对元素的引用数组,比如 ref GroupBox[] gbChannel; ref Gro
ref GroupBox[] gbChannel;
ref GroupBox[] gbChannel;
但这在C#中是不可能的。如果我尝试直接分配它
gbChannel[0] = gbChannel0;
C#通知我在执行此操作之前必须检查对象是否为null。不管怎样
if(gbChannel1!=null) gbChannel[0] = gbChannel0;
结果也是一样的
有什么方便的方法可以实现我想要做的吗?我想你必须初始化你的数组
GroupBox[] gbChannel = new GroupBox[x];
如果您不确定大小,您可以有一个通用列表,如:
List<Groupbox> gbChannels = new List<Groupbox>();
List gbChannels=new List();
然后只需使用gbGhannels添加每个元素。为您迭代的每个标签添加,我很想看到更多的实现代码。看起来您没有正确初始化阵列。。。有几种方法可以做到这一点。如果您知道阵列的大小,Galma88已经提到了一个
GroupBox[] gbChannel = new GroupBox[x];
另一种方式是:
GroupBox[] gbChannel = {gbChannel0, gbChannel1, gbChannel2, gbChannel3};
这大部分取决于所涉及变量的范围。ozidom的帖子也是一个好主意,因为泛型也可以非常灵活
所以我的方法是创建一个对元素的引用数组,比如
ref GroupBox[] gbChannel;
ref GroupBox[] gbChannel;
GroupBox
是一个,您已经有了一个引用数组。只允许指示应通过引用传递方法的参数。很少需要它,因为大多数函数都应该设计为输出值,而不是改变输入
如果我尝试直接分配它
gbChannel[0] = gbChannel0;
C#通知我必须检查
执行此操作之前,对象为null
这是因为你还没有一个数组-你只有一个可以保存数组的变量。您必须使用new
创建数组:
gbChannel = new GroupBox[4];
也可以使用数组初始值设定项:
gbChannel = new [] {gbChannel0, gbChannel1, gbChannel2, gbChannel3};
每当我在列表中更改任何内容时,VisualStudio编辑器都将覆盖此内容
那你就找错地方了。您可能正在将代码添加到
InitializeComponent
,这是为设计者保留的,用于放入与放置在其中的UI元素相关的代码。如果(gbChannel1!=null)gbChannel[0]=gbChannel0,则将代码添加到事件处理程序中,如设计器不会接触的Form\u Load
代码>-gbChannel1只是一个打字错误,还是你的实际代码看起来一样?无意冒犯,但我认为你已经达到了你的C#知识的极限,而不是语言的极限。如果您发布更多的代码,并详细说明您遇到的问题,我相信我们会有所帮助。我猜您正在使用WinForms并将代码放入设计器生成的InitializeComponent
方法中。其中一个注释是“不要使用代码编辑器修改此方法的内容”。另外,使用列表,而不是数组。我认为这是OP的最小问题。而且一个列表
无论如何都会比一个数组好得多。当然,一个列表会比一个数组好!