Search code examples
c#winformsdatagridviewxml-serialization

Serialize datagridview to a xml file not working


I know this is a very simple and basic question but I would like to know how to fix this. I got a problem in serializing the object from the datagrdiview.

This line is not working for me in the

if (dataGridView1 != null) 
    _example.Details = dataGridView1.DataBindings;   // Not Working.

Please tell me what is the mistake I'm doing here...! Thank you.

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();
            }
        }

The class file:

[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; }
}

Solution

  • Try this:

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

    Sample code with assignment List<Detail> to property DataSource of DataGridView object (add this code in constructor):

     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;