kako u combobox-u prikazati dve i vise kolona (vs2015 c#6 i mzsql 5.7)

Radomi Mihajlovic

Zainteresovan član
Poruka
104
Molim ako neko moze da mi pomogne kako da u data tabeli koju povezujem sa comboboxom (moze i u list boxu ili text boxu nebitno) da combobox prikaze dve kolone. Korisim VS2015 c# 6.0 i MySql 5.7. Nisam nigde pronasao odgovor na netu a da to resenje proradi kod mene.
U prilogu je deo koda. Da napomenem sve sam u propertiju postavio vezano za combobox. Evo del programa

private void comboBox1_Click(object sender, EventArgs e)
{
MySqlConnection conn;
myConnectionString = pwput;
conn = new MySql.Data.MySqlClient.MySqlConnection();
conn.ConnectionString = myConnectionString;
try
{
conn.Open();
}
catch (MySqlException ex)
{
switch (ex.Number)
{
case 0:
MessageBox.Show(" NISTE USPELI DA SE KONEKTUJETE NA SERVER, ZATVORITE PROGRAM PA POKUSAJTE PONOVO");
Close();
break;
case 1042:
MessageBox.Show(" NIJE AKTIVAN SERVER, PODIGNITE SERVER PA PONOVITE KONEKTOVANJE ");
Close();
break;
}
conn.Close();
}
if (conn.State != ConnectionState.Open)
{
MessageBox.Show(" NISTE USPELI DA SE KONEKTUJETE NA SERVER\r\n ZATVORITE PROGRAM PA POKUSAJTE PONOVO \r\n");
}
else
{
AutoCompleteStringCollection kontoopis = new AutoCompleteStringCollection();
string wnadidok = "SELECT idkonto, nazivkon FROM konta";
loadingData = false;
DataTable dtkon = new DataTable();
dtkon.Columns.Add();
dtkon.Columns.Add();
MySqlDataAdapter mdkon = new MySqlDataAdapter(wnadidok, conn);
mdkon.Fill(dtkon);
loadingData = true;
comboBox1.DataSource = dtkon;
// koje polje iz tabele navedeno to prikazuje
comboBox1.DisplayMember = "idkonto";
comboBox1.ValueMember = "idkonto";
comboBox1.DisplayMember = "nazivkon";
comboBox1.ValueMember = "nazivkon";
comboBox1.SelectedIndex = -1;
comboBox1.Text = "";
loadingData = false;
}
conn.Close();
}

Hvala
 
Pa ne koristi se combobox za to, nikako. Da si u wpf-u, mogao bi da dizajniras svoju sopstvenu kontrolu za to, prilicno lako, ali u windows formi, za multicolumn prikaz koristi ListView.

Ako bas zelis da imas dva podatka u combobox-u, ne dve kolone, vec cisto da dva podatka kao informaciju prikazes, onda imas dve opcije:
1. Da ti DisplayMember bude string, komponovan od dva rezultata iz baze, ili
2. Da izmenis SQL Query, tako da u samom query-u izvrsis konkatenaciju dva rezultata iz baze, kao na sledecem primeru:

SELECT Surname+' - '+Name AS FullName FROM Users

I onda stavis da ti DisplayMember bude "FullName", i onda ces dobiti kao prikaz u combobox-u string koji sadrzi podatke iz dve kolone iz baze podataka/tabele Users: Surname i Name, prikazane u sledecem formatu: "Mihailovic - Radomir".


Mada, nikada ne treba direktno da vezes podatke iz baze za kontrolu - uvek trebas imati neku klasu koja ce ti biti provider podataka, a same podatke treba da smestis u neke entitete (objekte klasa, koje ces posebno napraviti za tu svrhu). Ako zelis dobar kod i dobar softver da pravis.
 
Poslednja izmena:
Mada, nikada ne treba direktno da vezes podatke iz baze za kontrolu - uvek trebas imati neku klasu koja ce ti biti provider podataka, a same podatke treba da smestis u neke entitete (objekte klasa, koje ces posebno napraviti za tu svrhu). Ako zelis dobar kod i dobar softver da pravis.

Hvala na ovom predlogu. Vrlo rado cu ga prihvatiti ali ja sam nesto malo odmakao od pocetnika i molim za primer gore recenog. Svakakko prihvatam sto je bolje, sigurnije i brze.
Nisam u wpf zbom xmal-a jer nisam odma knmreuo sa njim, sada mi je lakse ovako jer sam dosta usao u problem, a da krecem od pocetka nekako mi je tesko.
U svakom slucaju hvala na savetu i primer
 
Mada, nikada ne treba direktno da vezes podatke iz baze za kontrolu - uvek trebas imati neku klasu koja ce ti biti provider podataka, a same podatke treba da smestis u neke entitete (objekte klasa, koje ces posebno napraviti za tu svrhu). Ako zelis dobar kod i dobar softver da pravis.

Hvala na ovom predlogu. Vrlo rado cu ga prihvatiti ali ja sam nesto malo odmakao od pocetnika i molim za primer gore recenog. Svakakko prihvatam sto je bolje, sigurnije i brze.
Nisam u wpf zbom xmal-a jer nisam odma knmreuo sa njim, sada mi je lakse ovako jer sam dosta usao u problem, a da krecem od pocetka nekako mi je tesko.
U svakom slucaju hvala na savetu i primer

Nema na cemu.
Bas zato sto si tek pocetnik u ovome, treba da se trudis da radis stvari onako kako se rade, tzv. "best practices".
Sada si uplovio u objektno orijentisano programiranje, i moras da razmisljas na objektno-orijentisan nacin: to znaci da sve elemente tvog programa koji pravis, posmatras kao objekte. I da komponujes program kao kompoziciju puno objekata, gde svaki objekat ima svoju svrhu.
Objektom ces predstaviti podatke koje dobijas iz baze. Objekat ce ti biti podaci spremni da se upisu u bazu.
Objekat ce ti biti provajder tih podataka - koji ce objediniti manipulaciju sa bazom.
Objekat ce ti biti menadzer tih podataka. - koji ce od provajdera uzimati podatke i spremati ih za prikaz na koriscnickom interfejsu - i koji ce uzimati podatke sa interfejsa i slati ih provajderu da ih upise u bazu/ili filesystem, ili gde god treba.
Objekat je ceo tvoj interfejs, i svaki komad tvog interfejsa.
Razmisljaj objektno - to je kljuc svega.
 
Upravo to, treba razmisljati malo apstraktnije, ne razmisljati o problemu u terminima koda, vec je potrebno posmatrati iz malo drugacijeg ugla, iz ugla objekata i stvarnog sveta.
Treba razmisljati kako dekomponovati taj problem, o dizajnu i arhitekturi softvera, razdvajanju view-a od same poslovne logike, itd... :)

