Klasa ClsPrint - pomocy

0

Witam.

Z racji tego, że to jest mój pierwszy wątek z góry przepraszam jeśli będzie coś nie tak.

Potrzebuję pomocy z klasą ClsPrint - dokładnie chodzi o ukrycie specyficznych kolumn.

Kod wygląda następująco:
https://pastebin.com/B5tSQnfS

Chodzi o ukrycie kolumny o indeksie np 2

Z góry dziękuję za pomoc

0

Możesz np, tak ukryć:

this.dataGridView1.Columns["CustomerID"].Visible = false;
lub
this.dataGridView1.Columns[0].Visible = false;
0
Kubuś Puchatek napisał(a):

Możesz tak ukryć jak wolisz

this.dataGridView1.Columns["CustomerID"].Visible = false;
lub
this.dataGridView1.Columns[0].Visible = false;

Taki sposób to ja znam :)

Chodzi o to, że z formularza funkcję wywołuję poprzez

ClsPrint _ClsPrint = new ClsPrint(dataGridView1, wycena_nr.Text,"Dokument sporządził:");
           _ClsPrint.PrintForm();
0

do printForm przekazuj List<string> z nazwami kolumn ktore chcesz ukryc. I tam w printform rob

foreach (var columnName in columnNamesToHide)
{
  this.dataGridView1.Columns[columnName].Visible = false;
}
0

Dobrze zrozumiałem, że ma to wyglądać tak?

private void print_btn_Click(object sender, EventArgs e)
        {
            foreach (var columnName in dataGridView1.Columns)
            {
                dataGridView1.Columns[2].Visible = false;
            }
            ClsPrint _ClsPrint = new ClsPrint(dataGridView1, wycena_nr.Text,"Dokument sporządził:");
            _ClsPrint.PrintForm();
        }
0

nic nie zrozumiales.

Opisz co dokladnie chcesz robic, bo napisales

Potrzebuję pomocy z klasą ClsPrint - dokładnie chodzi o ukrycie specyficznych kolumn.
dostales odpowiedz
this.dataGridView1.Columns[2].Visible = false;
powiedziales, ze to nie bedzie, bo
Chodzi o to, że z formularza funkcję wywołuję poprzez
co za bardzo nie ma sensu, bo jedno z drugim sie nie wyklucza. Wiec dalem Ci kod z wywolaniem funkcji printForm i napisalem, ze masz dodac parametr do niego (argument) a Ty robisz zupelnie co innego

Jezeli chcesz ukryc tylko 2 kolumne, to po prostu to zrob w printform, jezeli chcesz cos innego to opisz dokladnie co chcesz zrobic

0

Więc tak:

  1. Mam formularz z dataGridView w którym wyświetlają mi się dane.
  2. W tym samym formularzu jest też button o nazwie print który wywołuje klasę ClsPrint.
  3. Nie posiadam żadnego printForm tylko klasa otwiera PrintPreviewDialog.
  4. Jak w formularzu z tabelą ukrywam kolumny to i tak na podglądzie wydruku widzę je wszystkie, a chodzi o to, żeby niektóre były ukryte
0
  1. Skoro przekazujesz datagrida do printform i na podstawie jego robisz poglad to wystarczy ze zmienisz zrodlo i powinno byc ok
        private void print_btn_Click(object sender, EventArgs e)
        {
            dataGridView1.Columns[2].Visible = false;
            ClsPrint _ClsPrint = new ClsPrint(dataGridView1, wycena_nr.Text,"Dokument sporządził:");
            _ClsPrint.PrintForm();
        }

jezeli robisz tam cos dziwnego i Ci nadal wyswietla ta kolumne to po prostu w printForm zrob to visible na niewidoczne

0
fasadin napisał(a):
  1. Skoro przekazujesz datagrida do printform i na podstawie jego robisz poglad to wystarczy ze zmienisz zrodlo i powinno byc ok
        private void print_btn_Click(object sender, EventArgs e)
        {
            dataGridView1.Columns[2].Visible = false;
            ClsPrint _ClsPrint = new ClsPrint(dataGridView1, wycena_nr.Text,"Dokument sporządził:");
            _ClsPrint.PrintForm();
        }

