数组依次在面板中输出到标签 C#

the output of the array in turn in panel to labels C#

我遇到了这个问题。我有一个带有 20 个标签的面板。函数生成器()为每个标签分配数组的编号。每个数字从 1 滚动到所需的数字。但问题是这个号码是乱序分配的。例如,第一个数字分配给 1 个标签,下一个数字分配给 10 个标签,下一个分配给 2,下一个分配给 11 等。

但我需要按 rtl 或 ltr 顺序输出数字。

我不知道如何修复它。请帮忙。

public void generator() // присваивание текстбоксам значений 
    {
        generatedArray = getUniqueRandomArray(1, 81, 20).ToArray();

       for (int i = 0; i < panel1.Controls.Count; i++)
        {
            for (int j = 1; j < generatedArray[i] + 1; j++)
            {
                panel1.Controls[i].Text = j.ToString();
                Thread.Sleep(50);
                panel1.Controls[i].Refresh();
            }
        }
    }

我将不胜感激:)

为此,您可以使用自己的一些控件,以便更好地定义它们的行为(并批量执行)。

派生自标签的自定义 class:

List<MyLabel> MyLabels = new List<MyLabel>();

public class MyLabel : Label
{
   public MyLabel()
   {
      //Define some default properties
      this.TextAlign = ContentAlignment.MiddleCenter;
      this.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
      this.Font = new Font("Calibri", 9f, FontStyle.Regular);
      this.BackColor = Color.White;
      this.ForeColor = Color.Black;
      this.Size = new Size(50, 20);
   }
}

在面板中插入一组自定义标签(这也可以是自定义控件)。

 int LeftMargin = 20;
 int TopMargin = 20;
 int NumberOfLabels = 20;
 int LabelsPerRow = 5;
 int LabelsDistance = 10;
 int _idx = 0;

for (int y = 0; y < (NumberOfLabels / LabelsPerRow); y++)
{
   for (int x = 0; x < LabelsPerRow; x++)
   {
      MyLabels.Add(new MyLabel() { Parent = this.panel1 });
      MyLabels[_idx].Location = new Point((LeftMargin + ((MyLabels[_idx].Width + LabelsDistance) * x)),
                                          (TopMargin + ((MyLabels[_idx].Height + LabelsDistance) * y)));
      _idx++;
   }
}

这是结果:

如果您只是更改这些字段:

 int LeftMargin = 1;
 int TopMargin = 1;
 int NumberOfLabels = 20;
 int LabelsPerRow = 20;
 int LabelsDistance = 1;

你明白了:

然后,调用您的 generator() 方法来填充 UI:

generator();

public async void generator()
{
   generatedArray = getUniqueRandomArray(1, 81, 20).ToArray();
   for (int i = 0; i < MyLabels.Count; i++)
   {
      for (int j = 1; j < generatedArray[i] + 1; j++)
      {
         await Task.Run(async () => await Task.Delay(500));

         //Set the text property of the custom labels. The order will be respected
         MyLabels[i].Text = j.ToString();
      }
}

您还可以通过 Panel.Controls[] 数组设置标签文本 属性。

this.panel1.Controls[i].Text = j.ToString();

订单也会得到遵守,但如果父表单关闭,则会导致 ArgumentOutOfRange 异常。