Stworzenie i wyświetlenie UserControl w TreeViev

0

Cześć !

Pobieram informacje z bazy o systemach i urządzeniach w danym systemie. I wyświetlam drzewo.

Wygląda to tak:

System 1:

  • urządzenie A
  • urządzenie B
  • urządzenie C
  • urządzenie D
  • urządzenie E
  • urządzenie F

System 2:

  • urządzenie A
  • urządzenie B
  • urządzenie C

System 3:
itd.

Dla danego urządzenia muszę stworzyć Usercontrol i wyświetlić po kliknięciu np. "Urządzenie 1".

Chodzi mi o to że każde urządzenie w drzewie ma swoje właściwości pobrane z bazy. Muszę teraz zrobić tak aby użytkownikowi po kliknięciu w poszczególne urządzenie wyświetlały się inf. o urządzeniu.

Pobieram inf. z bazy o systemach i rządzeniach.
Uzupełniam drzewo.

 
 foreach(var systemy in systemy_lista)
           {
               if (systemy.sieci != null)
               {
                  treeView1.Nodes.Add(systemy.sieci.Trim());
               }
           }

        
             for (i = 0; i < treeView1.Nodes.Count; i++)
            {
                foreach (var urzadzenia in urzadzenia_lista)
                {
                    if (urzadzenia.urzadzenia_w_sieci.Trim() == treeView1.Nodes[i].Text)
                        treeView1.Nodes[i].Nodes.Add(urzadzenia.nazwa_rzadzenia.Trim());
                }
            }

Tworzę sobie UserControl.

Mam

 
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {

          }

I muszę po kliknięciu w dane urządzenie wyświetlić inf. dla danego urządzenia/

0

muszę przyznać, że bardzo ładne drzewo wyświetlasz...

0

Z tego co zrozumialem, to masz jakas tam liste (czy tam drzewo, whtever) stringow (nazwa urzadzenia) i po kliknieciu konkretnego urzadzenia chcesz zostac przekierowany na jakiegos userControla, gdzie beda wyswietlone jakies szczegoly urzadzenia, ktore wybrales?

I jeszcze taki maly, nc nie znaczacy szczegol;) W jakiej technologii piszesz? Wpf/Winforms?

0

Dokładnie... Piszę w WinForms

0

Mozna chyba zrobic tak, ze w propertiesie Tag konkretnego noda mozna przechowywac referencje to obiektu "pod spodem". W zdarzeniu nodeMouseClick sprawdzasz, w ktorego noda kliknales (chyba e.Node?) i wstrzykujesz ten obiekt do userControla ktory sobie stworzyles (ewentualnie tworzysz userControla w tym evencie). Nie korzystalem z winforms juz jakis czas i to rozwiazanie prawdopodobnie nie jest ani eleganckie ani ładne, ale pewnie zadziala;p

0

Znalazłem coś takiego http://www.c-sharpcorner.com/UploadFile/17e8f6/treeview-and-wpf-user-control-in-wpf/
Mam problem z przystosowaniem tego do WF.

1

Jak nie znasz wpfa (a skoro piszesz w WF to zgaduje, ze nie;p), to truno bedzie przeniesc. Lepiej napisac od poczatku w formsach. Zakladam, ze jak dane o urzadzenia czytasz z bazy to je jakos ladnie opakowywujesz w obiekty i masz gdzies gotową liste modeli? Druga sprawa to drzewko. Jesli masz gotowe i wszystko dziala, to jedyne, co musisz zrobic to dodać referencje to obiektu urzadzenia do wlasciwosci TreeNode.Tag. Tag jest typu object, wiec mysle, ze mozna tak zrobic. Jak to juz bedziesz mial, to przejsc do zaprojektowania sobie userControla. W Visualu klikasz prawym->add->user control. Wrzucasz jakies swoje kontrolki na tego usercontrola i budujesz calosc. Po zbudowaniu powinna Ci sie ta nowa kontrolka pokazac w toolboxie, mozna jej uzywac jak kazdej innej kontrolki. Jak juz to wszystko zrobisz, to tego usercontrola wrzucasz sobie na swoja glowna forme (czy gdziekolwiek chcesz). Ostatnia rzeczą jaka trzeba zrobic jest komunikacja z tym usercontrolem. Mozna zrobic np tak, ze zrobisz w niej publiczna metode typu LoadModel(Devicemodel dev), i wywolasz sobie w zdarzeniu OnNodeClick, przekazujac to, co siedzi w Tagu kliknietego noda (ten model skojarzony z nodem). W metodzie LoadModel natomiast (juz po stronie userControl - wiadomo), powkladasz sobie te propertiesy z parametry Device w odpowiednie kontrolki w userControl.

0

Wielkie dzięki za zainteresowanie... Mam jednak kilka pytań.

FakeAccount napisał(a):

Zakladam, ze jak dane o urzadzenia czytasz z bazy to je jakos ladnie opakowywujesz w obiekty i masz gdzies gotową liste modeli?

Tak, mam listę modeli z właściwościami

FakeAccount napisał(a):

Jesli masz gotowe i wszystko dziala

Tak mam i działa

FakeAccount napisał(a):

wszystko dziala, to jedyne, co musisz zrobic to dodać referencje to obiektu urzadzenia do wlasciwosci TreeNode.Tag.

no właśnie nie wiem jak to ugryźć...

FakeAccount napisał(a):

zaprojektowania sobie userControla. W Visualu klikasz prawym->add->user control. Wrzucasz jakies swoje kontrolki na tego usercontrola i budujesz calosc. Po zbudowaniu powinna Ci sie ta nowa kontrolka pokazac w toolboxie, mozna jej uzywac jak kazdej innej kontrolki. Jak juz to wszystko zrobisz, to tego usercontrola wrzucasz sobie na swoja glowna forme (czy gdziekolwiek chcesz).

