我是C#开发的新手,目前正在为码头建立预订申请。
(已搜索过以前的问题,但未能成功找到我正在寻找的内容)
用例:
我已将程序配置为为表单输入创建XML文件, 但是,我无法弄清楚如何为每个条目创建单独的XML文件。
目前,每次输入表单数据时,它都会覆盖文件中的先前XML数据。
非常感谢任何有关如何创建单独/附加XML文件的解决方案。
第一次在这里发帖,如果我省略了任何必要的信息,请道歉。
代码如下:
// Save XML.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.IO;
namespace Popeye_Booking_application
{
public class SaveXml
{
public static void SaveData(object obj, string filename)
{
XmlSerializer sr = new XmlSerializer(obj.GetType());
TextWriter writer = new StreamWriter(filename);
sr.Serialize(writer, obj);
writer.Close();
}
}
}
// Information.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Popeye_Booking_application
{
public class Information
{
private string data1;
private string data2;
private string data3;
private string data4;
private string data5;
private string data6;
private string data7;
public string Data1
{
get { return data1; }
set { data1 = value; }
}
public string Data2
{
get { return data2; }
set { data2 = value; }
}
public string Data3
{
get { return data3; }
set { data3 = value; }
}
public string Data4
{
get { return data4; }
set { data4 = value; }
}
public string Data5
{
get { return data5; }
set { data5 = value; }
}
public string Data6
{
get { return data6; }
set { data6 = value; }
}
public string Data7
{
get { return data7; }
set { data7 = value; }
}
}
}
// Form.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Popeye_Booking_application
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonCreate_Click(object sender, EventArgs e)
{
try
{
Information info = new Information();
info.Data1 = textBoxData1.Text;
info.Data2 = textBoxData2.Text;
info.Data3 = textBoxData3.Text;
info.Data4 = textBoxData4.Text;
info.Data5 = textBoxData5.Text;
info.Data6 = textBoxData6.Text;
info.Data7 = textBoxData7.Text;
SaveXml.SaveData(info, "data.xml");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void label1_Click(object sender, EventArgs e)
{
}
private void label4_Click(object sender, EventArgs e)
{
}
private void label10_Click(object sender, EventArgs e)
{
}
private void label7_Click(object sender, EventArgs e)
{
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
}
}
提前致谢,
答案 0 :(得分:0)
使用XDocument类为每个条目创建一个对象,然后在其中使用Save方法,请检查以下链接:https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument(v=vs.110).aspx
答案 1 :(得分:0)
但是,我无法弄清楚如何为每个条目创建单独的XML文件。
每个条目都需要一个特定的可区分ID或名称。所以我建议在类Information
中为它创建一个额外的属性:
public class Information
{
public string Name { get; set; }
这也可以帮助你管理3.点
3.通过表单按名称搜索数据到gridView。 (例如客户端查找)
您需要为名称条目额外TextBox
:
Information info = new Information();
info.Name= textBoxName.Text;
如果它尚不存在则保存: string filename = info.Name +" .XML"
if (!System.IO.File.Exists(filename))
{
SaveXml.SaveData(info, filename);
}
else
{
// notify that name is imabiguous
}
加载时,您可以搜索该文件。
另一种可能性是使用一个属性创建一个额外的类:List<Information> InfoList
。这可以保存在一个包含所有信息条目的文件中。然后,这可以轻松绑定到DataGridView
,也可以使用Name
属性轻松搜索特定项目。
修改强>
以下是您要求的一点点:
Information
课程的基本结构保持不变:
public class Information
{
public string Name { get; set; }
public string Data1 { get; set; }
public string Data2 { get; set; }
// and so on... you get the drift
}
您需要所有这些信息的容器类。这样你就可以只用文件来保存它们了;)。然后,该类还可以获取保存和加载的方法:
public class InformationSaveFile
{ // A list to safe all info entries
public List<Information> InformationList { get; set; }
public InformationSaveFile()
{
InformationList = new List<Information>();
}
// you method to save data
public static void SaveData(object obj, string filename)
{
XmlSerializer sr = new XmlSerializer(obj.GetType());
TextWriter writer = new StreamWriter(filename);
sr.Serialize(writer, obj);
writer.Close();
}
// a method to Load the Data
public static InformationSaveFile LoadData(string FileName)
{
using (var stream = File.OpenRead(FileName)) // File ist aus dem Namensraum System.IO
{
var serializer = new XmlSerializer(typeof(InformationSaveFile));
InformationSaveFile w = serializer.Deserialize(stream) as InformationSaveFile;
return w;
}
}
}
在您的表单中,您需要一个容器类的实例:
// public is not necessary here
public InformationSaveFile InfoSaveFile { get; set; }
现在添加您要使用InformationList
的数据,并将数据保存为SaveData
方法,如下所示:
private void buttonCreate_Click(object sender, EventArgs e)
{
//Adding of Info Items:
Information info = new Information();
info.Name = "Specific Name";
info.Data1 = textBoxData1.Text;
// and so on...
InfoSaveFile.InformationList.Add(info);
InformationSaveFile.SaveData(InfoSaveFile, "YourFileName.XML");
要加载数据,您现在只需要相同的文件名,并且您添加到InformationList
并保存的所有数据都可供您使用:
InfoSaveFile = InformationSaveFile.LoadData("YourFileName.XML");
现在,您可以使用List过滤所需条目的数据:
// Search for certain names:
List<Information> infoList = InfoSaveFile.InformationList.FindAll(x => x.Name == "Search Name");
// OR looking with contains (makes the search broader)
List<Information> infoList_broad = InfoSaveFile.InformationList.FindAll(x => x.Name.Contains("Search Name"));
现在这成了一个很长的答案。我希望你能够遵循这一过程,答案有所帮助。如果不只是给我发表评论。
答案 2 :(得分:0)
使用DataTable。它更易于阅读和书写。还要将DataGridView添加到表单
awk