Dodanie warunków do metody wypełniającej PDF

0

Witam,
Chciałbym do poniższego kodu dodać warunki if, aby na podstawie ID_TYPU była wykonywana odpowiednia metoda wypełniania pliku pdf. Są obecnie cztery ID_TYPU i dla każdego z nich jest inny wzorzec pdf do wypełnienia. Ostatecznym wynikiem wykonania tych warunków musi być wyświetlenie podglądu wydruku, za co jest odpowiedzialny kod:

PdView view = new PdView(pliki);
view.WindowState = FormWindowState.Maximized;
view.ShowDialog();

Poniżej kod metody przekazującej dane do druku:

public void PrzekazDoWydruku()
        {
            
            var lista = new List<int>();

            var data = myGridView4.GetSelectedRows();

            data.ForEach(x =>
            {
                var row = myGridView4.GetRow(x) as UmListaModel;

                if (row != null)
                {

                    lista.Add(row.IdUm);
                }

            });


            if (data.Any())
            {
                //początek modyfikacji
                idTypu = myGridView4.GetRowCellValue(myGridView4.FocusedRowHandle, myGridView4.Columns["ID_TYPU"]).ToString();
              
                
                if (idTypu == "1")
                {
                    
                   
                    //XtraMessageBox.Show(idTypu);
                }
                else if (idTypu == "2")
                {
                    
                    
                    //XtraMessageBox.Show(idTypu);
                }
                else if(idTypu == "3")
                {
                    //kolejny typ um
                }
                else if(idTypu == "4")
                {
                    //następny rodzaj um
                }
                //koniec modyfikacji

                //obecnie dla jednego typu id jest tylko poniższy kod
                byte[] pliki = WypelnijPolaPDF_UM1(lista);
                PdView view = new PdView(pliki);
                view.WindowState = FormWindowState.Maximized;
                view.ShowDialog();



            }
            
        }      
0

Jak chcesz dodać to dodaj. Ale ja bym zrobił jakąś fabryke a nie drabinkę ifów

0

<sarkazm> View, Form, Formstate, produkcja PDF ... widzę jakieś all-in-one </sarkazm>

Naucz się rozdzielać na warstwy / moduły / whatever , bo nigdy nie wyjdziesz na prostą

Czytam temat posta już jakis czas .... i nie wiem o co chodzi, co jest celem, co okolicznością przeszkadzającą itd

UPDATE: niech się kolega nauczy, co to jest Model, i jak w C# się robi binding Modelu. Traktowanie GUI jako składowiska danych jest chore.

0

Ludzie ja nie mam doświadczenia w C# 20 lat jak wy, albo nie wiadomo ile. Ja zacząłem się uczyć miesiąc temu, więc proszę o wyrozumiałość!

0

Na chama to tak

public void PrzekazDoWydruku()
        {

            var lista = new List<int>();

            var data = myGridView4.GetSelectedRows();

            data.ForEach(x =>
            {
                var row = myGridView4.GetRow(x) as UmListaModel;

                if (row != null)
                {

                    lista.Add(row.IdUm);
                }

            });

            if (data.Any())
            {
byte[] pliki = null; // <<<<<<<
                //początek modyfikacji
                idTypu = myGridView4.GetRowCellValue(myGridView4.FocusedRowHandle, myGridView4.Columns["ID_TYPU"]).ToString();

                if (idTypu == "1")
                {
pliki = WypelnijPolaPDF_UM1_Type1(lista);
                }
                else if (idTypu == "2")
                {
pliki = WypelnijPolaPDF_UM1_Type2(lista);
\                }
                else if(idTypu == "3")
                {
pliki = WypelnijPolaPDF_UM1_Type3(lista);
                }
                else if(idTypu == "4")
                {
pliki = WypelnijPolaPDF_UM1_Type4(lista);

                }
                //koniec modyfikacji

                //obecnie dla jednego typu id jest tylko poniższy kod
                // tu kontrola czy 
if(pliki != null){
PdView view = new PdView(pliki);
                view.WindowState = FormWindowState.Maximized;
                view.ShowDialog();
}
                

            }

        }   

Jak lepiej to zrobić można przeczytać tu: https://pater.dev/pozbadz-sie-ifow-ze-swojego-kodu-za-pomoca-polimorfizmu/
Nie czytałem dokładnie czy to jest wartościowe ale coś tam jest.

0

