【问题标题】:Serialize datagridview to a xml file not working将datagridview序列化为xml文件不起作用
【发布时间】:2012-10-14 07:01:55
【问题描述】:

我知道这是一个非常简单和基本的问题,但我想知道如何解决这个问题。我在从 datagrdiview 序列化对象时遇到问题。

这条线在

中对我不起作用
if (dataGridView1 != null) 
    _example.Details = dataGridView1.DataBindings;   // Not Working.

请告诉我我在这里犯了什么错误...!谢谢。

private void button3_Click(object sender, EventArgs e)  //Read
{
            XmlSerializer _serializer = new XmlSerializer(typeof(XMLExample));
            XMLExample _example = new XMLExample();

            // Read file.
            using (TextReader textReader = new StreamReader(@"C:\test\testserialization.xml"))
            {
                _example = (XMLExample)_serializer.Deserialize(textReader);
                textReader.Close();
            }

            textBox1.Text = _example.ID;
            textBox2.Text = _example.Initial;

            dataGridView1.DataSource = _example.Details;
        }

        private void button2_Click(object sender, EventArgs e) //Write
        {
            XmlSerializer _serializer = new XmlSerializer(typeof(XMLExample));
            XMLExample _example = new XMLExample();

            _example.ID = textBox1.Text;
            _example.Initial = textBox2.Text;

            List<Detail> _source = new List<Detail>();

            for (int i = 0; i < 10; i++)
            {
                _source.Add(new Detail
                {
                    FirstName = "Name_" + i,
                    LastName = "Surname_" + i,
                    Section = "section_"+i,
                });
            }

            dataGridView1.DataSource = _source;

            if (dataGridView1 != null && dataGridView1.DataSource != null) 
               _example.Details = (List<Detail>)dataGridView1.DataSource;

            using (TextWriter textWriter = new StreamWriter(@"C:\test\testserialization.xml"))
            {
                _serializer.Serialize(textWriter, _example);
                textWriter.Close();
            }
        }

类文件:

[Serializable]
public class StudentInfo : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string UserID { get; set; } // Textbox1
    public string Department { get; set; } // Textbox2
    public List<Detail> Details { get; set; }
}

[Serializable]
public class Detail // Datagridview1
{
    [XmlElement("FirstName")] //Datagridview
    public string FirstName { get; set; }
    [XmlElement("LastName")] //Datagridview
    public string LastName { get; set; }
    [XmlElement("Section")] //Datagridview
    public string Section { get; set; }
}

【问题讨论】:

    标签: c# winforms datagridview xml-serialization


    【解决方案1】:

    试试这个:

    if (dataGridView1 != null && dataGridView1.DataSource != null) test.Details = (List<Detail>)dataGridView1.DataSource;
    

    List&lt;Detail&gt; 赋值给 DataGridView 对象的属性 DataSource 的示例代码(在构造函数中添加此代码):

     List<Detail> _source = new List<Detail>();
                for (int i = 0; i < 10; i++)
                {
                    _source.Add(new Detail
                    {
                        FirstName = "Name_" + i,
                        LastName = "Surname_" + i,
                        Section = "Section_" + i
                    });
                }
    
                dataGridView1.DataSource = _source;
    

    【讨论】:

    • 你在哪里分配了数据源?
    • 我刚刚复制了你的 sn-p 并尝试了。除了你的 sn-p,我没有分配任何数据源。我必须分配一个吗?
    • @kmatyaszek: ...我的问题是如何编辑数据网格并将其写回 xml 文件。??谢谢
    • @linguini 尝试在 InitializeComponent(); 之后的构造函数中添加我的示例代码,仅用于测试。在更改之后,可能在您的事件处理程序中更改我在上面建议您的那一行。我试试这个,它正在工作。如果它在您的解决方案中不起作用,您必须给我更多代码,尤其是您将数据分配给 DataGridView 的代码。
    • @linguini 如果您现在调用 button2_Click 会发生什么?以及为什么你使用这个new XmlSerializer(typeof(XMLExample)); 而不是这个new XmlSerializer(typeof(StudentInfo));。 XMLExample 类在哪里定义?
    【解决方案2】:

    您必须序列化而不是 dataGridView,以及 DataTable 或 DataSource

    例子:

    XmlSerializer ser = new XmlSerializer(typeof(DataTable));
    DataTable dt = new DataTable("data");
    TextWriter writer = new StreamWriter(Application.StartupPath+"\\"+fname+".xml");
    ser.Serialize(writer, dt);
    writer.Close();
    

    【讨论】:

    • 我正在尝试通过datagridview序列化列表的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多