public void PobierzDaneCzytelnika(Czytelnik czytelnik, KartaCzytelnika karta, IEnumerable<Wypozyczenie> wypozyczenia, int flag = 0)
        {
            this.usunButton.Visible = true;
            this.statusKartyButton.Visible = true;
            this.czytelnikTabControl.TabPages.Add(wypozyczeniaTabPage);
            this.Text = "Edycja czytelnika";

            if (flag == 1)
                this.czytelnikTabControl.SelectedTab = wypozyczeniaTabPage;

            if (karta.Status.Equals("aktywna"))
                this.statusKartyButton.Text = "Dezaktywuj";

            this.czytelnik = czytelnik;
            this.karta = karta;
            this.wypozyczenia = wypozyczenia;

            foreach (var obj in wypozyczenia)
            {
                DataGridViewRow row = this.wypozyczeniaGridView.RowTemplate.Clone() as DataGridViewRow;
                row.CreateCells(this.wypozyczeniaGridView);

                row.Cells[0].Value = obj.Tytul();
                row.Cells[1].Value = obj.Sygnatura();
                row.Cells[2].Value = obj.DataWypozyczenia.ToShortDateString();
                row.Cells[3].Value = obj.TerminZwrotu.ToShortDateString();
                row.Cells[4].Value = obj.Id(); //Kolumna ukryta. Wartość potrzebna to operacji dodawania/edycji/usuwania
                row.Cells[5].Value = obj.GetType().Name; //Kolumna ukryta. Wartość potrzebna to operacji dodawania/edycji/usuwania

                this.wypozyczeniaGridView.Rows.Add(row);
            }

            //Dane czytelnika
            this.imieTextBox.Text = czytelnik.Imie;
            this.nazwiskoTextBox.Text = czytelnik.Nazwisko;
            this.peselTextBox.Text = czytelnik.Pesel;
            this.dataTimePicker.Value = czytelnik.DataUrodzenia;

            if (czytelnik.Plec.ToString().Equals("K"))
                this.kobietaRadioButton.Checked = true;

            //Adres czytelnika
            this.adresTextBox.Text = czytelnik.Adres.Ulica;
            this.kodPocztowyTextBox.Text = czytelnik.Adres.KodPocztowy;
            this.miejscowoscTextBox.Text = czytelnik.Adres.Miejscowosc;
            this.telefonTextBox.Text = czytelnik.Adres.Telefon;

            //Karta czytelnika
            this.statusLabel.Text = karta.Status;
            this.dataLabel.Text = karta.DataWystawienia.ToShortDateString();
            this.terminLabel.Text = karta.TerminWaznosci.ToShortDateString();
        }
        //Zapisujemy edytowanego czytelnika lub dodajemy nowego
        //Trzeba by to rodzielić dla większej przejrzystości ale skoro działa? to niech tak zostanie
        private void ZapiszButtonClick(object sender, EventArgs e)
        {
            CzytelnikRepository czytelnikRepository = new CzytelnikRepository();
            AdresRepository adresRepository = new AdresRepository();
            KartaCzytelnikaRepository kartaCzytelnikaRepository = new KartaCzytelnikaRepository();

            Czytelnik edited;
            Adres adres;
            KartaCzytelnika kartaCzyt;

            if (czytelnik == null)
            {
                edited = new Czytelnik();
                adres = new Adres();
                kartaCzyt = new KartaCzytelnika();

                //Domyślne dane nowo dodawanej karty czytelnika
                kartaCzyt.Status = "aktywna";
                kartaCzyt.DataWystawienia = DateTime.Now;
                kartaCzyt.TerminWaznosci = DateTime.Now.AddYears(5);
            }
            else
            {
                edited = czytelnik;
                adres = czytelnik.Adres;
                kartaCzyt = karta;
            }

            //Przypisujemy wartości z textboxów do obiektów
            edited.Imie = this.imieTextBox.Text;
            edited.Nazwisko = this.nazwiskoTextBox.Text;
            edited.Pesel = this.peselTextBox.Text;
            edited.DataUrodzenia = this.dataTimePicker.Value;
            if (kobietaRadioButton.Checked)
                edited.Plec = 'K';
            else
                edited.Plec = 'M';
            adres.Ulica = this.adresTextBox.Text;
            adres.Miejscowosc = this.miejscowoscTextBox.Text;
            adres.KodPocztowy = this.kodPocztowyTextBox.Text;
            adres.Telefon = this.telefonTextBox.Text;

            //Ustalamy domyślny kolor textbox'ów
            this.imieTextBox.BackColor = SystemColors.Window;
            this.nazwiskoTextBox.BackColor = SystemColors.Window;
            this.peselTextBox.BackColor = SystemColors.Window;
            this.adresTextBox.BackColor = SystemColors.Window;
            this.kodPocztowyTextBox.BackColor = SystemColors.Window;
            this.miejscowoscTextBox.BackColor = SystemColors.Window;
            this.telefonTextBox.BackColor = SystemColors.Window;

            this.errorProvider.Clear();

            //Zapisujemy nowego czytelnika
            if (czytelnik == null)
            {
                if (this.CzyDanePoprawne() && MessageBox.Show("Zapisać czytelnika?", "Ostrzeżenie", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    edited.Haslo = RandomString(8);

                    adresRepository.Dodaj(adres); //Dodajemy najpierw adres do bazy

                    adres.Id = BazaSQLite.LastId(); //Pobieramy jego id
                    edited.Adres = adres;
                    czytelnikRepository.Dodaj(edited); //Znając id adresu dodajemy czytelnika

                    edited.Id = BazaSQLite.LastId(); //id czytelnika dodanego do bazy
                    kartaCzyt.Czytelnik = edited;
                    kartaCzytelnikaRepository.Dodaj(kartaCzyt); //Ostatecznie zapisujemy kartę czytelnika

                    MessageBox.Show("Tymczasowe hasło: " + edited.Haslo);

                    this.DialogResult = DialogResult.OK;
                }
            }
            else //Edytujemy obecnego czytelnika
            {
                if (this.CzyDanePoprawne() && MessageBox.Show("Zaktualizować dane czytelnika?", "Ostrzeżenie", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    adresRepository.Edytuj(adres);
                    czytelnikRepository.Edytuj(edited);
                    this.DialogResult = DialogResult.OK;
                }
            }
        }
        private void ObliczButtonClick(object sender, EventArgs e)
        {
            string zapytanie = "", zapytanieNieaktywne = "", zapytanieLiczbaWypKsiazki = "", zapytanieLiczbaWypCzasopism = "", rodzajZbioru = "";
            double liczbaNieaktywnych = 0, liczbaWszystkich = 0, liczbaWypKsiazek = 0, liczbaWypCzasopism = 0, liczbaWypOgolem = 0;
            DateTime dataPocz = this.dateTimePicker5.Value;
            DateTime dataKon = this.dateTimePicker6.Value;

            List<KartaCzytelnika> listaKartCzytelnika = new List<KartaCzytelnika>();
            List<KartaCzytelnika> listaNieaktywnychKartCzytelnika = new List<KartaCzytelnika>();
            List<LiczbaWypozyczen> listaWypozyczenKsiazek = new List<LiczbaWypozyczen>();
            List<LiczbaWypozyczen> listaWypozyczenCzasopism = new List<LiczbaWypozyczen>();

            BazaSQLite baza = new BazaSQLite();

            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();
            DataTable dt3 = new DataTable();
            DataTable dt4 = new DataTable();

            zapytanie = String.Format("select id_karty as pom from Karty");
            zapytanieNieaktywne = String.Format("select id_karty as pom from Karty as k where k.status = \"nieaktywna\"");
            zapytanieLiczbaWypKsiazki = String.Format("select id_egzemplarza + id_karty as pom from Karty_Wypozyczen_Ksiazki as kwk where data_wypozyczenia between date(\"" + dataPocz + "\") and date(\"" + dataKon + "\")");
            zapytanieLiczbaWypCzasopism = String.Format("select id_egzemplarza + id_karty as pom from Karty_Wypozyczen_Czasopisma as kwc where data_wypozyczenia between date(\"" + dataPocz + "\") and date(\"" + dataKon + "\")");

            dt1 = baza.GetDataTable(zapytanie);
            dt2 = baza.GetDataTable(zapytanieNieaktywne);
            dt3 = baza.GetDataTable(zapytanieLiczbaWypKsiazki);
            dt4 = baza.GetDataTable(zapytanieLiczbaWypCzasopism);

            foreach (DataRow row in dt1.Rows)
            {
                KartaCzytelnika rekord = new KartaCzytelnika();
                rekord.Id = Convert.ToInt32(row["pom"]);
                listaKartCzytelnika.Add(rekord);
            }
            foreach (DataRow row in dt2.Rows)
            {
                KartaCzytelnika rekord = new KartaCzytelnika();
                rekord.Id = Convert.ToInt32(row["pom"]);
                listaNieaktywnychKartCzytelnika.Add(rekord);
            }
            foreach (DataRow row in dt3.Rows)
            {
                LiczbaWypozyczen rekord = new LiczbaWypozyczen();
                rekord.Id = Convert.ToInt32(row["pom"]);
                listaWypozyczenKsiazek.Add(rekord);
            }
            foreach (DataRow row in dt4.Rows)
            {
                LiczbaWypozyczen rekord = new LiczbaWypozyczen();
                rekord.Id = Convert.ToInt32(row["pom"]);
                listaWypozyczenCzasopism.Add(rekord);
            }

            liczbaNieaktywnych = listaNieaktywnychKartCzytelnika.Count();
            liczbaWszystkich = listaKartCzytelnika.Count();
            liczbaWypKsiazek = listaWypozyczenKsiazek.Count();
            liczbaWypCzasopism = listaWypozyczenCzasopism.Count();
            liczbaWypOgolem = liczbaWypKsiazek + liczbaWypCzasopism;

            if ((liczbaWszystkich != 0))
            {
                udzialOsobNieaktywnychLabel.Text = String.Format("{0}%", Math.Round(liczbaNieaktywnych / liczbaWszystkich, 3).ToString());
            }

            if (string.IsNullOrEmpty(rodzajZbioruComboBox.Text))
            {
                MessageBox.Show("Proszę wybrać rodzaj zbiorów bibliotecznych.", "Analiza stanu czytelnictwa");
            }
            else
            {
                rodzajZbioru = this.rodzajZbioruComboBox.SelectedItem.ToString();
            }

            switch (rodzajZbioru)
            {
                case "książki":
                    this.calkowitaLiczbaWypLabel.Text = Convert.ToString(liczbaWypKsiazek);
                    break;
                case "czasopisma":
                    this.calkowitaLiczbaWypLabel.Text = Convert.ToString(liczbaWypCzasopism);
                    break;
                case "wszystkie":
                    this.calkowitaLiczbaWypLabel.Text = Convert.ToString(liczbaWypOgolem);
                    break;
            }
        }