Do tworzenia plików pdf używam iTextSharp. Dla jednego typu działa mi wszystko, ale może ktoś podpowie jak to rozszerzyć o kolejne wzorce pdf ???

0
pawelus222 napisał(a):

Dla jednego typu działa mi wszystko, ale może ktoś podpowie jak to rozszerzyć o kolejne wzorce pdf ???

Niedyskretnie bym sugerował Kolego, choć cię to wkurzy, wrócić do "abstrakcyjnej" nauki programowania obiektowego, bez parcia na komercję, rozejrzeć się we wzorcach projektowych itd
Chyba z pięć wzorców obiektowych odpowiada na twoje pytanie, mi najbardziej nasuwa się strategia.

https://www.google.com/search?q=wzorce+projektowe+gof+ksiazka

Klikalna platforma GUI okłamała Cię, że dobre programy same się zrobią - jak wielu użytkowników Delphi, C++ Buildera itd
Nie, nie zrobią się, powiem więcej, im więcej będziesz grzebał w szambie, tym trudniej będzie to z siebie strącić.
W takiej ścieżce, jaką przyjąłeś, powiem więcej, każdy "sukces" (np wmuszenie drugiego wzorca PDF przez pot, krew i łzy) jest cofnięciem się, zamknięciem perspektyw przed głęboką nauką.

W tych dniach na C++ kolega usilnie walczy z elementami GUI Qt, nie chcąc za nic w swojej nastoletniej praktyce przyjąć wiedzy fundamentalnej. Ksywkę łatwo znajdziesz.

Zostaw na jakiś czas te PDF, poćwicz Jabłko dziedziczy z Owoc, Pies implements MajacyGłos

0

Dramatycznie i fundamentalnie się nie zgadzam z @AnyKtokolwiek. Cokolwiek ktoś umie niech to robi i próbuje sprzedawać. Mi nikt nigdy nie zapłacił więcej za to, że kod jest ładny, zgodny z czymśtam.
Nauka i rozwój swoich umiejętności jest ważny ale jak ktoś jest na początku to też może zarabiać. Pierwszy sprzedany program będzie słaby, drugi lepszy a setny bardzo dobry ale każdy z nich może być działającym programem i będzie realizował to co powinien.
A po drodze czytajcie jakieś dobre blogi i oglądajcie filmy.

0
jacek.placek napisał(a):

Pierwszy sprzedany program będzie słaby, drugi lepszy a setny bardzo dobry ale każdy z nich może być działającym programem i będzie realizował to co powinien.

Pierwszy będzie slaby, w drugim się nauczy jak dawać podpórki do prowizorki *), a setny to będzie beton architektoniczny (broniony działami przed krytykami, jak linia Maginota).
Tak się rozwijają klikacze GUI bez rozwoju choćby teoretycznego

Cokolwiek ktoś umie niech to robi i próbuje sprzedawać. Mi nikt nigdy nie zapłacił więcej za to, że kod jest ładny, zgodny z czymśtam.

Pozwól mi uważać, że sprzedawanie kodu "brzydkiego" klientowi jest nieetyczne - zmusi go do kosztów, zawiera pole minowe potencjalnych błędów itd.
Kilka razy wyciągałem projekty Builderowe z gó..., niby "refaktorując" , niemal pisząc je od podstaw. Tyle, ze mój zleceniodawca (włąściciel kodu) miał nad sobą wiele większego inwestora itd

na szczęście w wielu zawodach sprzedawanie swej wątpliwej wiedzy przez zielonych jest ścigane prawnie (medycyna, lotnictwo i wiele innych)

*) ponieważ Delphi/Builder generuje zmienne globalne, co robi "rasowy" programista builderowy? Odkopiowuje zmienną globalną do drugiej, wierząc, że w 100% ją odtworzy (oczywiście try catch jest nieznane). Ponieważ platforma klikalna nigdzie nie generuje zmiennej lokalnej, te też są mu nieznane.

0
AnyKtokolwiek napisał(a):
jacek.placek napisał(a):

Pierwszy sprzedany program będzie słaby, drugi lepszy a setny bardzo dobry ale każdy z nich może być działającym programem i będzie realizował to co powinien.

Pierwszy będzie slaby, w drugim się nauczy jak dawać podpórki do prowizorki *), a setny to będzie beton architektoniczny (broniony działami przed krytykami, jak linia Maginota).
Tak się rozwijają klikacze GUI bez rozwoju choćby teoretycznego

