Problem z comboboxem

0

Witam,
piszę program, w którym znajduje się moduł w którym po wybraniu odpowiedniej wartości z comboboxa(DropDownList) wyświetla się jakiś mały obrazek. Do comboboxa podpięte są dane z tabeli, a konkretnie adresy IP i teraz chodzi mi o to, żeby po wybraniu z comboboxa np wartości '192.168.1.1' wyświetlał mi się "przypisany" do niego obrazek. Dodam, że nie bardzo mogę użyć selectedIndex gdyż do końca nie wiem w jakiej kolejności będą wprowadzane te adresy IP przez osobę, która będzie obsługiwała ten program.
Bardzo prosiłbym o Waszą pomoc.

0

Ale z czym konkretnie masz problem?
Z wyświetlaniem obrazka/zdarzeniem wybrania opcji w comboboxie ?
Konkretniej napisz.
zdarzenie SelectedIndexChanged
comboBox1.SelectedItem.ToString(); dostajesz numer IP, potem sprawdzasz jaki obrazek jest przypisany do tego numeru.

0

No więc tak adres IP przechowuje w bazie jako tekst. Wartości z tej kolumny w bazie mam podpięte do comboboxa. Oprócz tego mam jeden obrazek(można powiedzieć, że mapę) w formie, który jest widoczny, a na nim po przez malutkie obrazki są oznaczone punkty na tej mapie. Są one przy uruchomieniu niewidoczne, dopiero po wybraniu konkretnej wartości z comboboxa ma się wyświetlić dany obrazek. W procedurze przypisanej do comboboxa chciałbym ustawić, że jeśli dany adres został wybrany to ma się uwidocznić konkretny obrazek, mam to ustawione poprzez ustawienie obrazek.visible, i teraz kombinuje, żeby ta procedurka była uniwersalna, bo nie wiem w jakiej kolejności będą wklepywane w wersji finalnej te adresy, a zależy mi na tym tak jak już wspomniałem żeby po wybraniu np adresu 192.168.1.1 uwidocznił się dany obrazek. Wiem jak poustawiać żeby się visible odpowiednich obrazków zmieniało, tylko nie wiem jakiej komendy użyć by sczytało adres z combo i w zależności jakim adresem byłby to wyświetlałoby dany obrazek.

Starałem się wytłumaczyć jak najbardziej zrozumiale..

edit: albo zamiast tej zmiany widoczności, jak zrobić, żeby nie było tyle tych obrazków tylko, żeby był jeden i żeby on po wybraniu, którejś z opcji przemieszczał się pod wskazane miejsce?

1

Nie w 100% rozumiem o co ci chodzi, ale coś tam zrozumiałem (chyba ;))

No więc combobox przechowuje z tego co pamiętam, swoje 'itemy' jako tablica obiektów (czy też Combodox.ItemCollection... w każdym razie obiektów). W pierwszym przypadku możesz do comboboxa wprowadzać w zależności od wartości IP w bazie obrazki (obrazki = klasa = typ referencyjny) i zależnie od klikania zmieniać visible na true a reszcie na false(*). W drugim możesz wprowadzać Pointy i zmieniać lokację obrazka w zależności od klikniętego itemu.

    • nie widzę twojego kodu, ale pomysł na to żeby przechowywać na formie obrazki i zmieniać ich visible tak żeby tylko jeden + tło (a tyle zrozumiałem) był widoczny nie jest zbyt szczęśliwy... :/ Lepiej by było (IMVHO) używać jednego obrazka - bufora na który renderowałbyś wybrany pozostały... To by rozwiązało wszystkie problemy i byłoby 100% uniwersalne... Ale to trochę bardziej skomplikowane.
0

No więc mam to mniej więcej tak zrobione(wiem, że to jest "trochę" topornie zrobione, z tym, że to "cbAdres.Text == "192.168.1.2"" nie działa:/)
pOp1 itd to są poszczególne obrazki

  if (cbAdres.Text == "192.168.1.2")
                {
                    //peryferia
                    pOp1.Visible = true;
                    pOp2.Visible = false;
                    pOp3.Visible = false;

                    //serwer
                    pOS1.Visible = false;
                    pOS2.Visible = false;
                    //router
                    pOr.Visible = false;
                    //MECHANICY
                    pOm1.Visible = false;
                    pOm2.Visible = false;
                    pOm3.Visible = false;
                    pOm4.Visible = false;
                    pOm5.Visible = false;
                    //PRODUKCJA
                    pOpr1.Visible = false;
                    pOpr2.Visible = false;
                    pOpr3.Visible = false;
                    pOpr4.Visible = false;
                    pOpr5.Visible = false;
                    //HANDEL
                    pOh1.Visible = false;
                    pOh2.Visible = false;
                    pOh3.Visible = false;
                    pOh4.Visible = false;
                    pOh5.Visible = false;
                    //TKT
                    pOt1.Visible = false;
                    pOt2.Visible = false;
                    pOt3.Visible = false;
                    pOt4.Visible = false;
                    pOt5.Visible = false;
                    //biuro
                    pOb1.Visible = false;
                    pOb2.Visible = false;
                    pOb3.Visible = false;
                    pOb4.Visible = false;
                    pOb5.Visible = false;
                }
                else//192.168.1.3
                    if (cbAdres.Text == "192.168.1.3")

