Jak przesłać zmienną do formularza znajdującego się w pliku dll?

0

Dzień dobry,
Mam polecenie które wczytuje formularz znajdujący się w bibliotece DLL.

Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"raporty.dll");
Type type = assembly.GetType("raporty.szczepienia");
Form Raporcik = Activator.CreateInstance(type) as Form;
//Raporcik.MdiParent = this;
Raporcik.Show();

Teraz jak zrobić aby do formularza szczepienia znajdującego się w DLL przesłać dane znajdujące się w publicznej zmiennej ID_DOK

Oto kod kod formularza szczepienia:

 public partial class szczepienia : Form
    {
        public int ID_Dok { get; set; } = 0;
        public szczepienia()
        {
            InitializeComponent();
            
        }

1

Nie wiem czy dobrze rozumiem, masz utworzony formularz "szczepienia", który ma setter/getter więc po prostu Raporcik.ID_Dok = 666 czy tam pobierasz i tyle. Ale mam wrażenie, że chyba chodzi o coś innego, więc jak coś to rozjaśnij

3

Masz bardzo złą architekturę. Masz też fatalne nazewnictwo elementów języka:

  • nie używa w nich języka polskiego,
  • standardy określają, że nazwy zmiennych lokalnych rozpoczyna się z małej litery, metody z dużej;
  • nie używa się podkreśleń, bo to nie PHP (może z wyjątkiem początków nazw prywatnych pól);
  • nie używa się skrótów, bo.po kilku miesiącach nikt nie będzie wiedział, jak się je rozszyfrowuje.

Powinieneś takie rzeczy załatwić interfejsem, do którego dostęp ma i "wstrzykiwany" formularz, i aplikacja. Ale jeśli ten kod nie jest Twojego autorstwa i nie masz wpływu na architekturę tego rozwiązania, to masz dwa podejścia.

  1. Zamiast Form użyj dynamic (albo zrzutuj na dynamic): ((dynamic)vaccinationReport).DocumentationId = newDocumentationId;.
  2. Refleksja: vaccinationReport.GetType().GetProperty("DocumentationId").SetValue(vaccinationReport, newDocumentationId);

Żaden z tych sposobów nie jest dobry, bo nie są odporne na zmiany w formularzu. Co najwyżej możesz złapać wyjątek, ale formularz nie zadziała.

0
jarzi napisał(a):

Nie wiem czy dobrze rozumiem, masz utworzony formularz "szczepienia", który ma setter/getter więc po prostu Raporcik.ID_Dok = 666 czy tam pobierasz i tyle. Ale mam wrażenie, że chyba chodzi o coś innego, więc jak coś to rozjaśnij

No niestety tak to nie działa :(
screenshot-20231114095319.png

0
ŁF napisał(a):

Masz bardzo złą architekturę. Masz też fatalne nazewnictwo elementów języka:

  • nie używa w nich języka polskiego,
  • standardy określają, że nazwy zmiennych lokalnych rozpoczyna się z małej litery, metody z dużej;
  • nie używa się podkreśleń, bo to nie PHP (może z wyjątkiem początków nazw prywatnych pól);
  • nie używa się skrótów, bo.po kilku miesiącach nikt nie będzie wiedział, jak się je rozszyfrowuje.

Powinieneś takie rzeczy załatwić interfejsem, do którego dostęp ma i "wstrzykiwany" formularz, i aplikacja. Ale jeśli ten kod nie jest Twojego autorstwa i nie masz wpływu na architekturę tego rozwiązania, to masz dwa podejścia.

  1. Zamiast Form użyj dynamic (albo zrzutuj na dynamic): ((dynamic)vaccinationReport).DocumentationId = newDocumentationId;.
  2. Refleksja: vaccinationReport.GetType().GetProperty("DocumentationId").SetValue(vaccinationReport, newDocumentationId);

Żaden z tych sposobów nie jest dobry, bo nie są odporne na zmiany w formularzu. Co najwyżej możesz złapać wyjątek, ale formularz nie zadziała.

Coś chyba źle zrobiłem bo nadal nie przesyła mi wartości do formularza :(

 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"raporty.dll");
            Type type = assembly.GetType("raporty.szczepienia");
            Form Raporcik = (dynamic)Activator.CreateInstance(type);
            ((dynamic)Raporcik).ID_Dok = 1;

            //Raporcik.MdiParent = this;
            Raporcik.Show();
0

Daj trochę więcej informacji, w ogóle to zdebuguj to i pokaż czy ID_Dok ustawiło się

0
jarzi napisał(a):

Daj trochę więcej informacji, w ogóle to zdebuguj to i pokaż czy ID_Dok ustawiło się

Na końcu dodałem poniższą linijkę kodu i to działa bez problemu, wiec widzi zmienną publicznie. Problem jest tylko przy wysłaniu jej do biblioteki :(


          
            raporty.szczepienia test = new raporty.szczepienia();
            test.ID_Dok = 1;
0
ŁF napisał(a):

Masz bardzo złą architekturę. Masz też fatalne nazewnictwo elementów języka:

  • nie używa w nich języka polskiego,
  • standardy określają, że nazwy zmiennych lokalnych rozpoczyna się z małej litery, metody z dużej;
  • nie używa się podkreśleń, bo to nie PHP (może z wyjątkiem początków nazw prywatnych pól);
  • nie używa się skrótów, bo.po kilku miesiącach nikt nie będzie wiedział, jak się je rozszyfrowuje.

Powinieneś takie rzeczy załatwić interfejsem, do którego dostęp ma i "wstrzykiwany" formularz, i aplikacja. Ale jeśli ten kod nie jest Twojego autorstwa i nie masz wpływu na architekturę tego rozwiązania, to masz dwa podejścia.

  1. Zamiast Form użyj dynamic (albo zrzutuj na dynamic): ((dynamic)vaccinationReport).DocumentationId = newDocumentationId;.
  2. Refleksja: vaccinationReport.GetType().GetProperty("DocumentationId").SetValue(vaccinationReport, newDocumentationId);

Żaden z tych sposobów nie jest dobry, bo nie są odporne na zmiany w formularzu. Co najwyżej możesz złapać wyjątek, ale formularz nie zadziała.

Rozwiązanie problemu:
Na początku musiałem zmienić trochę klasę szczepienia, która jest wczytywana z biblioteki dll.

  public partial class szczepienia : Form
    {
        private int _id_dok;
        public szczepienia(int ID_DOK)
        {
         _id_dok = ID_DOK;
        InitializeComponent();
            
        }

następnie w głównym formularzu, który ma wczytać zawartość formularza z biblioteki dll i przekazać do niego wartość zmiennej dałem poniższy kod:

     Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"raporty.dll");
            Type type = assembly.GetType("raporty.szczepienia");
            object[] arguments = {2 }; // Wartość którą chce przekazać do formularza szczepienia
            Form Raporcik = Activator.CreateInstance(type, arguments) as Form;
            Raporcik.Show();
0
ŁF napisał(a):

Masz bardzo złą architekturę. Masz też fatalne nazewnictwo elementów języka:

  • nie używa w nich języka polskiego,
  • standardy określają, że nazwy zmiennych lokalnych rozpoczyna się z małej litery, metody z dużej;
  • nie używa się podkreśleń, bo to nie PHP (może z wyjątkiem początków nazw prywatnych pól);
  • nie używa się skrótów, bo.po kilku miesiącach nikt nie będzie wiedział, jak się je rozszyfrowuje.

+1

Również słabiutko z podstawowymi konceptami informatyki.
Pierwsze z brzegu: czym innym jest OBRAZ PROGRAMU (podprogramu - plik DLL), czym innym proces i aktywne obiekty w pamięci
(i kilka innych - nie mam ochoty się znęcać)
Brak separacji myślowej: tu jest Form - tu są DANE
Nie da się "wysyłać do biblioteki" - chyba że programy modyfikujące kod.

Za złym słownictwem praktycznie zawsze idzie złe wykonanie, nieoptymalne, tzw "prawidłowe" tylko w szczęśliwym zbiegu okolicznosci (plus zadowolenie "przecież dobrze działa") Biedne kurczaki

Dodam: programowanie stochastyczne.

1
AnyKtokolwiek napisał(a):
ŁF napisał(a):

Masz bardzo złą architekturę. Masz też fatalne nazewnictwo elementów języka:

  • nie używa w nich języka polskiego,
  • standardy określają, że nazwy zmiennych lokalnych rozpoczyna się z małej litery, metody z dużej;
  • nie używa się podkreśleń, bo to nie PHP (może z wyjątkiem początków nazw prywatnych pól);
  • nie używa się skrótów, bo.po kilku miesiącach nikt nie będzie wiedział, jak się je rozszyfrowuje.

+1

Również słabiutko z podstawowymi konceptami informatyki.
Pierwsze z brzegu: czym innym jest OBRAZ PROGRAMU (podprogramu - plik DLL), czym innym proces i aktywne obiekty w pamięci
(i kilka innych - nie mam ochoty się znęcać)
Brak separacji myślowej: tu jest Form - tu są DANE
Nie da się "wysyłać do biblioteki" - chyba że programy modyfikujące kod.

Za złym słownictwem praktycznie zawsze idzie złe wykonanie, nieoptymalne, tzw "prawidłowe" tylko w szczęśliwym zbiegu okolicznosci (plus zadowolenie "przecież dobrze działa") Biedne kurczaki

Dodam: programowanie stochastyczne.

Nie jestem zawodowym programistą, bardziej są to niespełnione marzenia ze szkoły średniej, jednak lubię pisać programy jako takie hobby. Nie używam profesjonalnego żargonu występującego w programowaniu. Moje rozwiązanie spełnia moje potrzeby i zrobiłem je na podstawie analiz różnych kodów źródłowych, które znalazłem w Internecie.
Pewnie są inne metody rozwiązania tego problemu, jednak na chwilę obecną kurczaki są zadowolone z tego co mają, jeżeli zmieni się to w przyszłości to zrobimy modyfikacje kodu, aby było to bardziej optymalne :)

0
virusek391 napisał(a):

Nie jestem zawodowym programistą, bardziej są to niespełnione marzenia ze szkoły średniej, jednak lubię pisać programy jako takie hobby. Nie używam profesjonalnego żargonu występującego w programowaniu. Moje rozwiązanie spełnia moje potrzeby i zrobiłem je na podstawie analiz różnych kodów źródłowych, które znalazłem w Internecie.
Pewnie są inne metody rozwiązania tego problemu, jednak na chwilę obecną kurczaki są zadowolone z tego co mają, jeżeli zmieni się to w przyszłości to zrobimy modyfikacje kodu, aby było to bardziej optymalne :)

Rzecz w tym, że klikając na czuja "go w googlu sie znalazło rozwiązanie" (statystycznie jakości hinduskiej, np załatać zmienną globalną), bez widzenia horyzontu, bez podstaw - to jest antyrozwój
Za kilka lat zostaniesz nieomylnym (we własnych oczach - ze śmieszkiem za plecami) królem indykarni (spotykam takich ludzie regularnie)

Ksiażka - lubię książki, bo w odróżnieniu od materiałów z netu w 95% mają pełny zamysł, panoramiczny - koszt 50-150zł i jesteś na zupełnie innej ścieżce.

0
ŁF napisał(a):

Masz bardzo złą architekturę. Masz też fatalne nazewnictwo elementów języka:

  • nie używa w nich języka polskiego,
  • standardy określają, że nazwy zmiennych lokalnych rozpoczyna się z małej litery, metody z dużej;
  • nie używa się podkreśleń, bo to nie PHP (może z wyjątkiem początków nazw prywatnych pól);
  • nie używa się skrótów, bo.po kilku miesiącach nikt nie będzie wiedział, jak się je rozszyfrowuje.

Powinieneś takie rzeczy załatwić interfejsem, do którego dostęp ma i "wstrzykiwany" formularz, i aplikacja. Ale jeśli ten kod nie jest Twojego autorstwa i nie masz wpływu na architekturę tego rozwiązania, to masz dwa podejścia.

  1. Zamiast Form użyj dynamic (albo zrzutuj na dynamic): ((dynamic)vaccinationReport).DocumentationId = newDocumentationId;.
  2. Refleksja: vaccinationReport.GetType().GetProperty("DocumentationId").SetValue(vaccinationReport, newDocumentationId);

Żaden z tych sposobów nie jest dobry, bo nie są odporne na zmiany w formularzu. Co najwyżej możesz złapać wyjątek, ale formularz nie zadziała.

Dzięki :)

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