【问题标题】:the output of the array in turn in panel to labels C#数组的输出依次在面板中到标签 C#
【发布时间】:2017-12-07 21:22:56
【问题描述】:

我遇到了这个问题。我有一个带有 20 个标签的面板。函数 generator() 为每个标签分配数组的编号。每个数字从 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();
            }
        }
    }

我会很感激你的帮助:)

【问题讨论】:

  • 使用Thead.Sleep 不适合为您的 UI 设置动画。
  • @AluanHaddad 我知道,但这不是我目前的问题 :)
  • panel1.Controls 不是一个井井有条的集合(嗯,它可能是,但我怀疑我们知道事物的内部顺序)。我建议您以一种允许您使用panel1.FindControl(lblName) 根据您的getUniqueRandomArray 索引构造lblName 来寻址它们的方式智能地命名您的标签控件。
  • 如果不知道自己想做什么,很难说,但有几件事很突出。您每次通过 j 循环更新相同的panel1.Controls[i],并且 50 毫秒的睡眠将不可见。结果就像您将内部循环替换为 panel1.Controls[i].Text = generatedArray[i].ToString();

标签: c# arrays label panel


【解决方案1】:

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

从 Label 派生的自定义类:

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 异常。

【讨论】:

  • 我在第一篇文章中添加了一张图片以了解问题。你的方法我不能尝试,因为它和我的工作没什么不同。你能帮忙修复你的代码吗?
  • @Syncmaxim “修复它”是什么意思?您需要将标签放在一行中吗?
  • 我的意思是简单地做,没有类和初始化每个标签。你的方法有效,很好,但是很大。我简单地解决了这个问题:我已经从这个面板中删除了所有标签,并一一添加了它们。现在效果很好。 :) 感谢您的帮助 :)
  • @Syncmaxim 好吧,对你有好处,但我建议重新考虑。您应该直接控制对象的配置。无法保证您的容器将来会遵守该订单。另请参阅编辑。
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多