为什么这个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
问题是因为您试图分配作为字符串数组的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;
}
我看到的几个问题:
-
您正在从文件中读取一行,然后将其拆分为新行,所以您可能只得到一个元素。您可能需要在分隔符上拆分行,例如"-"或","
-
您正在设置
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