快速了解我要做的事情...我有一个我创建的表单这样做的是当用户点击Add
按钮时它会调出一个文件浏览器对话框,让用户选择一个文件。
选择后,文件将被添加到XML文档和报告列表中。
我认为移除按钮是不言自明的。
我需要这个文件能够被我创建的另一个程序读取,因此它可以相应地获取正确的信息。
我正在考虑使用数据集,但我决定反对,因为我需要有一个固定的xml文件位置,如果我有一个数据集,我不知道用户计算机将放置源的位置数据集。这就是我想我会跳过数据集并手动制作XML文件的原因。
唯一的问题是错误,我修复了一个错误,弹出一个新错误。我目前得到的错误发生在addButton
方法中,并说我无法访问XML文件,因为它已被其他进程使用。尝试通过确保文件在访问之前关闭来解决这个问题,但仍然没有做到这一点。
我使用常规XmlDocument
来阅读和编辑列表中的项目,然后使用XPath
添加一个全新的项目。下面是完整的代码和XML格式,但我现在会说我对它不是很满意,因为它非常不一致。所以我想我的主要问题是这样做的正确方法是什么?
public partial class selectPOSReports : Form
{
XmlDocument doc = new XmlDocument();
public selectPOSReports()
{
InitializeComponent();
if (!File.Exists(@"C:\Users\Public\MEC\posReportList.xml"))
{
Directory.CreateDirectory(@"C:\Users\Public\MEC");
doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?><Reports count=\"0\"></Reports>");
doc.Save(@"C:\Users\Public\MEC\posReportList.xml");
}
else
{
doc.Load(@"C:\Users\Public\MEC\posReportList.xml");
}
XmlNodeList excelReportList = doc.SelectNodes("//Workbook");
foreach (XmlNode excelReport in excelReportList)
{
reportList.Items.Add(excelReport.InnerText);
}
}
private void addButton_Click(object sender, EventArgs e)
{
int newIndex = 0;
if ( selectReportDialog.ShowDialog() == DialogResult.OK ) {
doc.Save(@"C:\Users\Public\MEC\posReportList.xml");
string fileName = selectReportDialog.FileName;
string filePath = Path.GetPathRoot(fileName);
XDocument xd = XDocument.Load(XmlReader.Create(@"C:\Users\Public\MEC\posReportList.xml"));
xd.Element("Reports").Add(
new XElement("Report", new XAttribute("id", newIndex),
new XElement("Workbook", fileName),
new XElement("Filepath", filePath)));
xd.Save(@"C:\Users\Public\MEC\posReportList.xml");
reportList.Items.Add(fileName);
}
}
private void removeButton_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Are you sure you want to remove " + reportList.SelectedItems.ToString() + " from the list?",
"Remove Excel Report",
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
int index = reportList.SelectedIndex;
string sindex = index.ToString();
XmlNode deleteNode = doc.GetElementById(sindex);
deleteNode.ParentNode.RemoveChild(deleteNode);
doc.Save("posReportList.xml");
reportList.Items.RemoveAt(index);
}
}
}
<Reports count="1"><!--Count will be updated as items are added-->
<Report id="1">
<Workbook>SomeBook.xlsx</Workbook>
<Filepath>C:/SomePath</FilePath>
</Report>
</Reports>
非常感谢任何帮助。
答案 0 :(得分:1)
您的添加按钮点击事件
上有两个保存命令doc.Save(@"C:\Users\Public\MEC\posReportList.xml");
和
xd.Save(@"C:\Users\Public\MEC\posReportList.xml");
猜猜你只需要第二个,第一个是某种重构努力的残余?