Dyskusje na temat języka C# oraz biblioteki .NET
			
		
		
			
				
																			
								profit 							 
						Początkujący 			
		Posty:  17 Dołączył(a):  wtorek, 3 listopada 2015, 21:05 
		
						
					
													
							
						
									
						Post 
					 
								przez profit  czwartek, 3 grudnia 2015, 11:23 
			
			
			
			
			
			Bardzo proszę o pomoc. Nie wiem jak poradzić sobie z pewnym problemem. Chodzi mi o zapisywanie do pliku dat czyli serializacje.  Zamieszczam poniżej kod który czasami działa poprawnie(tak mi się wydaje) a czasami nie. Urachamia się i wczytuje dane do listy podane w kodzie i wyśietla. Teraz w datagridview edytuje dodaje usuwam itd. i zapisuje do pliku. I teraz gdy wczytuje dane z pliku do datagridview to czasami wczytuja się wszystkie dane poprawnie a czasmi po wczytaniu wyswietlaja się tylko dane te z kodu. Spedziłem dwa dni na poszukiwanie rozwiązania i niestety NIC!!
Code: Zaznacz cały 
public partial class kontrahenci : Form
    {
 [Serializable]
    public class Kontrahent
    {
        public int Id
        {
            get
            {
              
                return id;
            }
            set
            {
                id = value;
            }
        }
        private int id;
        public string FirstName { get; set; }
        public string LastName { get; set; }
        
        List<Kontrahent> kontra = new List<Kontrahent>();
        public kontrahenci()
        {
            InitializeComponent();
            kontra.Add(new Kontrahent() { Id = 1, FirstName = "Michał", LastName = "Nowak});
            kontra.Add(new Kontrahent() { Id = 2, FirstName = "Monika", LastName = "Hanc" });
            kontra.Add(new Kontrahent() { Id = 3, FirstName = "Jan", LastName = "Kowalski" });
            kontra.Add(new Kontrahent() { Id = 4, FirstName = "Franek", LastName = "Zielichowski" });
        }
        private void kontrahenci_Load(object sender, EventArgs e)
        {
            
            bindingSource1.DataSource = kontra;
            dataGridView1.DataSource = bindingSource1;
            bindingNavigator1.BindingSource = bindingSource1;
            
        }
      
        private void button2_Click(object sender, EventArgs e)
        {
            //---------------Zapisywanie--------------
           
            if (File.Exists(@"c:\fakturka\kontrahenci.dat"))
            {
                File.Delete(@"c:\fakturka\kontrahenci.dat");
            }
            string path = @"c:\fakturka\kontrahenci.dat";
            using (Stream output = File.Create(path))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(output, kontra);
                MessageBox.Show("Lista kontrahentów zostala zapisana na dysku");
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            //---------------Odczytywanie--------------
         
            string path = @"c:\fakturka\kontrahenci.dat";
            using (Stream input = File.OpenRead(path))
            {
                BinaryFormatter formatter = new BinaryFormatter();
                List<Kontrahent> kontra = (List<Kontrahent>)formatter.Deserialize(input);
                bindingSource1.DataSource = kontra;
                dataGridView1.DataSource = bindingSource1;
                bindingNavigator1.BindingSource = bindingSource1;
                MessageBox.Show("Dane zostaly wczytane!");
            }
        }
 
		 
				
		
		 
	 
				
		
		
			
				
																			
								Morfidon 							 
						Administrator 			
		Posty:  1332 Dołączył(a):  wtorek, 5 sierpnia 2008, 21:48
				Contact: 
				
			 
				
		 
		
						
					
													
							
						
									
						Post 
					 
								przez Morfidon  czwartek, 3 grudnia 2015, 16:04 
			
			
			
			
			
			Hej,
Prześlij cały projekt do testu. Niestety na pierwszy rzut oka ciężko mi coś znaleźć nieprawidłowego. Jak odpalę program pewnie szybciej znajdę błąd.
Pozdrawiam 
 
		 
				
		
		 
	 
				
		
		
			
				
																			
								profit 							 
						Początkujący 			
		Posty:  17 Dołączył(a):  wtorek, 3 listopada 2015, 21:05 
		
						
					
													
							
						
									
						Post 
					 
								przez profit  poniedziałek, 7 grudnia 2015, 23:01 
			
			
			
			
			
			Poczytałem trochę na temat serializacji do XML. I przerobiłem projekt do XML i teraz prawie wszystko działa. Prawie gdyż gdy odkomentuje wiersze kodu w InvoiceKlasy. Program nie wczytuje danych z pliku i przy próbie dodania nowej osoby wysypuje się. 
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: No row can be added to a DataGridView control that does not have columns. Columns must be added first.
Nie rozumiem dlaczego dodanie konstruktora to powoduje???
plik klasy
Code: Zaznacz cały 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
namespace Invoice
{
    public class Kontrahent
    {
        public int Id
        {
            get
            {
              
                return id;
            }
        }
        private int id;
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        private static int NextId = 1;
        //--------------------------Jeżeli to odkomentuje to nie działa---------------
        //public Kontrahent(string firstName, string lastName)
        //{
        //    NextId++;
        //    id = NextId;
        //    FirstName = firstName;
        //    LastName = lastName;
        //}
    }
   
    //------------Serializacja XML--------------
    class Serializacja
    {
        public static void XMLSerialize(List<Kontrahent> kontrahent)
        {
            StreamWriter sw = new StreamWriter(@"c:\fakturka\kontrahent.xml");
            try
            {
                XmlSerializer s = new XmlSerializer(typeof(List<Kontrahent>));
                s.Serialize(sw, kontrahent);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                sw.Close();
            }
        }
    }
    ///------------------Deserializacja XML-------------------
    class DeSerializacja
    {
        public static List<Kontrahent> XMLDeserialize(string xmlFile)
        {
            List<Kontrahent> obj;
            XmlReader xr = XmlReader.Create(xmlFile);
            try
            {
                XmlSerializer s = new XmlSerializer(typeof(List<Kontrahent>));
                obj = (List<Kontrahent>)s.Deserialize(xr);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                obj = null;
            }
            finally
            {
                xr.Close();
            }
            return obj;
        }
    }
}
plik form
Code: Zaznacz cały 
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 Invoice
{
    public partial class Form1 : Form
    {
        private List<Kontrahent> kontrahent;
        
        public Form1()
        {
            InitializeComponent();
        //    kontrahent = new List<Kontrahent>();
           kontrahent = DeSerializacja.XMLDeserialize(@"c:\fakturka\kontrahent.xml");
         
           
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ////-------------- Zapisywanie po nacisnieciu przycisku
            Serializacja.XMLSerialize(kontrahent);
          
        }
        private void button2_Click(object sender, EventArgs e)
        {
            /////////// -----Deserializacja Wczytywanie po nacisnieciu przycisku
            kontrahent = DeSerializacja.XMLDeserialize(@"c:\fakturka\kontrahent.xml");
            bindingSource1.DataSource = kontrahent;
            dataGridView1.DataSource = bindingSource1;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            bindingNavigator1.BindingSource = bindingSource1;
            bindingSource1.DataSource = kontrahent;
            dataGridView1.DataSource = bindingSource1;
            
        }
        private void button3_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Jest " + kontrahent.Count + " kontrahentów");
            
        }
        
        
      
        private void button4_Click(object sender, EventArgs e)
        {
            comboBox2.DataSource = kontrahent;
            comboBox2.DisplayMember = "FirstName";
            comboBox2.ValueMember = "LastName";
            
            
        }
    }
}