Czego brakuje w kodzie?

0

wyskakuje błąd ale nie wiem jak go usunąć.

 
 class zapisListView
    {
            public void ToSaveItem(ListViewItem item)
            {
                value1 = item.SubItems[0].Text;
                value2 = item.SubItems[1].Text;
                value3 = item.SubItems[2].Text;
                value4 = item.SubItems[3].Text;
                value5 = item.SubItems[4].Text;
                value6 = item.SubItems[5].Text;
                value7 = item.SubItems[6].Text;
                value8 = item.SubItems[7].Text;
                value9 = item.SubItems[8].Text;
                value10 = item.SubItems[9].Text;
            }

            public void ToSaveItem() { }

            public string value1;
            public string value2;
            public string value3;
            public string value4;
            public string value5;
            public string value6;
            public string value7;
            public string value8;
            public string value9;
            public string value10;
    }
}

        private void button5_Click(object sender, EventArgs e)
        {
            ////zapis wyników z listView1 do pliku
            zapisListView[] saveTab = new zapisListView[listView1.Items.Count];
            for (int i = 0; i < listView1.Items.Count; i++)
                saveTab[i] = new zapisListView(listView1.Items[i]); //błąd 'zapisListView' does not contain a constructor that takes 1 arguments
            XmlSerializer serializer = new XmlSerializer(typeof(zapisListView[]));
            TextWriter writer = new StreamWriter("base.xml");
            serializer.Serialize(writer, saveTab);
            writer.Close();

            Application.Exit();
            fW.watekTree.Abort();

        }

///odczyt
        private void button2_Click(object sender, EventArgs e)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(zapisListView[]));
            FileStream stream = null;
            try
            {
                stream = new FileStream("base.xml", FileMode.Open);
                XmlReader reader = new XmlTextReader(stream);
                zapisListView[] saveTab = (zapisListView[])serializer.Deserialize(reader);
                foreach (zapisListView item in saveTab)
                {
                    ListViewItem lvItem = new ListViewItem(item.value1);
                    lvItem.SubItems.Add(item.value2);
                    lvItem.SubItems.Add(item.value3);
                    lvItem.SubItems.Add(item.value4);
                    lvItem.SubItems.Add(item.value5);
                    lvItem.SubItems.Add(item.value6);
                    lvItem.SubItems.Add(item.value7);
                    lvItem.SubItems.Add(item.value8);
                    lvItem.SubItems.Add(item.value9);
                    lvItem.SubItems.Add(item.value9);

                    listView1.Items.Add(lvItem);
                }
            }
            catch (Exception)
            {
            }
            finally
            {
                if (stream != null) stream.Close();
            }

        }
0

Policz sobie nawiasy klamrowe. Używaj IDE, które powie Ci gdzie masz błąd lub czytaj ze zrozumieniem komunikaty o błędach.

0

nie wnikając w szczegóły twojego programu, to kompilator czepia się ze w

 button5_Click(object sender, EventArgs e)

wywołujesz, tworzysz obiekt saveTab[i] = new zapisListView(listView1.Items[i]);


a nie masz takiego konstruktora w klasie **zapisListView**.

Zmien metode na konstruktor i ten blad zniknie.

w klasie **zapisListView**,
zamiast **public void ToSaveItem(ListViewItem item)** napisz **public zapisListView(ListViewItem item)**.
1
class zapisListView
    {
            public void ToSaveItem(ListViewItem item)
            {
                value1 = item.SubItems[0].Text;
                value2 = item.SubItems[1].Text;
                value3 = item.SubItems[2].Text;
                value4 = item.SubItems[3].Text;
                value5 = item.SubItems[4].Text;
                value6 = item.SubItems[5].Text;
                value7 = item.SubItems[6].Text;
                value8 = item.SubItems[7].Text;
                value9 = item.SubItems[8].Text;
                value10 = item.SubItems[9].Text;
            }
 
            public void ToSaveItem() { }
 
            public string value1;
            public string value2;
            public string value3;
            public string value4;
            public string value5;
            public string value6;
            public string value7;
            public string value8;
            public string value9;
            public string value10;
    }
}

Wywal to.

0

Klasa bez void "public zapisListView(ListViewItem item)" działa ale tylko jak znajduje się w kodzie formy a nie w oddzielnym pliku. Teraz wyskakuje błąd "Metoda musi mieć typ zwracany.". Dlaczego mam wywalić tą klasę?

0

nie klasa bez void tylko metoda bez void ;) a metoda bez void (z nazwa identyczna jak nazwa klasy w ktorej sie znajduje) to konstruktor klasy w ktorej sie znajduje ;)

dziala ci tylko wtedy gdy jest w kodzie formy bo to jest klasa zagniezdzona i zdefiniowana jako prywatna.

