Pobranie wartości z Combobox-a

0

Mam następujący problem. Mam dwie tabele, jedna pracownik (id, imie, nazwisko), druga zasob (id, idPrac, nazwa). W Windows Form dodałem combobox-a i zapełniłem go danymi z tabeli pracownika za pomocą kodu:

MySqlConnection^ polaczenie = gcnew MySqlConnection(konfiguracja);
MySqlCommand^ zapytanie = gcnew MySqlCommand("SELECT id, imie, nazwisko FROM Pracownicy ORDER BY nazwisko;", polaczenie);

try
{
	MySqlDataAdapter^ wynik = gcnew MySqlDataAdapter();
	wynik->SelectCommand = zapytanie;
	DataTable^ tabela = gcnew DataTable();
	wynik->Fill(tabela);

	comboBox->Items->Clear();

	for each (DataRow^ dr in tabela->Rows)
	{

		comboBox->Items->Add(dr["imie"] + " " + dr["nazwisko"]).ToString();
	}

		polaczenie->Close();

	}
	catch (Exception^ komunikat)
	{
		MessageBox::Show(komunikat->Message);
	}
}

Chciałbym pobrać id pracownika dla wybranej pozycji comboboxa i użyć go w poleceniu insert dla innej tabeli (w celu stworzenia określonej relacji). Kombinowałem na różne sposoby, ale nie mogę tego ogarnąć. Czy ktoś wie jak to zrobić?

0
ref struct Pracownik
{
	String ^imie, ^nazwisko;
	int id;
	Pracownik(String ^imie, String ^nazwisko, int id)
		: imie(imie)
		, nazwisko(nazwisko)
		, id(id)
	{
	}
	virtual String^ ToString() override
	{
		return imie + " " + nazwisko;
	}
};

...

comboBox->Items->Clear();
comboBox->ValueMember = "id";
for each (DataRow^ dr in tabela->Rows)
{
    auto p = gcnew Pracownik(dr["imie"], dr["nazwisko"], dr["id"]);
    comboBox->Items->Add(p);
}

...

int id = (int)(comboBox->SelectedValue);

Coś tego typu. Nie sprawdzane. Zakładam że id jest intem.

0

Trochę źle przedstawiłem mój problem. Combobox zasiliłem tak jak pisałem i wszystko ładnie się wyświetla. W ComboBoxie, nie chcę mieć wyświetlanego id-a pracownika, jedynie imię i nazwisko (to mi działa). Dla testów umieściłem również na liście id-a. Potrzebuję pobrać wartość idPrac (nie wyświetlonego) z ComboBox-a i przekazać ją do funkcji, która zostanie wykonana po naciśnięciu buttona. Funkcja umieszczająca w bazie:

MySqlConnection^ polaczenie = gcnew MySqlConnection(konfiguracja);
MySqlCommand^ polecenie = polaczenie->CreateCommand();
MySqlTransaction^ transakcja;
polaczenie->Open();

transakcja = polaczenie->BeginTransaction(IsolationLevel::ReadCommitted);

polecenie->Connection = polaczenie;
polecenie->Transaction = transakcja;

try
{
	polecenie->CommandText = "INSERT INTO zasob SET zasob.idPrac = " + ... + " ";
	polecenie->ExecuteNonQuery();
	transakcja->Commit();


}
catch (Exception^ komunikat)
{
	MessageBox::Show(komunikat->Message);
	transakcja->Rollback();
}
polaczenie->Close();

W założeniu funkcja pobierze wartość idPrac z Combobox-a po wywołaniu w Comboxie zdarzenia: SelectedIndexChanged

0

Próbowałeś chociaż zrozumieć mój kod? Nigdzie w nim nie ma wyświetlania id pracownika.

0

Oczywiście, że tak, spędziłem nad tym problemem kilka dobrych dni analizując materiały w internecie, czy filmy na YT, dopiero wówczas zdecydowałem się napisać na tym forum. Dopiero się jednak uczę i dlatego nie wszystko ogarniam i wiele rzeczy mi jeszcze umyka. Co do Twojego kodu, to czy ta pętla nie wypełnia combobox-a damymi, czyli imię, nazwisko oraz id?

for each (DataRow^ dr in tabela->Rows)
{
    auto p = gcnew Pracownik(dr["imie"], dr["nazwisko"], dr["id"]);
    comboBox->Items->Add(p);
}

Jak sprawdzałem, czy mi pobiera wartość z tabeli w bazie danych używałem polecenia:

comboBox->Items->Add(dr["idPrac"] + " " + dr["imie"] + " " + dr["nazwisko"]).ToString();

Przy innym Comboboxie, gdzie miałem zawartość w postaci 1A,1B, 1C, 2A, 2B itd wykorzystałem właściwość combobox->Text i porównywałem je w zapytaniu z wartością w tabeli:

insert into ... id = (SELECT tabela.id FROM tabela WHERE symbol = '" + combobox ->Text + "');

Niestety w przypadku imion i nazwisk to się nie sprawdza, ponieważ często się powielają.

1

ComboBox osobno przechowuje wartość (SelectedValue) i tekst.
Poczytaj co robi SelectedValue i ValueMember.
Możesz wyświetlać w ComboBoxie dowolny tekst a pod spodem mieć id-ki.

1

Dzięki Azarien, to mi było potrzebne.

Dla zainteresowanych zrobiłem tak:

MySqlDataAdapter^ wynik = gcnew MySqlDataAdapter();
wynik->SelectCommand = zapytanie;
			
DataTable^ tabela = gcnew DataTable();
wynik->Fill(tabela);

comboBox->DisplayMember = "Pracownik";
comboBox->ValueMember = "idPrac";
comboBox->DataSource = tabela;

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