在很大的帮助下,我能够使用此功能将动态复选框写入winForm。
参考:Dynamic Checkbox from a txt file entry on a WinForm UI
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()语句没有递增的原因。
这是个问题。为什么这段代码没有增加,为什么它没有从part.ToString()所在的文本文件中放入行,用户名?
任何人都可以指出我正确的方向吗?我真的很感激。非常感谢你提前。 :-D
答案 0 :(得分:1)
问题是因为你试图分配你的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 :(得分:1)
我看到的一些问题:
您正在从文件中读取一行,然后将其拆分为新行,因此您可能只会获得一个元素。您可能需要在分隔符上拆分该行,即&#39; - &#39;或&#39;,&#39;
您正在设置check[i].Name = parts;
。 parts
是一个字符串数组,因此您的复选框仅显示&#39; System.string []&#39;。将其更改为chk[i].Name = parts[i];
答案 2 :(得分:0)
好的,这是正常运行的代码。如果有人想评论它,我当然可以使用帮助。感谢所有帮助过的人和@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()语句,将所有parts.ToString()更改为部分。[i](Sooo,SpellCheck可以绕过。:-D)并将line = reader.ReadLine()更改为。 ReadToEnd的()。它正在递增,它只是没有读过第一行,因此所有复选框都具有相同的名称。
再次感谢所有帮助过的人。我Trully欣赏它!!祝你有美好的一天!! :-D