jezeli robisz tam cos dziwnego i Ci nadal wyswietla ta kolumne to po prostu w printForm zrob to visible na niewidoczne

Robiłem w ten sposób co napisałeś i nadal ją widać :/

0

i zmieniles w funkcji _printDocument_PrintPage tego grida?

0
fasadin napisał(a):

i zmieniles w funkcji _printDocument_PrintPage tego grida?

Też próbowałem i nie działa. Jedyne na co mi zareagował w tym miejscu to HeaderText

Edit:
Jak ukrywam kolumnę w _printDocument_PrintPage to ukrywa mi ją w gridzie a na wydruku nadal ją widać :/

0

Inny sposób weź skopiuj widoczne kolumny do nowego grida i go wydrukuj. Kopiowanie w lokalnej instancji rób.

0
usm_auriga napisał(a):

Inny sposób weź skopiuj widoczne kolumny do nowego grida i go wydrukuj. Kopiowanie w lokalnej instancji rób.

No tak, ale jak ukryje kolumny w dgv1 i skopiuje widoczne do dgv2 to w formularzu nie bedzie mi wyswietlal tych z dgv1

0

Nie rozumiem, to pokazuj dgv1 a drukuj dgv2 i daj podgląd wydruku to będziesz widział

0

Już próbuję. Dam znać co z tego wyszło.

EDIT:

Po skopiowanie grida wyświetla się pusty podgląd.

0

To sobie sprawdź jeszcze co ci skopiowało i wyświetl w formie dgv2 jak tam coś masz a nie masz w wydruku to coś masz skopane po prostu. A zdefiniowałeś kolumny w dgv2 ?

0

Do skopiowania użyłem:

private DataGridView CopyDataGridView(DataGridView dgv_org)
        {
            DataGridView dgv_copy = new DataGridView();
            try
            {
                if (dgv_copy.Columns.Count == 0)
                {
                    foreach (DataGridViewColumn dgvc in dgv_org.Columns)
                    {
                        dgv_copy.Columns.Add(dgvc.Clone() as DataGridViewColumn);
                    }
                }

                DataGridViewRow row = new DataGridViewRow();

                for(int i = 0; i < dgv_copy.Rows.Count; i++)
                {
                    row = (DataGridViewRow)dgv_org.Rows[i].Clone();
                    int intColIndex = 0;
                    foreach(DataGridViewCell cell in dgv_org.Rows[i].Cells)
                    {
                        row.Cells[intColIndex].Value = cell.Value;
                        intColIndex++;
                    }
                    dgv_copy.AllowUserToAddRows = false;
                    dgv_copy.Refresh();
                }
            } catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return dgv_copy;
        }

następnie wywołałem

MessageBox.Show(Convert.ToString(CopyDataGridView(dataGridView1).Rows.Count));

i wywaliło mi wynik 0 pomimo 2 wierszy

0

Ja to robiłem trochu inaczej i co innego, kopiowałem widoczne wiersze, ale musisz debugować to krok po kroku, np. czy i ile kolumn zostało dodane do kopi. Masz gdzieś błąd. Ja bym sprawdzał czy nazwa danej kolumny w dgv1 zgadza się z nazwą kolumny w dgv2 i wtedy dopiero kopiował wartość. Nic więcej nie pomogę bo czasu nie mam zbytnio

0

Kombinowałem jeszcze z takim czymś:

DataTable dt = new DataTable();
            foreach (DataGridViewColumn col in dataGridView1.Columns)
            {
                dt.Columns.Add(col.HeaderText);
            }

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                DataRow dRow = dt.NewRow();
                foreach (DataGridViewCell cell in row.Cells)
                {
                    dRow[cell.ColumnIndex] = cell.Value;
                }
                dt.Rows.Add(dRow);
            }

ale niestety jak wrzucę to w datagridview to znów mam 0 wierszy

0

Kolumny dodajesz poprawnie, natomiast aby skopiować wartości z kolumn tworzysz tablicę stringów kopiujesz to do kolejnych elementów tablicy i dodajesz tą tablicę jako wiersz i działa.

