【问题标题】:Loop through sequential control names C#循环遍历顺序控制名称 C#
【发布时间】:2016-04-01 07:26:54
【问题描述】:

我希望将值分配给名为numericUpDown1numericUpDown2 等的 NumericUpDowns。我希望实现的是这样的:

for (int i = 0; i < readBuf.Length; i++)
{
    numericUpDown[i + 1].Value = Convert.ToDecimal(BitConverter.ToSingle(readBuf[i], startIndex: 0));             
}

我尝试做的是这里描述的方法:Loop through Textboxes,但是当我这样使用它时它并没有给出预期的结果

var allNumUpDwn = this.GetChildControls<NumericUpDown>();
int i = 0;
foreach (NumericUpDown nud in allNumUpDwn)
{
    nud.Value = Convert.ToDecimal(BitConverter.ToSingle(readBuf[i], startIndex: 0));
    i++;
}

【问题讨论】:

  • readBuf 到底是什么?您必须调试您的应用程序。在代码中插入断点,看看发生了什么。
  • @Dmitry 我正在从另一个进程读取内存并使用 numericUpDown 控件对其进行更改,但有时程序中的值会发生变化并且 numericUpDowns 不会更新,因此我需要再次读取内存。

标签: c# winforms for-loop foreach


【解决方案1】:

我会使用这种方法:

var nuds = new []
{
    numericUpDown1, numericUpDown2,
    numericUpDown3, numericUpDown4,
    numericUpDown5, numericUpDown6,
    // etc
};

for (int i = 0; i < readBuf.Length; i++)
{
    nuds[i].Value = Convert.ToDecimal(BitConverter.ToSingle(readBuf[i], startIndex: 0));
}

这里最大的优势是您的代码经过编译时检查,因此如果您开始删除或重命名控件,那么您将遇到编译错误而不是运行时错误。

【讨论】:

  • 我同意 Enigmativity。除非您的 numericUpDowns 是动态构建的,否则这种方法会更好。
  • @Enigmativity 啊,我希望我可以避免将每个 numericUpDown 写入数组中的重复性,但如果这是需要做的,就必须这样做。感谢您的回答!
  • @RikusHoney - 您始终可以使用Controls.Find 和 LINQ 收集数组,但如果存在运行时错误,则会返回。
【解决方案2】:

你可以试试:

for (int i = 0; i < readBuf.Length; i++)
{
    ((NumericUpDown)Controls.Find("numericUpDown" + (i+1))).Value = Convert.ToDecimal(BitConverter.ToSingle(readBuf[i], startIndex: 0));             
}

【讨论】:

    猜你喜欢
    • 2018-09-03
    • 2016-07-12
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多