jezeli cała klase zapisListView przeniesiesz do osobnego pliku to zdefiniuj ja jako public wtedy zadziala:

 
public zapisListView
{
     //......
}

PS. Nie wczytywalem sie w szczegoly twojego programu. takze nie wiem co robi jak zoptymalizowac podpowiadam tylko co oznaczaja wyskakujace Ci bledy.

0

Dlaczego mam wywalić tą klasę?

Ponieważ tak się nie robi od tego są pętle i tablice. W ogóle nie wczytywałem się w kod bo nie chce psuć sobie poranka :) ale później może tu wejdę i zobaczę co tu się dzieje.

1

ale szybko rzucone wywalo to zmyliło go, o wiele lepiej brzmi czy pomaga okreslenie tak sie nie robi, od tego są petle, zmien to ;), nawet jezeli to nie rozwiazuje jego problemu to daje mu jasny sygnal o co Ci chodzi, podejrzewam ze wywalo to mogl zinterpretowac jako podpowiedz rozwiazania problemu, ja przynajmniej po Twoim poscie zaczalem czytac jego kod aby upewnic sie czy aby na pewno wywalenie tej klasy nie jest rozwiazaniem tego problemu ;).

Poza tym, jest to dział newbie, tu potrzeba wiecej cierpliwosci ;).

1

Nie pomyślałem o tym że ktoś może pomyśleć że jest to rozwiązanie problemu, sorry.
Chyba nie można serializować pól publicznych a tylko właściwości, to może być jeden z powodów dlaczego to nie działa.

Zrobiłem to za pomocą LINQ, bo zdaje się że aby użyć klasy XmlSerializer trzeba by tworzyć takie potwory jak klasa zapisListView.

        void SaveToXml(ListView listView, string path)
        {
            var mainEl = new XElement("ListView");
            foreach (ListViewItem lvi in listView.Items)
            {
                var lviEl = new XElement("ListViewItem");
                foreach (ListViewItem.ListViewSubItem si in lvi.SubItems)
                {
                    lviEl.Add(new XElement("SubItem",si.Text));
                }
                mainEl.Add(lviEl);
            }
            mainEl.Save(path);
        }

        void ReadFromXml(ListView listView, string path)
        {
            var mainEl = XElement.Load(path);
            var lviElements = mainEl.Descendants("ListViewItem");
            foreach (var lviEl in lviElements)
            {
                var lvi = new ListViewItem();
                foreach (var si in lviEl.Descendants("SubItem"))
                {
                    lvi.SubItems.Add(si.Value);
                }
                listView.Items.Add(lvi);
            }
        }

Aby użyć tych metod musisz w parametrach podać swój listview i ścieżkę do pliku xml, np:

            SaveToXml(listView1, "file.xml");
            ReadFromXml(listView1, "file.xml");

W tym przypadku plik xml znajdzesz w katalogu z projektem w folderze bin/Debug

Dodatkowo musisz dodać using System.Xml.Linq;

0

dlaczego kolumny są przesunięte? tzn 1kol jest na 2, 2 na 3 itd a ostatniej nie ma w ogóle

0

Sprawdź czy w tym pliku xml masz wszystkie kolumny.

0

są wszystkie kolumny w odpowiedniej kolejności

1

Był błąd w metodzie ReadFromXml, okazuje się że kiedy tworzysz nowy ListViewItem z domyślnym konstruktorem to w gratisie dostajesz jeden pusty subitem, dlatego reszta była przesunięta.
Podmień to:

void ReadFromXml(ListView listView, string path)
        {
            var mainEl = XElement.Load(path);
            var lviElements = mainEl.Descendants("ListViewItem");
            foreach (var lviEl in lviElements)
            {
                var lvi = new ListViewItem(lviEl.Descendants("SubItem").Select(s => s.Value).ToArray()); 
                listView.Items.Add(lvi);
            }
        }
0

jak mogę przeszukiwać plik xml? Próbowałem wstawić warunek ale nie działa.

 
        public bool ReadFromXml(string nr, ListView listView, string path)
        {
            var mainEl = XElement.Load(path);
            var lviElements = mainEl.Descendants("ListViewItem");
            foreach (var lviEl in lviElements)
            {
                var lvi = new ListViewItem(lviEl.Descendants("SubItem").Select(s => s.Value).ToArray());
                if (nr == lvi.ToString())
                {
                    listView.Items.Add(lvi);
                }
            }
            return false;
        }
0

A czego w nim szukasz?
if (nr == lvi.ToString()) to nie zadziała bo prawdopodobnie lvi.ToString() zwraca string w stylu System.Windows.ListViewItem

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