Mam taki problem,
zrobiłam program w Windows Forms pobierający od użytkownika dane i zapisujący je do pliku xml.
Jednak chciałam również zrobić wyszukiwanie na podstawie tekstu w textBoxie albo w comboBoxie.
Jednak nie wiem jak przeszukać plik oraz żeby zwracał mi wszystkie wyniki dotyczące tego składnika.
Mam już wyświetlanie tabeli - ale nie wiem jak przeszukać ten plik :(
Pomocy !
a na przykład pętlą: dla każdego 'dziecka' w xml jeśli wartość równa się 'coś' to dodaj do listy/wyświetl
albo LINQ to XML
Tylko że w wersji pętli musiałabym mieć z 50 warunków. a LINQ nie potrafię użyć :(
50? a co ty chcesz znaleźć w tym pliku :)
podaj cześć kodu programu najlepiej.
XDocument xdoc = XDocument.Load(@"Path");
foreach (var us in xdoc.Descendants("Base"))
if (!string.IsNullOrEmpty(us.Element("Name").Value) && us.Element("Name").Value.Equals(this.textBox1.Text))
{
}
http://stackoverflow.com/questions/11356895/linq-to-xml-find-an-element
Ogólnie to wygląda tak:
http://speedy.sh/VBUBw/1.png
http://speedy.sh/CfJfj/2.png
Mam wyszukiwanie i do odpowiednich pól przypisane wartości.
Czyli choćby w samym rodzaju jest z 20 pozycji.
Z kodu wyszukującego nie mam nic poza wyświetlaniem tabelki ze wszystkim,
czyli jej ustawienia wyświetlania
- co wyswietla:
ListViewItem[] items = new ListViewItem[Program.mojeUbrania.Count];
for (int i = 0; i < Program.mojeUbrania.Count; i++)
{
items[i] = new ListViewItem(Program.mojeUbrania[i].styl);
items[i].SubItems.Add(Program.mojeUbrania[i].rozmiar);
items[i].SubItems.Add(Program.mojeUbrania[i].kolor);
items[i].SubItems.Add(Program.mojeUbrania[i].rodzaj);
items[i].SubItems.Add(Program.mojeUbrania[i].kondycja);
items[i].SubItems.Add(Program.mojeUbrania[i].ocena.ToString());
items[i].SubItems.Add(Program.mojeUbrania[i].marka);
items[i].SubItems.Add(Program.mojeUbrania[i].opis);
items[i].SubItems.Add(Program.mojeUbrania[i].zdjecie);
}
Próbowałam tamtego kodu już wcześniej, niestety mam błąd z XDocument :(
Mam kod napisany tak:
XDocument xdoc = XDocument.Load(@"C:\Users\Klaudia2\Desktop\Ubra.xml");
foreach (var us in xdoc.Descendants("Ubrania"))
if (!string.IsNullOrEmpty(us.Element(comboBox1.Text).Value) && us.Element(comboBox1.Text).Value.Equals(this.textBox1.Text))
{
A bład:
Error 1 'string' does not contain a definition for 'Text' and no extension method 'Text' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?) C:\Users\Klaudia2\Documents\Visual Studio 2010\Projects\Ubrania\Ubrania\Form3.cs 143 98 Ubrania
us.Element(comboBox1.Text) // źle (no chyba że tu jest nazwa elementu)
<Base>
<Item>
<Name>ss</Name>
<Value>aa</Value>
</Item>
<Item>
<Name>rr</Name>
<Value>ww</Value>
</Item>
</Base>
us.Element("Name").Value
if (us.Element("Name").Value.Equals(this.textBox1.Text) //jeśli Name = this.textBox1.Text, czyli np to 'ss';
a co z robić kiedy wyświetla mi nie te pozycje co ma ? Albo je podwaja?
mam 2 comboBoxy ( w tym 1 pojawiający sie jeśli jest możliwość wyboru elementu do wyszukania z listy już podanych) oraz 1 textBoxa (dla tych dla których nie ma już stworzonych elementów).
Kod mam taki:
XDocument xdoc = XDocument.Load(@"C:\Users\Klaudia2\Desktop\Ubra.xml");
foreach (var us in xdoc.Descendants("Ubrania"))
if ((!string.IsNullOrEmpty(us.Element(this.comboBox1.Text).Value) || !string.IsNullOrEmpty(us.Element(this.textBox1.Text).Value)) && (us.Element(this.comboBox1.Text).Value.Equals(this.textBox1.Text) || us.Element(this.comboBox1.Text).Value.Equals(this.comboBox2.Text)))
{
ListViewItem[] items = new ListViewItem[Program.mojeUbrania.Count]; // Tu wczytuje mi z zapisanej wcześniej wartości w programie - jak to zmienić????
for (int i = 0; i < Program.mojeUbrania.Count; i++)
{
items[i] = new ListViewItem(Program.mojeUbrania[i].styl);
items[i].SubItems.Add(Program.mojeUbrania[i].rozmiar);
items[i].SubItems.Add(Program.mojeUbrania[i].kolor);
items[i].SubItems.Add(Program.mojeUbrania[i].rodzaj);
items[i].SubItems.Add(Program.mojeUbrania[i].kondycja);
items[i].SubItems.Add(Program.mojeUbrania[i].ocena.ToString());
items[i].SubItems.Add(Program.mojeUbrania[i].marka);
items[i].SubItems.Add(Program.mojeUbrania[i].opis);
items[i].SubItems.Add(Program.mojeUbrania[i].zdjecie);
}
listView.Items.AddRange(items); // Dodajemy pozycje items[] do listView.
this.Controls.Add(listView);
}
}
może nie czyścisz listView :)
this.listView.Items.Clear();
Jak przeczyszczę to tylko pokazuje mi się pusta tabelka :(
I mam wrażenie, że ten mój program szuka rozwiązania nie w pliku tylko w kodzie w którym są 2 przykładowe pozycje
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace Ubrania
{
public class Ubrania
{
// public zmień później na private, dodając właściwości dla poniższych składowych
public string styl;
public string rozmiar;
public string kolor;
public string rodzaj;
public string kondycja;
public int ocena;
public string marka;
public string opis;
public string zdjecie;
public Ubrania() // Niezbedny bezparametrowy konstruktor (dla serializacji)
{ }
public Ubrania(string st, string rozm, string kol, string rodz, string kond, int oce, string mark, string op, string zdj)
{
styl = st;
rozmiar = rozm;
kolor = kol;
rodzaj = rodz;
kondycja = kond;
ocena = oce;
marka = mark;
opis = op;
zdjecie = zdj;
}
}
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static private Ubrania[] tab = { new Ubrania("Elegancki", "S(36)", "Biały", "Sukienka", "Nowy", 5, "House", "Ładna koronkowa", @"C:\Users\Klaudia2\Desktop\Clipboard.jpg"),
new Ubrania("Elegancki", "S(36)", "Biały", "Sukienka", "Nowy", 5, "House", "Ładna koronkowa", @"C:\Users\Klaudia2\Desktop\Clipboard2.jpg") };
static public List<Ubrania> mojeUbrania = new List<Ubrania>(tab); // Tworzymy publiczną kolekcję - listę filmów. Użytkownik będzie mógł do niej dodawać ubrania
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
kotecek napisał(a):
Jak przeczyszczę to tylko pokazuje mi się pusta tabelka :(
A czyścisz przed czy po wyświetleniu?
Program zapewne szuka pliku tam, gdzie się uruchomił jeśli nie podałaś innej ścieżki, umiesz się zapiąć debuggerem w miejscu czytania XML i to sprawdzić?
Właśnie problem tkwi w tym że tworzę listView dla czegoś co już istnieje w kodzie programu - do utworzonej innej tablicy
ListViewItem[] items = new ListViewItem[Program.mojeUbrania.Count];
A w sumie nie wiem czy tak moze być.
Bo plik mi przeszukuje i jak znajdzie to czego szuka to wyświetla mi tabelkę - ale nie wyświetla elementów które się znajdują w tym pliku :(
static public List<Ubrania> mojeUbrania = new List<Ubrania>(tab); // Tworzymy publiczną kolekcję - listę filć mów.
Po co wypełniać tablicę i tworzyć z niej listę, skoro można od razu wypełnić listę?
hm? Mogę prosić o podpowiedź? :)
ale ja nie wiem jak to zrobić :(
Nie, nie wiem
Zobacz na przykłady - http://www.dotnetperls.com/initialize-list - na samym dole jest, co potrzebujesz: "Program that initializes object Lists: C#".
static private List<Ubrania> tab = new List<Ubrania> { new Ubrania("Elegancki", "S(36)", "Biały", "Sukienka", "Nowy", 5, "House", "Ładna koronkowa", @"C:\Users\Klaudia2\Desktop\Clipboard.jpg"),
new Ubrania("Elegancki", "S(36)", "Biały", "Sukienka", "Nowy", 5, "House", "Ładna koronkowa", @"C:\Users\Klaudia2\Desktop\Clipboard2.jpg") };
Rozumiem że tak nie można?
XDocument xdoc = XDocument.Load(@"C:\Users\Klaudia2\Desktop\Ubra.xml");
foreach (var us in xdoc.Descendants("Ubrania"))
if ((!string.IsNullOrEmpty(us.Element(this.comboBox1.Text).Value) || !string.IsNullOrEmpty(us.Element(this.textBox1.Text).Value)) && (us.Element(this.comboBox1.Text).Value.Equals(this.textBox1.Text) || us.Element(this.comboBox1.Text).Value.Equals(this.comboBox2.Text)))
{
listView1.Add(us.SelectSingleNode("styl").Value);
}
Już tak próbowałam ale otrzymuję 2 komunikaty o błędach:
" Error 2 'System.Xml.Linq.XElement' does not contain a definition for 'SelectSingleNode' and no extension method 'SelectSingleNode' accepting a first argument of type 'System.Xml.Linq.XElement' could be found (are you missing a using directive or an assembly reference?) C:\Users\Klaudia2\Documents\Visual Studio 2010\Projects\Ubrania\Ubrania\Form3.cs 168 46 Ubrania
"
"Error 1 'System.Windows.Forms.ListView' does not contain a definition for 'Add' and no extension method 'Add' accepting a first argument of type 'System.Windows.Forms.ListView' could be found (are you missing a using directive or an assembly reference?) C:\Users\Klaudia2\Documents\Visual Studio 2010\Projects\Ubrania\Ubrania\Form3.cs 168 39 Ubrania
"