我有一个函数,InsertItems:
public void InsertItems()
{
todoitemList.Clear();
todoSelect.Items.Clear();
foreach (XmlNode xmlNode in xmlDoc.SelectNodes("ToDoList/ToDo"))
{
ToDoItem item = new ToDoItem();
item.ID = xmlNode.SelectSingleNode("ID").InnerText;
item.Title = xmlNode.SelectSingleNode("Title").InnerText;
item.Description = xmlNode.SelectSingleNode("Desc").InnerText;
item.PriorityLevel = xmlNode.SelectSingleNode("Priority").InnerText;
item.Date = Convert.ToDateTime(xmlNode.SelectSingleNode("Date").InnerText);
item.TimeHour = Convert.ToInt32(xmlNode.SelectSingleNode("TimeHour").InnerText);
item.TimeMinute = Convert.ToInt32(xmlNode.SelectSingleNode("TimeMinute").InnerText);
item.TimeSecond = Convert.ToInt32(xmlNode.SelectSingleNode("TimeSecond").InnerText);
item.Completed = xmlNode.SelectSingleNode("Completed").InnerText;
todoitemList.Add(item);
todoSelect.Items.Add(item.Title);
todoIDList.Add(item.ID);
}
}
此功能清除列表和用于选择项目的组合框,然后使用相关数据填充列表。 ToDoItem是一个包含属性的类--ID,Title等。
当在Form1.cs中执行该函数时,它完全按预期工作,清除列表并添加新数据。但是,当函数在Form2.cs(main.InsertItems())中执行时,foreach循环似乎永远不会运行,我真的不知道是什么导致了这个。
非常感谢任何帮助!
-
编辑:
main.InsertItems()在以下函数中调用:
private void createNew_Click(object sender, EventArgs e)
{
if (CheckAll())
{
XmlNode xmlNode = xmlDoc.CreateNode(XmlNodeType.Element, "ToDo", null);
XmlNode xmlNodeID = xmlDoc.CreateElement("ID");
xmlNodeID.InnerText = CreateRandomID();
XmlNode xmlNodeTitle = xmlDoc.CreateElement("Title");
xmlNodeTitle.InnerText = textBoxTitle.Text;
XmlNode xmlNodeDesc = xmlDoc.CreateElement("Desc");
xmlNodeDesc.InnerText = textBoxDesc.Text;
XmlNode xmlNodePriority = xmlDoc.CreateElement("Priority");
xmlNodePriority.InnerText = Convert.ToString(priorityLevel.SelectedItem);
XmlNode xmlNodeDate = xmlDoc.CreateElement("Date");
string currentDate = Convert.ToString(monthCalendar.SelectionRange.Start);
string strippedDate = currentDate.Substring(0, currentDate.Length - 8);
strippedDate += timeHour.Text + ":" + timeMinute.Text + ":" + timeSecond.Text;
xmlNodeDate.InnerText = strippedDate;
XmlNode xmlNodeTimeHour = xmlDoc.CreateElement("TimeHour");
xmlNodeTimeHour.InnerText = timeHour.Text;
XmlNode xmlNodeTimeMinute = xmlDoc.CreateElement("TimeMinute");
xmlNodeTimeMinute.InnerText = timeMinute.Text;
XmlNode xmlNodeTimeSecond = xmlDoc.CreateElement("TimeSecond");
xmlNodeTimeSecond.InnerText = timeSecond.Text;
XmlNode xmlNodeCompleted = xmlDoc.CreateElement("Completed");
xmlNodeCompleted.InnerText = "False";
xmlNode.AppendChild(xmlNodeID);
xmlNode.AppendChild(xmlNodeTitle);
xmlNode.AppendChild(xmlNodeDesc);
xmlNode.AppendChild(xmlNodePriority);
xmlNode.AppendChild(xmlNodeDate);
xmlNode.AppendChild(xmlNodeTimeHour);
xmlNode.AppendChild(xmlNodeTimeMinute);
xmlNode.AppendChild(xmlNodeTimeSecond);
xmlNode.AppendChild(xmlNodeCompleted);
xmlDoc.DocumentElement.AppendChild(xmlNode);
try
{
xmlDoc.Save(_fileName);
MessageBox.Show("Item successfully added!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
main.InsertItems();
}
catch (XmlException)
{
MessageBox.Show("Error! The item could not be added due to an XML error.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (IOException)
{
MessageBox.Show("Error! The file could not be found or written to. Item could not be added.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception)
{
MessageBox.Show("Error! An unknown error occured. Item could not be added.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
this.Close();
}
}
CheckAll返回一个布尔值 - >如果所有字段都有效,则为true。
_fileName变量是正确的,并保存到正确的文件中。
答案 0 :(得分:2)
问题是您没有在xmlDoc
重新加载Form1.InsertItems
。
在您发布的代码中,在从Form1.InsertItems
调用Form2
之前,您将该文件写入磁盘,但由于您没有从{{{}传递对更新的xmlDoc
的引用1}}到Form2
,您看不到Form1
上显示的更改。当您从Form1
调用InsertItems
时,Form1
会按预期工作,因为xmlDoc
是Form1
的成员变量,因此当InsertItems
调用Form1
时,这些更改可用{1}}。
尝试从XmlDocument
开头的文件系统重新加载InsertItems
,或将XmlDocument
作为参数传递给InsertItems
。
答案 1 :(得分:0)
另一个类是否在另一个线程上运行?这可能是由于跨线程异常造成的。基本上,只有一个UI线程可以更新UI元素。如果您尝试从另一个线程更新UI元素,那么您将获得异常。您可能只是吞下了这个错误。您可以尝试调试它,在吃之前您将看到异常。如果确实如此,那么您需要调用UI线程来执行更新。
Here is a good article on winforms cross thread UI updates.
以下是您的代码看起来像的一个粗略示例(它不是编译器检查,但应该关闭:))
if ( main.InvokeRequired ) {
main.Invoke(new MethodInvoker(main.InsertItems));
} else {
main.InsertItems();
}