Jak wyciągnąć index listview item z sqlite?

0

Witam,
Mam bazę danych sqlite oraz program z elementem listView. W bazie danych jest kolumna numer 4 o nazwie "CzyZaznaczono".
Potrzebuję pomocy w tym jak znaleźć listview item index który w bazie danych w kolumnie "CzyZaznaczono" ma wartość 1. Chcę do tych itemów dodać obrazek.
Jak na razie udało mi się tylko zrobić tak żeby do wszystkich itemów dodawało obrazek, bez względu czy w kolumnie "CzyZaznaczone" jest 1 czy pusto.
Jak to ugryźć?
Czyli podsumowując, if (dla wiersza w kolumnie 4 jest wartość "1"(w bazie danych)) to przypisane itemy z listView (które w bazie mają wartość "1") dostają obrazek.
Mój obecny źle działający kod:

for (int i = 0; i < listView1.Items.Count; i++)
                {
                    imageList.Images.Add(Image.FromFile("D:\\C#\\Przypominacz2 — kopia (4)\\przypominacz\\przypominacz\\Resources\\checked.png"));
                    listView1.SmallImageList = imageList;
                    listView1.Items[i].ImageIndex = 0;
                }

Narysowałem obrazek o co mi chodzi:
OBRAZEK
http://www.tinypic.pl/im5e37cv8gcz

0

a co stoi na przeszkodzie aby podczas pobierania danych z bazy (bo przecież musisz je pobrać aby je wyświetlić) pobrać też OD RAZU kolumnę CzyZaznaczono i nie kombinować potem?

0

Nie do końca rozumiem.
Nie wiem po prostu jak połączyć:

cmd.CommandText = "SELECT CzyZakonczone FROM Mytable WHERE CzyZakonczone LIKE 1";

z tym:

listView1.Items[i].ImageIndex = 0;
0

jak wypełniasz listview danymi?

0

ListView wypełniam danymi w ten sposób:

//dodanie nowych danych do listview i db
            string data2 = dateTimePicker1.Text;
            string godzina2 = dateTimePicker2.Text;
            string nazwa2 = tB2Nazwa.Text;
            string opis2 = rTB2Opis.Text;

            SQLiteConnection con = new SQLiteConnection("data source=baza.db");
            con.Open();
            SQLiteCommand cmd = con.CreateCommand();
            SQLiteDataAdapter ada = new SQLiteDataAdapter("select * from Przypominacz", con);
            DataTable dt = new DataTable();
            cmd.CommandText = "INSERT INTO Przypominacz(Nazwa, Data, Godzina, Opis) VALUES('" + nazwa2 + "','" + data2 + "','" + godzina2 + "','" + opis2 + "')";
            cmd.ExecuteNonQuery();

            //załadowanie danych z bazy do listview
            listViewForm2.Items.Clear();
            ada.Fill(dt);

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow dr = dt.Rows[i];
                ListViewItem listitem = new ListViewItem(dr["Nazwa"].ToString());
                listitem.SubItems.Add(dr["Data"].ToString());
                listitem.SubItems.Add(dr["Godzina"].ToString());
                listitem.SubItems.Add(dr["Opis"].ToString());
                listViewForm2.Items.Add(listitem);
            }
0

przypisz sobie do Tag itema ID z bazy i po problemie.
listitem.Tag = dr.GetInt32(numer_kolumny_z_id);
Poza tym przecież możesz od razu pobrać CzyZakonczone i przypisać w tym kodzie odpowiednio ImageIndex

1

Coś Ty tu nakombinował. Macie te ORMy, a potem prostego SQLa nie potraficie zapisać ;)
Po co Ci ten LIKE w zapytaniu? Wiesz co robi? LIKE używa się do porównania łańcuchów po jakimś wzorcu z symbolami wieloznacznymi, np:

SELECT ID FROM tbl WHERE clientName LIKE '%-%'

Takie zapytanie zwróci ID wszystkich klientów, którzy mają myślnik w nazwisku (pole clientName). Więc można stwierdzić, że tych, którzy mają dwuczłonowe nazwiska

Twoje zapytanie jest zupełnie bez sensu, bo sprowadza się do:

SELECT 1 FROM MyTable

Poprawnie to powinieneś zrobić to w ten sposób:

  1. Stworzyć sobie klasę dla rekordu, który wrzucasz do ListwView.
  2. Ta klasa powinna mieć pola analogiczne do tego, co masz w tabeli
  3. Następnie tworzysz sobie obiekt tej klasy, zaczytując odpowiedni rekord z bazy
  4. Potem, podczas wyświetlania tego w ListView, sprawdzasz, czy obiekt ma pole CzyZakonczone ustawione na true.

Np:

public class ReminderItem
{
  public UInt64 ID { get; private set; }
  public DateTime DateTime { get; set; }
  public string Name { get; set; }
  public string Description { get; set; }
  public bool Finished { get; set; }

  public ReminderItem(DataRow dr)
  {
    ID = Convert.ToUInt64(dr["id"]);
    DateTime = Convert.ToDateTime(dr["dt"]); //linijka została uproszczona i normalnie nie powinieneś tak robić
    Name = dr["name"].ToString();
    Description = dr["description"].ToString();
    Finished = Convert.ToBoolean(dr["finished"]); //to Twoje CzyZakonczono
  }
}

To jest bardzo uproszczony przykład Twojej klasy. Nie musisz też trzymać oddzielnie daty i czasu. Możesz trzymać to w jednym polu (tak jak ja to zrobiłem). Dodatkowo uwielbiam trzymać daty w bazie danych w postaci sekund (tak przy okazji).

Dla czepialskich: specjalnie nie robię żadnego dziedziczenia i klas bazowych w stylu BaseDBItem, żeby nie zaciemniać obrazu.

Potem bardzo ładnie wrzucasz to sobie na listę:

List<ReminderItem> items = GetItems(); //pobierasz sobie listę tych itemów (oczywiście jeden SQL)
foreach(RemiderItem item in items)
{
  ListViewItem listitem = new ListViewItem(item.Name);
  listitem.SubItems.Add(item.DateTime.ToString());
  listitem.SubItems.Add(item.Description);
  if(item.Finished)
    listitem.ImageIndex = 1;
  else
    listitem.ImageIndex = 0;
 
  //i teraz magia:
  listitem.Tag = item; //dzięki temu w tagu listitem masz zawsze dostęp do oryginalnego itema

  listViewForm2.Items.Add(listitem);  
}

Dzięki instrukcji: listitem.Tag = item zawsze masz dostęp do itema klasy RemiderItem z poziomu ListViewItem. Rozumiesz? Czyli jeśli np. w jakimś zdarzeniu ListView będziesz chciał sprawdzić, czy item.Finished to musisz tylko dobrać się do ListViewItem tego, który Cię interesuje, a potem:

ListViewItem lvi = GetClickedListViewItem(); //to oczywiście pewnie będziesz miał w argumencie zdarzenia
ReminderItem item = lvi.Tag as ReminderItem;

if(item.Finished) ....

Mam nadzieję, że nie zamotałem Ci za mocno i widzisz jak to się robi.

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