在C#中为Winforms输入数据创建单独的XML文档

时间:2017-01-12 09:11:14

标签: c# xml winforms

我是C#开发的新手,目前正在为码头建立预订申请。

(已搜索过以前的问题,但未能成功找到我正在寻找的内容)

用例:

  1. 通过Windows表单界面输入客户端信息,
  2. 将数据存储为XML文件 - 点击按钮(每个客户一个)
  3. 通过表单按名称搜索时将数据返回到gridView。 (例如客户查询)
  4. 我已将程序配置为为表单输入创建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)
            {
    
            }
        }
    }
    

    提前致谢,

3 个答案:

答案 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