Kad je to poznato, lako je kasnije napisati kod, najmanji problem :)
Naravno, moguce je i ne postovati sve ovo, i onda stvoriti sebi glavobolju kad projekat postane slozeniji, i kad bude morao da se modifikuje :)
 
hvala na savetima ali ne shvatam bas sve jasno, znam ponesto o objekima tj. da su sto manji/kraci.
Pa vas zao molim dajte mi konkretan primer napisite mi objekete za moj gornji slucaj kako vi to vidite
kako bi mi bilo jos jasnije. Molim napisite mi pomenute objekte u gornjem kontekstu. takodje milim preporucite mi neku knjigu na srpskom, jer se malo teze snalazim sa engleskim
Hvala puno
 
Prva knjiga, koju svima preporucujem, je "Objektno orijentisani nacin misljenja": http://www.delfi.rs/knjige/108420_objektno_orijentisani_nacin_misljenja_knjiga_delfi_knjizare.html
Zatim, imas odlicnu knjigu/zbirku sa ETF-a, od Lasla Krausa, za C#: https://www.korisnaknjiga.com/reseni-zadaci-iz-programskog-jezika-c-naslov-11040
Kroz tu zbirku ces provezbati zadatke koji ce ti biti sasvim dovoljni da ukapiras osnove objektno orijentisanog programiranja.

Mogu ti ja ovde pisati i pricati do ujutru, ali veruj mi, najbolje je da procitas tu prvu knjigu, da shvatis koncepte, a onda da provezbas zadatke iz Krausove zbirke, i veruj mi, otvorice ti se potpuno novi vidici u vezi programiranja - poceces drugim ocima da gledas na probleme, i pisanje programa ce ti biti kao igra :)

P.S.
Posalji, molim te, screenshot tvog solution explorer-a VS-a, sa vidljivim (expanded) svim projektima, komponentama, klasama.......zanima me kako si postavio projekat.
 
Poslednja izmena:
Nema na cemu.
Bas zato sto si tek pocetnik u ovome, treba da se trudis da radis stvari onako kako se rade, tzv. "best practices".
Sada si uplovio u objektno orijentisano programiranje, i moras da razmisljas na objektno-orijentisan nacin: to znaci da sve elemente tvog programa koji pravis, posmatras kao objekte. I da komponujes program kao kompoziciju puno objekata, gde svaki objekat ima svoju svrhu.
Objektom ces predstaviti podatke koje dobijas iz baze. Objekat ce ti biti podaci spremni da se upisu u bazu.
Objekat ce ti biti provajder tih podataka - koji ce objediniti manipulaciju sa bazom.
Objekat ce ti biti menadzer tih podataka. - koji ce od provajdera uzimati podatke i spremati ih za prikaz na koriscnickom interfejsu - i koji ce uzimati podatke sa interfejsa i slati ih provajderu da ih upise u bazu/ili filesystem, ili gde god treba.
Objekat je ceo tvoj interfejs, i svaki komad tvog interfejsa.
Razmisljaj objektno - to je kljuc svega.

