数组中的 C# 用户界面元素



我对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];

最新更新