próbowałem zrobić dla jednego obrazka takie coś ze zmianą jego lokalizacją (ale nie działało):

pOp1.Location.X = 458;
pOp1.Location.Y = 100;
0

jak MSM napisał jeżeli obrazek jest taki sam możesz uzywac tylko jednego i zmieniać jego położenie. Działanie jest naprawdę prostę.

w comboboxie masz stringi ;) (adresy)

dodajesz zdarzenie dla comboboxa SelectedIndexChanged

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string dany_adres = comboBox1.SelectedItem.ToString();
        narysuj_punkt_na_podstawie_adresu(dany_adres);

    }
    void narysuj_punkt_na_podstawie_adresu(string adres)
    {            
        if (adres == "192.168.0.1")
        {
            pictureBox1.Location = new Point(100, 190);
        }
    }

Coś na ten wzór będzie najprościej.

Edit: więc cbAdres.Text nie wynosi tyle co w warunku. Może wyślij więcej x) Gdzie wywołujesz co to wyżej wysłałeś, może w nieodpowiednim miejscu?

0

ten kod co umieściłem wyżej mam wpisany w metodzie :

private void cbAdres_SelectedIndexChanged(object sender, EventArgs e)
{
   if (...
}

a tą metodę do comboboxa w którym wybieram dany adres :)

Dziękuję, za dotychczasowe rady, spróbuje ten wasz sposób :)

0

ewentualnie wstaw breakpointa gdzieś i zobacz jaką wartość ma cbAdres.Text że nie wykonuje Ci się to co w IF-ie

0

oki dzięki, spróbuje i dam znać co z tego wynikło:)

0

sprawdziłem i za każdym razem mam przypisane : System.Data.DataRowView ale nie mam pojęcia dlaczego:/

1

Bo jest przypisany do bazy danych, jak sam pisałeś?... Sprawdź bazę danych.

0

Z tego co zauważyłem to działa przemieszczanie obrazka gdy w ifie dam np. combobox1.SelectedIndex == 0
, natomiast jak dam combobox1.SelectedItem == "192.168.1.1" to nie działa :/ wie ktoś dlaczego??

Dodam, że sprawdzałem: combobox1.SelectedItem.ToString(); i wyswietlalo mi 192.168.1.1

1

? nie wiem. A, (tradycyjnie) coś więcej kodu?

0

sorki za ten brak kodu, już nadrabiam

no więc mam tak


//dane podpięte pd comboboxa 

                cbAdresIP.DataSource = bs; //bs  to moje bindingSource
                cbAdresIP.ValueMember = "Adres_IP";
                cbAdresIP.DisplayMember = "Adres_IP";


//to jest event dla mojego comboboxa (cbAdresIP)
        private void cbAdresIP_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbAdresIP.SelectedItem.ToString() == "192.168.1.1")
            {
                pOp1.Visible = true;
                pOp1.Location = new Point(673, 254);
            }
        }

w bazie mam kilka adresów w tym 192.168.1.1 więc wydaje mi się, że powinno działać, chyba, że zły event wykorzystuje?

0
if (cbAdresIP.SelectedItem.ToString() == "192.168.1.1")

ten warunek powinien działać poprawnie, byćmoże na końcu ciagu w comboboxie zaplątała Ci się jakaś spacja?

Jeżeli obrazek ma sie wyswietlać po wybraniu pozycji z comboboxa, to ten event zdaje się najlepszym z możliwych.

0

hmmm..sprawdzałem ze spacją też nie działa:/

chciałem się teraz upewnić co jest w cbAdresIP.SelectedItem.ToString();

podpięłem to pod label1.Text = cbAdresIP.SelectedItem.ToString(); i wyświetla mi System.Data.DataRow.View:/

gdzie wartości do combo mam przypisane w ten sposób:

   cbAdresIP.DataSource = bs;
                cbAdresIP.ValueMember = "Adres_IP";
                cbAdresIP.DisplayMember = "Adres_IP";

może źle mam podpiętego tego combo?

EDIT: Nie ma nikogo, kto by mi pomógł rozwiązać mój problem?

0

IP z bazy wyświetlają Ci się normalnie w cb? Tzn. czy samo podpięcie dobrze działa?

0

cbAdresIP.SelectedItem - SeclectedItem jest klasy Object, czyli jego metoda .ToString() będzie zwracać raczej jedynie nazwe klasy, więc pewnie potrzebne jest rzutowanie, ale pewny nie jestem :)

w necie znalazłem taki sposób, ale nie mam jak go wypróbować, czy działa
String value=((System.Data.DataRowView)cbAdresIP.SelectedValue).Row.ItemArray[0].ToString();
napisz czy działa :)

a tego co też udało mi się wyczytać to ComboBox, to przy stylu DropDownList nie można skorzystać z właściwości .Text...

0

tak pobieranie z bazy dobrze działa bo w combooxie prawidłowe dane wyświetla. Teraz chwilowo muszę wyjść, jak wrócę to przetestuje i dam znać ;)

EDIT: Problem rozwiązany :D po prostu combobox dodał mi dwie spacje więcej , niż się spodziewałem,na końcu tekstu :) dziękuję wszystkim za zainteresowanie i pomoc:)

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