Treba razmisljati u smislu interfejsa, ne objekata. Objekat je zapravo struktura podataka. Interfejs je skup f-ja koje kao prvi parametar uzimaju tu strukturu, tj rade nad tim objektima. To omogucava da se razmislja apstraktnije zato sto kod sa vece
visine moze da ne ulazi u detalje o kojim se objektima zapravo radi. Znaci definisanjem protokola, tj operacijama koje se rade nad objektima dolazimo do onoga sto razdvaja genericki kod od konkretne implementacije.
 
Treba razmisljati u smislu interfejsa, ne objekata. Objekat je zapravo struktura podataka. Interfejs je skup f-ja koje kao prvi parametar uzimaju tu strukturu, tj rade nad tim objektima. To omogucava da se razmislja apstraktnije zato sto kod sa vece
visine moze da ne ulazi u detalje o kojim se objektima zapravo radi. Znaci definisanjem protokola, tj operacijama koje se rade nad objektima dolazimo do onoga sto razdvaja genericki kod od konkretne implementacije.

100% si u pravu, ali covek je totalni pocetnik u OOP-u, tako da treba ga polako uvesti u celu pricu, da vidi prvo kako da na nizem nivou apstrakcije razmislja, da nauci uopste kako da koristi objekte, pa tek onda ce moci da razume neke apstraktnije stvari.
Korak po korak ;)
 
Poslednja izmena:
Hvala na popmoci. Onih knjiga vise nema rasprodate su. Ja sam se zainteresovao za CET -ovu knjigu C# 6 i NET CORE 1,0. Ocekujem vase misljenje.

SELECT Surname+' - '+Name AS FullName FROM Users

I onda stavis da ti DisplayMember bude "FullName", i onda ces dobiti kao prikaz u combobox-u string koji sadrzi podatke iz dve kolone iz baze podataka/tabele Users: Surname i Name, prikazane u sledecem formatu: "Mihailovic - Radomir".

Ovo kod mene radi po starom ovako prikazuje mi naziv konta, a kada postavim "SELECT nazivkon+' - '+idkonto AS FullName FROM konta'; prikazuje samo konta bez naziva konta.

Imam problem pri konekciji na mysql. Kada u Server Explorer / Data Connection dodam konekciju sa Add Connection izaberem Data Source MySql Database i postavim
server name : lpcalhost User name : root Password :root i kliknem na Test Connection dobijem poruku Test Connection succeeded ali nastane problem kada pritisnem OK dugme dobijam poruku o gresci :

Save view failed with following error
Microsoft.VSDesigner.Server Explorer.Version 14.0.0.0
Culture = neutral,PublicKeyToken=xxxxxxxxxx is not marked es serializable

Moram da napomenem da VS2015 Enterprise nije original
Bez obzira na gornju poruku o gresci pojave se sve tabele u Data Connection sa poljima i podacima u njima.

Ako imate ideju hvala
 
Vidi, jako je komplikovano da ti pomazem da resis problem, kada ga od starta resavas na nacin na koji se ne resava.

Da bi se uspesno konektovao na bazu podataka, potreban ti je samo ispravan connection string, nista drugo! Nemas uopste potrebu da koristis Server Explorer za to.
Ako zelis da iz pocetka uradis, rado cu ti pomoci i objasniti kako da to lepo napravis. Ovako, sta god da uradimo, sa ovakvom postavkom, nece valjati.
 
1. Kreiras klasu, koja ce ti predstavljati podatke koje imas u bazi. Na primer, u bazi podataka imas tabelu USER, sa kolonama ID, FIRSTNAME, LASTNAME. Kreiraces klasu:

