przypisanie wartości int z bazy dlwybranego itemu w listView

0

w bazie danych w tabeli zawodnicy posiadam takie kolumny:

ID_Zawodnika | numer | imie | nazwisko | pozycja

w listView wyświetlam numer, imie, nazwisko, pozycja

ID_Zawodnika to typ int

jak pobrać ID_Zawodnika zaznaczonego w listView i przypisać ją do pewnej zmiennej int?

z pobraniem wartości wyświetlanych w listView nie ma problemu bo wygląda to tak:

   string numer = listView1.SelectedItems[0].SubItems[0].Text;

Myślałem o czym takim:

int ID = listView1.SelectedItems[0].

Tylko co dalej... SubItems nie mozemy podac bo ta wartosc nie jest wyswietlana w listView no i trzeba ta wartosc pobrac jako int

Chyba ze jakos inaczej to zrobic.

Głównie chodzi o to zeby pobrac wartość ID_Zawodnika dla zaznaczonego itemu w listView, który nie jest wyświetlany w listView

0

myślę i nie mogę nic wymyślić... ktoś ma jakiś pomysł bo stanąłem w miejscu

0

Skąd Wczytujesz do List View? z Bazy?
Jeśli tak to lepiej stworzyć sobie listę obiektów <zawodnik>
Wczytać ją z bazy i To obsługiwać.
i przypisywać wtedy do zmiennej W następujący sposób
Index wybranej Linii W List View odpowiada indexowi w Liście zawdników
więc Zawodnicy[Index].ID będzie szukanym indexem do obsłużenia

No chyba że chcesz za każdym razem poprzez query SQLowe się odwoływać

0

cat_black - tak do listView wczytuje z Bazy.

Jak stworzyć sobie listę obiektów <zawodnik>?

no i jak później wydobywać dane z listy obiektów?

0