Mam zrobione UC

FakeAccount napisał(a):

Ostatnia rzeczą jaka trzeba zrobic jest komunikacja z tym usercontrolem. Mozna zrobic np tak, ze zrobisz w niej publiczna metode typu LoadModel(Devicemodel dev), i wywolasz sobie w zdarzeniu OnNodeClick, przekazujac to, co siedzi w Tagu kliknietego noda (ten model skojarzony z nodem). W metodzie LoadModel natomiast (juz po stronie userControl - wiadomo), powkladasz sobie te propertiesy z parametry Device w odpowiednie kontrolki w userControl.

Nie bardzo wiem jak to zrobić...

Czy mógłbyś podać przykład bo nie mogę załapać jak zrobić te 2 rzeczy...

1

Co do pierwszego, to chodzi o to, ze to drzewko to jest po prostu struktura zlozona z pojedynczych nodów. pÓÓÓÓki co, na nodize ustawiasz tylko to, co chcesz wyswietlic (Device.Name, czy cos takiego). W tym miejscu gdize do noda wpisujesz name, wpisz jeszcze do propertiesa Tag caly obiekt urzadzenia, mniej wiecej tak:

treeView1.Nodes[1].Tag = myDeviceList[2]

.

Co do drugiego pytania, to tutaj masz do zrobienia klika rzeczy. Po piersze zrob publiczna metode w klasie tej Twojej userControl. Metoda powinna przyjac obiekt typu Device (to ta Twoja klasa przechowywujaca info o urzadzeniach - nazwa nie ma znaczenia, wpisz sobie dowolna). W metodzie powinienes te informacje o urzadzeniach powrzucac sobie w odpowiednie miejsca. Np zakladajac, ze na userControlu masz 2 textBoxy: tbId i tbFullName i odpowiednio w modelu masz te pola, to tutaj je sobie przepisujesz (np tbFullName = model.FullName).
Majac gotowa ta metode w klasie UC, mozesz ja sobie odpalic np tak:

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            var currentModel = e.Node.Tag;
            myUserControl.LoadModel(currentModel); //to mozna jedna linijka, chcialem tylko, zebys zobaczyl o co chodzi
        }
0

Mam problem:

Dodaje to drzewa systemy i urządzenia w systemach tak jak w 1 poście.

W zdarzeniu treeView1_NodeMouseClick przekazuje obiekt do metody, która miała by mi wyświetlić UserControl z danymi ale mam problem...


   public static List<urzadzenia> urzadzenia_lista = new List<wszystko>();

  private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {

            for (int i = 0; i < treeView1.Nodes.Count; i++)  
            {
                foreach (var test in urzadzenia_lista) // (mój obiekt klasy)
                {
                    if (test.urzadzenia_w_sieci.Trim() == treeView1.Nodes[i].Text && test.nazwa_urzadzenia == e.Node.Text) // najpierw sprawdzam nazwę sieci a potem czy takie urządzeni jest
                    {
                        WyswietlDane(test); // przekazuje obiekt do metody wyświetlenia danych
                    }
                }

            }


 public void WyswietlDane(object device)
        {
          
    

        }

 

Problem w tym, że obiekt posiada wszystkie inf. urządzenia, które zostało kliknięte w drzewie ale nie mogę wyciągnąć z obiektu tych właściwości.
Lista posiada właściwości takie jak: nazwa, urządzenie w scieci, czas pracy, predkośc itd.

Jak wyciągnąć inf. z obiektu aby wyświetlić konkretną inf. np. w textbox'ie lub jak zrobić to lepiej.

1
adam_c napisał(a):

   public static List<urzadzenia> urzadzenia_lista = new List<wszystko>();
 

To jest jakiś WTF...

  1. Jakiego typu obiekty docelowo siedza w tej liscie?
  2. Nie uzywaj polskich nazw w kodowaniu
  3. Trzeba rozrozniac liczbe pojedyncza od mnogiej, pojedynczy obiekt przechowujacy dane o urzadzeniu powinien byc klasy Urzadzenie, a nie Urzadzenia - oczywsicie nazwy powinny byc po angielsku
  4. polecam stosowanie konwencji, wg ktorej publiczne fieldy/propertiesy/metody zaczynasz z duzej, prywatne z malej, dodatkowo fajniejSieCzytaCamelCase niz_podkreslenia_w_kodzie
  5. Co to w ogóle jest za klasa wszystko i po co ona jest potrzebna?

Odpowiadajac na pytanie, ja tu widze potrzebe zrobienia klasy DeviceDescription, ktora bedzie takim workiem na rozne informacje o urzadzeniu. Czyli lista takich obiektow powinna wygladac tak:

public List<DeviceDescription> AllDevices = new List<DeviceDescription>();

I metoda WyswietlDane bedzie wtedy wygladac tak:

public void WyswietlDane(DeviceDescription device)
        {
            textBox1.Text = device.Name;
            textBox2.Text = device.Category;
            checkBox1.Checked = Device.IsActive; 
            //itd
        }
0

To nie WTF tylko pomyłka... Często robiąc projekt mam otwarty drugi w którym sprawdzam sobie rozwiązania aby nie namieszać w tym głównym. Robię tak dlatego, że jestem początkujący...

ad.1 int lub string

ad.2 - 4 OK, dzięki za uwagi. Znów czegoś nowego się nauczyłem

ad. 5 Tak jak pisałem wcześniej to jest "klasa testowa" :)

Dzięki za informacje i cenne uwagi.

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