public class User
{
public string Id {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
public string FullName {get; set;}
}

Zatim ces dovuci podatke iz baze podataka i strpati ih u listu objekata tvoje klase:

connection.Open();

List<User> dbUsers = new List<User>();

string query = "SELECT * from USER"

MySqlCommand cmd = new MySqlCommand(query, connection);

MySqlDataReader dataReader = cmd.ExecuteReader();

while (dataReader.Read())
{
User user = new User();
user.Id = dataReader["ID"];
user.FirstName = dataReader["FIRSTNAME"];
user.LastName = dataReader["LASTNAME"];
user.FullName = user.FirstName + " - "+ user.LastName; // ili mozes staviti user.FullName = dataReader["FIRSTNAME"] + ' - ' + dataReader["LASTNAME"];
users.Add(user);
}

dataReader.Close();

connection.CloseConnection();

Sada imas listu objekata User, gde imas sve tvoje podatke iz baze na raspolaganju. I sada mozes da radis kako hoces. Na primer, kreiras funkciju za popunjavanje combobox-a:

public void LoadComboBox( List<User> users)
{
userComboBox.Items.Clear();
userComboBox.DataSource = users;
userComboBox.DisplayMember = "FullName"; // ime clana klase User koji zelis da ti bude prikazan. Mozes staviti sta god zelis
userComboBox.ValueMember = "Id"; // takodje, mozes staviti naziv bilo kojeg clana od klase koja ti je DataSource.
}

Ne uzimaj kod zdravo za gotovo, mozda ima sintaksnih gresaka, nisam ga kucao u nekom editoru koda, vec samo ovde.

Inace, ovo je vrlo grub prikaz kako da resis to, i daleko je jos uvek od dobrog pristupa, ali eto, resice ti tvoj trenutni problem, i uvesce te u to kako da koristis klasu u te svrhe.

Ali imaj na umu da je i ovo sto sam ti napisao izuzetno los pristup. Tako se ne radi.
 
Hvaallla puno. Ovo mi je pomoglo da resim problem i da shvatim objeke. Kako bi gledao primer sa upisivanjem podataka u dve povezane tabele preko procedure?
Jos jednom hvala puno.:D

Nema na cemu, ali konstantno imaj na umu da je ovo i dalje nepravilan pristup.

Kada radis insert podataka, ako ga radis direktno, bez koriscenja nekog framework-a, a imas situaciju sa dve povezane tabele, onda prvo utvrdi vezu izmedju njih, tj. ko je roditelj a ko dete (koja tabela sadrzi foreign key od koje tabele).
Primer:
Tabela "Title" koja sadrzi samo ID i Naziv. (Mr, Mrs, Ms.)
I tabela "Contacts", koja sadrzi "ID, TitleID", "Name", "LastName", "Email".
Recimo, zelis da uneses podatke i u jednu i u drugu odjednom, preko jedne funkcije.

1. Kreiraces klasu Contacts, koja ce ti oslikavati tvoju situaciju u bazi podataka (imace clanove koje imas i u bazi podataka).
2. Kreiraces klasu Title, koja takodje oslikava stanje u bazi podataka.
3. Kada kliknes na neku UI kontrolu da odradis insert, prvo ces da kreiras objekte tih klasa i popunis ih podacima sa UI kontrole - sa onim podacima koje imas!!!
4. Zatim vrsis insert roditelja (u ovom slucaju Title).
5. Da bi ispostovao foreign key constraint (ne mozes uneti u tabelu Contacts vrednost za TitleID koja ne postoji), a i da bi uneo ispravnu vrednost za TitleID, dovuci iz baze (ima vise nacina za to) ID od upravo unesenog podatka u tabelu Title.
6. Dodaj taj ID kao vrednost parametra TitleID objekta klase Contacts, i sada ces imati sve neophodne podatke koje treba da uneses u tabelu Contacts.
 
Shvatio sam postupak ali nisu mi jasni neki detalji. Kada budes imao vremena napisis mi kao u predhodnom primeru. Hvala

Ne mogu ti napisati kod jer ne znam kakav ti je UI, kako ti je povezan UI sa pozadinskim kodom, i ne znam milion drugih detalja.
Princip treba da ti bude vise nego dovoljan da sam napises kod, a programiranje se bas tako uci: pisanjem koda.

U sustini, iste klase koristis za kreiranje objekta u koje ces smestati ono sto procitas iz baze podataka, i ono sto ces upisati u bazu podataka - tipican Object-Relational-Model.
Imas klasu koja je provajder - koja cita iz baze u te objekte, i koristi podatke iz objekata da iz njh pise u bazu.
Imas klasu koja je manager - koja povezuje UI i koristi provajder da barata sa podacima.
 
Potrebna mi je ponovo tvoja pomoc, naravno ako imas vremena.
Imam 3 forme, Form1 poziva ili prikazuje Form2 a ova Form3. U Form1 imam textBox1 u koji zelim da prikazem neki teks koji je formiram u Form3, recimo "zdravo". Iz Form3 da se prikaze u Form1.textBox1. Ili da neki sring iz Form3 prenesem u Form1, nije problem da iz Form1 prenesem sring u Form3.Ovako prenosim iz Form1 u Form3 recimo string ali ne radi obrnuto. Hvala
Rade
 

Back
Top