Witam wszystkich progra-swirow :)
Mam problem z serializacja DataTable do XML. Przy pierwszej probie serializacji i deserializacji z testowymi danymi wszystko przebiega OK; probem pojawia sie po zamknieciu programu i ponownym jego uruchomieniu wyrzuca blad o pustej DataTable. Podejzewam iz probem lezy w pustej liscie <MyTask> tasks ale nie potrafie tego kodu zoptymalizowac, jestem nowicjuszem w programowaniu. Czy ktos chetny do pomocy? Z gory dzieki za zaangazowanie!
Oto kod:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace to_do
{
public partial class TO_DO : Form
{
private List<MyTask> Tasks;
private DataTable table;
private DataSet set;
public TO_DO()
{
InitializeComponent();
Tasks = new List<MyTask>();
table = new DataTable();
set = new DataSet();
}
private void addtsk_Click(object sender, EventArgs e)
{
AddTask at = new AddTask();
DialogResult dr = at.ShowDialog(); /* metoda show dialog zwraca wartosc dialog result.
* wartosc ta jest przydatna- mozna za jej pomoca sprawdzic czy wszystko w nowo otwartym oknie poszlo zgodnie z planem
* czyli w tym przypadku czy np. zdecydowalizmy sie utworzyc zadanie, czy anulowac dodawanie nowego zadania*/
if (Tasks.Count < 5)
{
if (dr == DialogResult.OK)//sprawdzamy czy zawartosc obiektu dr jest rowna wartosci pokazujacej powodzenie
{
Tasks.Add(at.NewTask); /* korzystamy z wlasciwosci klasy AddTask (czyli z tego geta co go zadeklarowalismy wczesniej)
* do zwrocienia utworzonego obiektu. Obiekt zwrocone orzez ta wlasciwosc jest typu MyTask, wiec
* kolekcja spokojnie go przyjmuje.*/
DataTable table = ConvertListToDataTable(Tasks); //Convert to DataTable.
dataGridView.DataSource = table; //Displays new task in DataGridView
}
}
else
{
MessageBox.Show("The list of tasks is full!");
dr = DialogResult.Abort;
}
}
private void endtsk_btn_Click(object sender, EventArgs e)
{
AddDataTableToDataSetAndSerialize(table);
Application.Exit();
}
static DataTable ConvertListToDataTable(List<MyTask> Tasks)
{
//New table
DataTable table = new DataTable();
//Add columns
table.Columns.Add("Title", typeof(string));
table.Columns.Add("Description", typeof(string));
table.Columns.Add("Start Date", typeof(DateTime));
table.Columns.Add("Expiry Date", typeof(DateTime));
table.Columns.Add("Compleated", typeof(bool));
foreach(MyTask singleTask in Tasks)
{
table.Rows.Add(singleTask.title, singleTask.description, singleTask.created, singleTask.expiry, singleTask.compleated);
}
return table;
}
private void AddDataTableToDataSetAndSerialize(DataTable table)
{
DataSet ds = new DataSet();
//New table
table = new DataTable();
//Add columns
table.Columns.Add("Title", typeof(string));
table.Columns.Add("Description", typeof(string));
table.Columns.Add("Start Date", typeof(DateTime));
table.Columns.Add("Expiry Date", typeof(DateTime));
table.Columns.Add("Compleated", typeof(bool));
foreach (MyTask singleTask in Tasks)
{
table.Rows.Add(singleTask.title, singleTask.description, singleTask.created, singleTask.expiry, singleTask.compleated);
}
ds.Tables.Add(table);
ds.Tables[0].TableName = "tasks";
ds.WriteXml("tasks.xml");
}
private void DeserializeAndShowInDataGridView()
{
try
{
XmlReader xmlFile;
xmlFile = XmlReader.Create("tasks.xml", new XmlReaderSettings());
DataSet ds = new DataSet();
ds.ReadXml(xmlFile);
dataGridView.DataSource = ds.Tables[0];
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void TO_DO_Load(object sender, EventArgs e)
{
DeserializeAndShowInDataGridView();
}
}
}