以下代码,信用证:Guffa。
大家好,
我正在尝试根据纯文本文件中的信息在运行时向Form添加控件。结构?文本文件始终相同,不会更改。例如:
Label
"This is a label"
320, 240
<小时/>
Control
Text
Location
以下代码由Guffa提供给我,不会导致任何错误或任何错误,但与此同时,根本没有任何反应。而且我不确定为什么......有人可以解释一下为什么标签没有被创建并添加到表格并附上正确的信息吗?
MatchCollection lines = Regex.Matches(File.ReadAllText(fileName), @"(.+?)\r\n""([^""]+)""\r\n(\d+), (\d+)\r\n");
foreach (Match match in lines) {
string control = match.Groups[1].Value;
string text = match.Groups[2].Value;
int x = Int32.Parse(match.Groups[3].Value);
int y = Int32.Parse(match.Groups[4].Value);
Console.WriteLine("{0}, \"{1}\", {2}, {3}", control, text, x, y);
if(control == "Label")
{
Label label = new Label();
label.Text = text;
canvas.Controls.Add(label); // canvas is a Panel Control.
label.Location = new Point(x, y);
}
}
我希望我已经清楚地解释了我的情况。任何帮助都将非常感激。
感谢您花时间阅读。 jase
答案 0 :(得分:3)
我的猜测是你的文件没有完全正确的格式。如果您单步执行代码,它是否与任何内容匹配?
如果是,打印到控制台的内容是什么?
您是否使用问题中显示的完全示例进行了尝试?虽然我没有在表单中尝试过,但我已经使用示例文件尝试了上面的其余代码,并且它运行正常。
就我个人而言,我认为我不会使用正则表达式来匹配所有这样的行 - 这使得诊断问题变得更加困难 - 但如果文件正确,它应该可以正常工作。你说你不明白所提供的正则表达式 - 说实话,这是不使用它的另一个好理由。即使它完全正确,使用您不理解的代码也不是一个好主意 - 您将无法维护它。
我个人只会一次阅读三行,然后以这种方式处理它们。像这样:
private static readonly Regex LocationPattern = new Regex(@"^(\d+), (\d+)$");
...
using (TextReader reader = File.OpenText(filename))
{
while (true)
{
string control = reader.ReadLine();
string text = reader.ReadLine();
string location = reader.ReadLine();
if (control == null)
{
break;
}
if (text == null || location == null)
{
// Or however you want to handle this...
throw new InvalidConfigurationFileException
("Incorrect number of lines");
}
if (text.Length < 2 || !text.StartsWith("\"") || !text.EndsWith("\""))
{
// Or however you want to handle this...
throw new InvalidConfigurationFileException
("Text is not in quotes");
}
text = text.Substring(1, text.Length - 2);
Match locationMatch = LocationPattern.Match(location);
if (!locationMatch.Success)
{
// Or however you want to handle this...
throw new InvalidConfigurationFileException
("Invalid location: " + location);
}
// You could use int.TryParse if you want to handle this differently
Point parsedLocation = new Point(int.Parse(match.Groups[1].Value),
int.Parse(match.Groups[2].Value));
// Now the rest of the code before
}
}
正如您所知,这是一个很多更多的代码 - 但它的每个部分都相对简单。如果你乐意处理它们,正则表达式是强大的,但除非表达“手写”的东西很复杂,否则我经常发现更容易维持更长的路。只是个人偏好。
答案 1 :(得分:2)
盲目猜测:我看到正则表达式中的最后一个\r\n
不是可选的。您的输入文件可能在最后一行之后缺少返回字符吗?
关于吸吮正则表达式的补充说明:有一些工具可以帮助您试验正则表达式,这可能有用,例如,了解在这种特殊情况下发生了什么。我总是使用Expresso,其中包括你提供的正则表达式的结构,并解释它的作用。
答案 2 :(得分:0)
另一种可能性是您忘记将canvas
(面板控件)添加到另一个控件,因此不显示画布内的控件链,您可能看不到画布本身不显示。哪种猜测最好? : - )