我对C#很陌生,有一个小项目要扩展。代码一团糟,我正在尝试以某种方式改进它,但似乎达到了语言的某些限制。
基本上,我从多达四个传感器读取传感器值,并在标签中显示其中一些。由于循环总是相同的,我想迭代而不是用不同的 GUI 元素来存储值来重写相同的代码四次。我的研究表明,我可以手动将标签放在数组中,但每次我在 GUI 中更改任何内容时,Visual Studio 编辑器都会覆盖它。所以我的方法是创建一个对元素的引用数组,例如
ref GroupBox[] gbChannel;
但这在 C# 中是不可能的。如果我尝试直接分配它
gbChannel[0] = gbChannel0;
C# 通知我,在执行此操作之前,我必须检查对象是否为 null。无论如何
if(gbChannel1!=null) gbChannel[0] = gbChannel0;
导致相同的结果。
有什么方便的方法可以实现我想做的事情吗?
如果您不确定大小,则可以使用如下所示的通用列表:
List<Groupbox> gbChannels = new List<Groupbox>();
然后只需使用gbGhannels.Add
为您迭代的每个标签添加每个元素
想看到更多你的实现代码。看起来您没有正确初始化数组...有几种方法可以做到这一点。如果你知道数组的大小,Galma88 已经提到了一个。
GroupBox[] gbChannel = new GroupBox[x];
另一种方式如下:
GroupBox[] gbChannel = {gbChannel0, gbChannel1, gbChannel2, gbChannel3};
这在很大程度上取决于所涉及的变量的范围。 Ozidom的帖子也是一个好主意,因为泛型也可以非常灵活。
所以我的方法是创建一个对元素的引用数组,例如
ref GroupBox[] gbChannel;
GroupBox
是引用类型,则表示您已经有一个引用数组。 仅允许使用 ref
关键字来指示应通过引用传递方法的参数。 它很少需要,因为大多数函数应该设计为输出值而不是改变输入。
如果我尝试直接分配它
gbChannel[0] = gbChannel0;
C# 通知我,我必须检查 在执行此操作之前,对象为空。
那是因为你还没有数组 - 你只有一个可以容纳数组的变量。 您必须使用 new
创建数组:
gbChannel = new GroupBox[4];
或者可以使用数组初始值设定项:
gbChannel = new [] {gbChannel0, gbChannel1, gbChannel2, gbChannel3};
每次我在 GU 中更改任何内容时,Visual Studio 编辑器都会覆盖它
那么你在错误的地方做这件事。 您可能正在将代码添加到 InitializeComponent
,这是为设计人员保留的,用于放入与放置在那里的 UI 元素对应的代码。 将代码添加到设计器不会触及的事件处理程序(如Form_Load
,
我认为你必须初始化你的数组;
GroupBox[] gbChannel = new GroupBox[x];