Tworzysz sobię klsę zawodnik Jesli nie wiesz jak to google prawdę ci powie (Tworzenie klas C#)

class Zawodnik
private TYP POLE_X_W_BAZIE;
public Zawodnik(Pola konstruktora)
{
Operacje Konstruktora.
}

do tego komplet

public TYP POLE_X_
{
get;
set;
}

I dalej w Instancji Programu np.: W formie chociaż lepiej w osobnej klasie
Tworzysz sobie
List<Zawodnik> ListaZawodników = new List<Zawodnik>();

Dane wpisujesz Poprzez konstruktor wydobywasz poprzez metody

przykła

TYP ZMIENNA = ListaZawodników[X].POLE_X_;

dla poprawnie stworzonego get; zwroci nam POLE_X_ z obiektu zawdnik Na pozycji X w liście.
Itd.

Ta lista jest tymczasowym odwzorowaniem Bazy Danych z założenia.

0

dzięki za odpowiedź, jednak wciąż mnie męczy ta inna możliwość... myśle nad czymś takim:

DataTable zawodnicy = new DataTable();
            using (SqlDataAdapter da = new SqlDataAdapter("SELECT ID_Zawodnika FROM zawodnicy WHERE numer = '" + listView1.SelectedItems[0].SubItems[0].Text + "' AND nazwisko = '" + listView1.SelectedItems[0].SubItems[2].Text + "'", conn))
            {
                da.Fill(zawodnicy);
            }
          
            comboBox1.ValueMember = "ID_Zawodnika";

i później jak chcę pobrać ID_Zawodnika to pobieram ją za pomocą comboBox1.SelectedValue

Jest tylko jeden problem. W danej formatce pobieram już inna wartość za pomoca
comboBox1.ValueMember :

    DataTable druzyny = new DataTable();
            using (SqlDataAdapter da = new SqlDataAdapter("SELECT ID_Druzyny, nazwa FROM druzyny", conn))
            {
                da.Fill(druzyny);
            }
            comboBox1.DisplayMember = "nazwa";
            comboBox1.ValueMember = "ID_Druzyny";
            comboBox1.DataSource = druzyny;

i podczas próby pobrania comboBox1.ValueMember = "ID_Zawodnika"
wyskakuje błąd, że

"Nie można powiązać z nowym członkiem wartości."

Rozumiem, że występuje tu konflikt bo do ValueMember sa przypisane dwie różne wartości? ID_Drużyny oraz ID_Zawodnika?

Można to jakoś obejść?

0

wydaje mi się jednak, że dla listView nie można użyć takich metod jak DisplayMember czy ValueMember

Zatem nie mogę zrobić czegoś takiego jak

  
DataTable zawodnicy = new DataTable();
using (SqlDataAdapter da = new SqlDataAdapter("SELECT ID_Zawodnika FROM zawodnicy WHERE numer = '" + listView1.SelectedItems[0].SubItems[0].Text + "' AND nazwisko = '" + listView1.SelectedItems[0].SubItems[2].Text + "'", conn))
            {
                da.Fill(zawodnicy);
            }
            

            listView1.DataSource = zawodnicy;                         //!!!BŁĄD
            listView1.ValueMember = "ID_Zawodnika";              //!!!BŁĄD

jak więc moge zastąpic te dwie linijki

listView1.DataSource = zawodnicy;                    
listView1.ValueMember = "ID_Zawodnika";     

tak, żeby przypisać pobraną wartość ID_Zawodnika wyłuskana za pomocą selecta do jakiejś zmiennej?

coś w stylu

int pobranaWartosc = ID_Zawodnika
0

Problem rozwiązany w taki oto sposób:

int IDZawodnika;
   string selectQuery = "SELECT ID_Zawodnika FROM zawodnicy WHERE numer = '" + listView1.SelectedItems[0].SubItems[0].Text + "' AND nazwisko = '" + listView1.SelectedItems[0].SubItems[2].Text + "'";
                SqlCommand cmd = new SqlCommand(selectQuery, conn);
                SqlDataReader Dr;

              

                try
                {
                    conn.Open();

                    Dr = cmd.ExecuteReader();

                    while (Dr.Read())
                    {
                        string costam = (Dr[0].ToString());

                        IDZawodnika = System.Int32.Parse(costam);
                    }
                }

                catch (SqlException ex) { MessageBox.Show(ex.ToString()); }

                finally { conn.Close(); }

no i zmienną którą potrzebowałem przechowuje w IDZawodnika

0

Kolego, wazna rada: Nigdy nie buduj sql'i w taki sposob jak to zrobiles. Jesli masz jakies parametry w zapytaniu uzyj parametrow! Przez takie zapytanie jak Twoje ktos moze np przez strone skasowac Ci cala baze.

Druga rzecz, programujesz w Windows Forms, uzyj Propert Tag. Pod to mozesz podpiac cokolwiek Ci do glowy przyjdzie. Czy to Id, czy to caly wiersz zawodnika, z ktorego pozniej mozesz korzystac. ListViewItem posiada Tag property, wiec nie musisz robic ponownego polaczenia do bazy danych.

Najprosciej bedzie jesli stworzysz sobie DataTable z informacjami o zawodniku i zbindujesz do ListView :) wtedy wszystkie dane masz na miejscu i nie musisz robic ponownego zapytania.

0
wasiu napisał(a)

Przez takie zapytanie jak Twoje ktos moze np przez strone skasowac Ci cala baze.

Stwórz sobie użytkownika, który ma prawa tylko do odczytu, dodawania nowych wierszy i ewentualnie usuwania wierszy z danych tabel. Jeśli tak zrobisz i będziesz się łączył dla tego użytkownika, to nikt Ci bazy nie skasuje, nawet jeśli zrobisz zapytanie w tak prymitywny sposób ;)

0
wasiu napisał(a)

Kolego, wazna rada: Nigdy nie buduj sql'i w taki sposob jak to zrobiles. Jesli masz jakies parametry w zapytaniu uzyj parametrow! Przez takie zapytanie jak Twoje ktos moze np przez strone skasowac Ci cala baze.

Oczywiście masz racje :) już któraś osoba mi o tym mówi. na razie robię wersję roboczą programu i tak mi jest szybciej. A co do kasowania "przez stronę..." nie wiem co miałes dokładnie na myśli, ale będzie to aplikacja okienkowa WinForms nie wymagajaca połączenia internetowego do działania, baza znajduje się w pliku na komputerze ;)

0

No to przez win forme mialo byc ;) Za duzo pracuje ostatnio w asp.net :P Jednak warto nabrac przyzwyczajenia i uzywac parametrow. To cale 2 linijki wiecej :)

0

Dr = cmd.ExecuteReader();

                while (Dr.Read())
                {
                    string costam = (Dr[0].ToString());

                    IDZawodnika = System.Int32.Parse(costam);
                }
IDZawodnika = (int)cmd.ExecuteScalar();

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