Może tak a może będzie zupełnie inaczej.

Cokolwiek ktoś umie niech to robi i próbuje sprzedawać. Mi nikt nigdy nie zapłacił więcej za to, że kod jest ładny, zgodny z czymśtam.

Pozwól mi uważać, że sprzedawanie kodu "brzydkiego" klientowi jest nieetyczne - zmusi go do kosztów, zawiera pole minowe potencjalnych błędów itd.

Pozwalam. Chociaż te problemy to Twoje imaginacje.

Kilka razy wyciągałem projekty Builderowe z gó..., niby "refaktorując" , niemal pisząc je od podstaw. Tyle, ze mój zleceniodawca (włąściciel kodu) miał nad sobą wiele większego inwestora itd

na szczęście w wielu zawodach sprzedawanie swej wątpliwej wiedzy przez zielonych jest ścigane prawnie (medycyna, lotnictwo i wiele innych)

:) OK.

*) ponieważ Delphi/Builder generuje zmienne globalne, co robi "rasowy" programista builderowy? Odkopiowuje zmienną globalną do drugiej, wierząc, że w 100% ją odtworzy (oczywiście try catch jest nieznane). Ponieważ platforma klikalna nigdzie nie generuje zmiennej lokalnej, te też są mu nieznane.

Mój pierwszy komercyjny program był w Builderze (1999 rok, koszt coś ok 30k, nieduża SCADA). Działał chyba z 10 lat bez problemów aż fabryka klienta została kupiona przez korpo, zamknięta i sprzedana na części.
Kod był koszmarny (TTable, TSQL, wszystko w TFormach, łącznie z komunikacją po RS232 z czujnikami. I może się zdziwisz, ale nikogo to nie obchodziło :). Program robił to co miał robić. Żadne miny potencjalnych błędów nie wybuchły i nie było dodatkowych kosztów.

0

@jacek.placek: Sprawdziłem ten kod przez Ciebie podany wyżej, ale myślę że jest problem z linijką

idTypu = myGridView4.GetRowCellValue(myGridView4.FocusedRowHandle, myGridView4.Columns["ID_TYPU"]).ToString();

Zaznaczam dwa wiersze na liście i jest wypełniany ten sam wzorzec PDF, a powinny być wypełnione dwa różne.

ID_TYPU to nazwa kolumny w GridControl, ten kod działa tak, że bierze ID_TYPU ostatnio podświetlonego wiersza, a ja muszę wczytać dla każdego zaznaczonego wiersza ID_TYPU, żeby następnie wypełnić odpowiedni wzorzec PDF

0

Bo sprawdzasz wiersz, który ma focus - myGridView4.FocusedRowHandle tutaj
idTypu = myGridView4.GetRowCellValue(myGridView4.FocusedRowHandle, myGridView4.Columns["ID_TYPU"]).ToString();

Zakąłdam, że to Grid z DevExpress to

Tu ładujesz zaznaczone wiersze do listy

var lista = new List<int>();

            var data = myGridView4.GetSelectedRows();

            data.ForEach(x =>
            {
                var row = myGridView4.GetRow(x) as UmListaModel;

                if (row != null)
                {

                    lista.Add(row.IdUm);
                }

            });

Zmień to na dodawanie obiektów do listy, zakładam, że ta klasa zawiera pole ID_TYPU

var lista = new List<UmListaModel>();

            var data = myGridView4.GetSelectedRows();

            data.ForEach(x =>
            {
                var row = myGridView4.GetRow(x) as UmListaModel;

                if (row != null)
                {
                    lista.add(row);
                    //lista.Add(row.IdUm);
                }

            });

Potem nie masz iteracji po żadnej liście. Jeśli każdy rekord (obiekt) może mieć inny idTypu to trzeba w pętli (foreach) przelecieć po liście data (z obiektami) i zrobić.co tam trzeba

foreach(var d in data)
{
byte[] pliki = null; // <<<<<<<
                //początek modyfikacji
                string idTypu = d.ID_TYPU; 

                if (idTypu == "1")
                {
                      pliki = WypelnijPolaPDF_UM1_Type1(lista);
                }
                else if (idTypu == "2")
                {
                      pliki = WypelnijPolaPDF_UM1_Type2(lista);
                }
...
...
...
        if(pliki != null){
              PdView view = new PdView(pliki);
                view.WindowState = FormWindowState.Maximized;
                view.ShowDialog();
    }
}

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