win Forms serializacja

0

Witam
Mam problem. Nie jestem jakiś dobry z programowania i chciałem się spytać o bardzo dla mnie ważną rzecz. W poniższym przykładzie (aplikacja Windows Forms) używam kontrolki dataGridView. Chciałbym się dowiedzieć jak szybko zapisać dane znajdujące się w tej kontrolce do pliku i później je wczytać do programu (po ponownym uruchomieniu programu). Czytałem co nieco o serializacji, ale nigdzie nie znalazłem przykładu lub objaśnienia jak to dokładnie ma wyglądać (próbowałem na wiele sposobów). Za każdym razem mam błąd. Poniższy kod zawiera tylko część całego projektu.

Projekt : Biblioteka szkolna.
Zasada działania poniższego programu w skrócie: Wczytywanie książek do dataGridView oraz funkcje do edycji danych itd.

Problem: Jak zapisać dane książek do pliku i po ponownym uruchomieniu programu wczytać je z pliku.
Odpowiednie funkcje powinny się znajdować w:

[kod na pastebin]

0

Ja kiedyś coś takiego robiłem i wymyśliłem na szybko takie rozwiązanie.
To czy jest dobre oceń sam:
Stworzyłem sobie obiekt Table, który serializuję.

        [Serializable]
        public class Table
        {
            private List<String> _rows;

            public Table()
            {
                this._rows = new List<string>();
            }

            public void AddRow(string row)
            {
                this._rows.Add(row);
            }

            public override string ToString()
            {
                StringBuilder builder = new StringBuilder();
                this._rows.ForEach(delegate(String row) { builder.AppendLine(row); });
                return builder.ToString();
            }

            public string SerializeToString()
            {
                TextWriter writer = null;
                try
                {
                    writer = new StringWriter();
                    XmlSerializer serializer = new XmlSerializer(typeof(List<String>));
                    serializer.Serialize(writer, this._rows);
                    string value = writer.ToString();
                    return value;
                }
                finally
                {
                    if (writer != null)
                        writer.Close();
                }
            }

            public static Table FromSerializeString(string value)
            {
                Table tab = new Table();
                TextReader stream = null;
                try
                {
                    stream = new StringReader(value);
                    XmlSerializer serializer = new XmlSerializer(typeof(List<String>));
                    tab._rows = (List<String>)serializer.Deserialize(stream);
                    return tab;
                }
                finally
                {
                    if (stream != null)
                        stream.Close();
                }
            }
        }

Przykład użycia:

            Table table = new Table();
            //Dane: Imie Nazwisko Miasto
            table.AddRow("Ala Ibacka Poznań");
            table.AddRow("Katarzyna Rogowska Ełk");

            string serialize = table.SerializeToString();
            Console.WriteLine("Serializacja XML");
            Console.WriteLine(serialize);
            table = Table.FromSerializeString(serialize);
            Console.WriteLine("Deserializacja:");
            Console.WriteLine(table.ToString());

To jest napisane w C# ale konwersja na zarządzany C++ nie powinna sprawić Ci kłopotu.
Wiersz w datagrid przedstawiam jako string, gdzie kolumny rozdzielone są spacją.
Metoda serializuje obiekt do stringa, z którym możesz zrobić wszystko ;)

0

hmm a nie prosciej w takim przypadku wykorzystac funkcje ReadXml i WriteXml dostepnych dla dataset/datatable?
wczytywanie danych z pliku (C#):

ds = new DataSet();
ds.ReadXml(@"c:\a.xml");
dataGridView1.DataSource = ds.Tables[0];

zapisywanie danych (C#):

ds.WriteXml(@"c:\a.xml", XmlWriteMode.WriteSchema);

jedyne o co nalezaloby zadbac to sprawdzanie przy uruchamianiu czy plik bazy istnieje, a jesli nie to stworzyc nowy.

0

Dziękuję za pomoc DataSet wydaje się rozsądnym rozwiązaniem i prosto się serializuje :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1