我正在创建一个调查应用程序,并且从我编写的XML文件中读取显示splash表单内的splash文本和实际调查表单中的问题时遇到麻烦。
我在XML中编写问题和答案,以便程序可以通过简单地创建不同的XML并从中读取而不是硬编码问题和答案来重用。下面是我的XML结构:
<questions>
<splashText>
<text>Splash text displaying information and purpose of the survey goes here</text>
</splashText>
<question>
<type>ComboBoxControl</type>
<text>Blah blah blah?</text>
<choices>
<choice>Answer 1</choice>
<choice default="true">Answer 2</choice>
<choice>Answer 3</choice>
<choice>Answer 4</choice>
</choices>
<Required>true</Required>
</question>
..
..
</questions>
我怎样才能让我的程序从我的XML中读取并将splash文本放入我的splash表单上的文本框中?
诚然,我还没有对此进行测试,但是一些正常的调试可能会指出您的解析代码存在缺陷。我认为这可能会解决这个问题,但你应该在调试时在一个即时窗口中查看你的XDocument查询,看看你是否得到了你所期望的。
var xDocument = XDocument.Load(@"C:Users..Survey.xml");
var questionList = xDocument
.Element("questions")
.Elements("question")
.Select(elem => new Questions
{
QuestionType = elem.Element("type").Value,
QuestionText = elem.Element("text").Value,
SplashScreenText = elem.Element("splashText").Value,
Choices = elem.Element("choices").Elements("choice").Select(ch =>
new Choice
{
AnswerChoice = ch.Value
}).ToArray()
}).ToList();
编辑:当然,再看一看,我注意到您的winforms代码从来没有调用XMLParser,而且XMLParser实际上也没有返回Questions对象列表。在你可以显示任何东西之前,你需要这样做。
使用强类型模型而不是匿名类来读取XML,然后使用MVP模式绑定UI。它会更容易,它会使维护容易。
因此,当启动应用程序(或单击Refresh按钮)时,将从XML文件中读取数据,并根据读取的内容创建模型(对象)。您可以将这些问题存储在静态类或单例中。
之后,从Windows窗体中,您只需访问正确的模型并根据需要手动或使用DataBinding链接它。
我在Java中做了类似的事情,这就是我如何解决它的。然而,我使用MVC模式代替,但MVC和MVP是非常相似的。
- 如果你还没有从UI中这样做-注册到splash_load事件
- 为splash表单添加一个标签(命名为lbl),并在阅读器到达splash text元素时设置其文本。