Przykrycie nazwy inną nazwą w combo box

0

Witam,
Czy można w szybki sposób rzutować nazwy w combobox, tak żeby użytkownik widział co innego, a co innego przetwarzało się w tle aplikacji?
Wyciągam do comboboxa z bazy danych pewne dane, są one w nieprzyjaznym dla użytkownika języku (dest1, dest2 itp.), chciałbym żeby wyświetlane były jako np. hamburger, laptop itp.
dane wyciągam z tak:

string sqlQueryType = "select distinct typ from tabela";
command = new SqlCommand(sqlQueryType, sqlConn);
reader = command.ExecuteReader();
while (reader.Read())
            {
                comboBox.Items.Add(reader.GetString(0));                
            } 

tym sposobem mamy rozwijane combo z dest1,dest2, a chcę mieć hamburger, laptop

użytkownik zaznacza np. laptop, ale w dalszej części aplikacji znów jego zaznaczenie

comboBox3.SelectedItem 

ma być "dest1, dest2", bo wrzucam je do zapytania wyszukującego w bazie

1

Istnieje taka mozliwosc. Metoda Add, ktora uzywasz do dodawania elementow w comboBoxie przyjmuje parametr typu object, oznacza to ze mozesz tam umiescic nie tylko stringi ale dane o dowolnym typie.

Pierwsza opcja jest utworzenie sobie klasy, np. ComboBoxItem (byc moze juz taka istnieje w .NET) ktora bedzie przechowywac zarowno tekst, ktory bedziesz wyswietlal jak i interesujaca Cie wartosc z bazy danych. Przeciazysz w takiej klasie metode ToString aby zwrocila tekst przyjazny dla uzytkownika i sprawa zalatwiona. Przyklad klasy ComboBoxItem:

 
public class ComboBoxItem
{
	private string itemTitle;
	private string itemValue;

	public ComboBoxItem(string title, string value)
	{
		this.Title = title;
		this.Value = value;
	}

	public string Title
	{
		get { return this.itemTitle; }
		set { this.itemTitle = value; }
	}

	public string Value
	{
		get { return this.itemValue; }
		set { this.itemValue = value; }
	}

	public override string ToString()
	{
		return this.Title;
	}
}

Dodawanie elementow:

 
comboBox.Items.Add(new ComboBoxItem("Laptop", "dest1"));

Pobieranie elementow

 
ComboBoxItem item = (ComboBoxItem)comboBox.Items[0];
string title = item.Title; //wartosc wyswietlana
string dbValue = item.Value; //wartosc w bazie;

Sposob drugi polega na wykorzystaniu elementu KeyValuePair w nastepujacy sposob:

Dodawanie elementow:

 
comboBox.DisplayMember = "Value"; // wywolac tylko raz
comboBox.Items.Add(new KeyValuePair<string, string>("dest1", "Laptop"));

Pobieranie elementow

 
KeyValuePair<string, string> item =(KeyValuePair<string, string>)comboBox.Items[0];
string title = item.Value; //wartosc wyswietlana
string dbValue = item.Key; //wartosc w bazie;

Przyjalem ze zarowno tekst wyswietlany jak i wartosc z bazy danych sa stringami. Mozesz oczywiscie dopasowac rozwiazanie do swoich potrzeb, zmienic typy, uzyc typow generycznych itp. itd. To tylko idea.

2

Najwygodniej jest chyba używać BindingSource jako źródła danych do ComboBoxa uzupełnianego obiektami jakie tylko chcemy i ustawianie DisplayMember i ValueMember na odpowiednie właściwości tych obiektów. Nie trzeba pisać do tego dodatkowych klas, a całość jest banalnie wyklikiwalna w designerze.

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