为什么这个for()不递增

本文关键字:for 为什么 | 更新日期: 2023-09-27 18:26:32

在极大的帮助下,我能够使用它为winForm编写一个动态复选框。

参考:WinForm UI 上的txt文件条目中的动态复选框

    public static void getPermText(System.Windows.Forms.Form targetForm)
    {
        Stream fileStream = File.Open(dataFolder + PermFile, FileMode.Open);
        StreamReader reader = new StreamReader(fileStream);
        string line = null;
        do
        {
            line = reader.ReadLine();
            string[] parts = line.Split(''n');
            if (line == null)
            {
                break;
            }
            try
                {
                int userCount;
                userCount = parts.Length;
                CheckBox[] chk = new CheckBox[userCount];
                int height = 1;
                int padding = 10;
                for (int i = 0; i <= userCount; i++)
                    {
                    chk[i] = new CheckBox();
                    chk[i].Name = parts.ToString();
                    chk[i].Text = parts.ToString();
                    chk[i].TabIndex = i;
                    chk[i].AutoCheck = true;
                    chk[i].Bounds = new Rectangle(15, 30 + padding + height, 150, 22);
                    targetForm.Controls.Add(chk[i]);
                    height += 22;
                    }
                }
            catch
                {
                }                
        } while (true);
    }

不幸的是,我没有得到一个错误,我得到了一个复选框,旁边有文本"System.string[]"。我很确定我只得到一个。我注意到,我从程序的另一部分(以及上面和我的个人资料中提到的建议)中删除了这句话

        foreach (string parts in reader)

除了StreamReader无法访问GetEnumerator的变量错误之外。我假设这个缺失的foreach就是for()语句不递增的原因。

这就是问题所在。为什么这段代码没有递增,为什么它没有把文本文件中的行、用户名放在parts中。ToString()是??

谁能告诉我正确的方向吗??我真的很感激。提前非常感谢-D

为什么这个for()不递增

问题是因为您试图分配作为字符串数组的parts。试试看:

for (int i = 0; i <= userCount; i++)
                    {
                    chk[i] = new CheckBox();
                    chk[i].Name = parts[i];
                    chk[i].Text = parts[i];
                    chk[i].TabIndex = i;
                    chk[i].AutoCheck = true;
                    chk[i].Bounds = new Rectangle(15, 30 + padding + height, 150, 22);
                    targetForm.Controls.Add(chk[i]);
                    height += 22;
                    }

我看到的几个问题:

  1. 您正在从文件中读取一行,然后将其拆分为新行,所以您可能只得到一个元素。您可能需要在分隔符上拆分行,例如"-"或","

  2. 您正在设置check[i].Name = parts;parts是一个字符串数组,所以您的复选框只显示"System.string[]"。将其更改为chk[i].Name = parts[i];

好的,这是正确工作的代码。如果有人想对此发表评论,我当然需要帮助。感谢所有提供帮助的人,尤其是@Grant Whinney。

    public static void getPermText(System.Windows.Forms.Form targetForm)
    {
        Stream fileStream = File.Open(dataFolder + PermFile, FileMode.Open);
        StreamReader reader = new StreamReader(fileStream);
        string line = null;
            line = reader.ReadToEnd();
            string[] parts = line.Split(''n');
            try
                {
                int userCount;
                userCount = parts.Length;
                CheckBox[] chk = new CheckBox[userCount];
                int height = 1;
                int padding = 10;
                for (int i = 0; i < userCount; i++)
                    {
                    chk[i] = new CheckBox();
                    chk[i].Name = parts[i];
                    chk[i].Text = parts[i];
                    chk[i].TabIndex = i;
                    chk[i].AutoCheck = true;
                    chk[i].Bounds = new Rectangle(15, 30 + padding + height, 150, 22);
                    targetForm.Controls.Add(chk[i]);
                    height += 22;
                    }
                }
            catch
                {
                } 
          }

从本质上讲,我丢弃了do()语句,更改了所有部分。ToString()转换为零件。[i] (Sooo,可以绕过拼写检查。:-D)并更改行=读取器。ReadLine()到.ReadToEnd()。它是递增的,只是从来没有读过第一行,所以所有的复选框都有相同的名称。

再次感谢所有的帮助。我真的很感激!!祝你度过美好的一天!!:-D