tablica_wartosci[0] = row.Cells["nazwaKolumny"].Value.ToString();
dataGridView2.Rows.Add(tablica_wartosci);

Jakoś tak, powinno działać

0
usm_auriga napisał(a):

Kolumny dodajesz poprawnie, natomiast aby skopiować wartości z kolumn tworzysz tablicę stringów kopiujesz to do kolejnych elementów tablicy i dodajesz tą tablicę jako wiersz i działa.

tablica_wartosci[0] = row.Cells["nazwaKolumny"].Value.ToString();
dataGridView2.Rows.Add(tablica_wartosci);

Jakoś tak, powinno działać

Rozumiem, że oczywiście też w pętli

foreach (DataGridViewRow row in dataGridView1.Rows){ .... }
0

Tak w pętli dla każdego wiersza

0
usm_auriga napisał(a):

Tak w pętli dla każdego wiersza

Muszę użyć pętli for?

0
foreach (DataGridViewRow row in dataGridView1.Rows) 
 {
...
 }

Widzę że masz braki z programowania poczytaj o różnych rodzajach pętli może na początek.

0
usm_auriga napisał(a):
foreach (DataGridViewRow row in dataGridView1.Rows) 
 {
...
 }

Widzę że masz braki z programowania poczytaj o różnych rodzajach pętli może na początek.

Musiałem chwilkę pomyśleć :), ale dzięki za podpowiedź :)

0

Wykombinowałem takie coś. Niezbyt wiem czy to poprawne bo w dalszym ciągu nie ładuje tego do dgv2 :/

DataTable dt = new DataTable();
            DataGridView dgv2 = new DataGridView();
            foreach (DataGridViewColumn col in dataGridView1.Columns)
            {
                dt.Columns.Add(col.HeaderText);
            }
            List<string> col1 = new List<string>();
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                col1.Add(row.Cells[0].Value.ToString());
            }

Już poprawiłem na:

string[] wartosci = new string[6];
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                wartosci[0] = row.Cells[0].Value.ToString();
                wartosci[1] = row.Cells[1].Value.ToString();
            }
            dgv2.Rows.Add(wartosci);
0
DataGridView dgv2 = new DataGridView();
            foreach (DataGridViewColumn col in dataGridView1.Columns)
            {
                dgv2.Columns.Add(col.HeaderText.ToString(), col.HeaderText.ToString());
            }

            MessageBox.Show(dgv2.Columns.Count.ToString());

            String[] tablica = new String[12];

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                try
                {
                    tablica[0] = row.Cells["tu_twoja_nazwa_kolumny"].Value.ToString();
                    //// analogicznie dla reszty kolumn
                    dgv2.Rows.Add(tablica);
                }
                catch(Exception exc)
                {

                }
            }

            MessageBox.Show(dgv2.Rows.Count.ToString());

Brakuje bloku try catch. Mi utworzyło grida z 12 kolumnami i 256 wierszami, ty sobie wpisz swoje nazwy kolumn dynamicznie. na razie

0
usm_auriga napisał(a):
DataGridView dgv2 = new DataGridView();
            foreach (DataGridViewColumn col in dataGridView1.Columns)
            {
                dgv2.Columns.Add(col.HeaderText.ToString(), col.HeaderText.ToString());
            }

            MessageBox.Show(dgv2.Columns.Count.ToString());

            String[] tablica = new String[12];

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                try
                {
                    tablica[0] = row.Cells["tu_twoja_nazwa_kolumny"].Value.ToString();
                    //// analogicznie dla reszty kolumn
                    dgv2.Rows.Add(tablica);
                }
                catch(Exception exc)
                {

                }
            }

            MessageBox.Show(dgv2.Rows.Count.ToString());

Brakuje bloku try catch. Mi utworzyło grida z 12 kolumnami i 256 wierszami, ty sobie wpisz swoje nazwy kolumn dynamicznie. na razie

Kolumny chyba i tak muszę stworzyć ręcznie bo i tak wyświetla mi je wszystkie na wydruku

0

Podpowiesz mi jeszcze jak pozbyć się tego pustego wiersza który jest na samym dole?

0

o tak

dataGridView2.AllowUserToAddRows = false;

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