private void btnDeleteSelectedCategory_Click(object sender, EventArgs e)
        {
            if (selectedCategory==null)
            {
                if (tvCategories.SelectedNode.Name == "0" || tvCategories.SelectedNode.Name == "1")
                {
                    EPCategories.SetError(labSelectedCategoryName, "Kategorii wyróżnionych niebieskim kolorem nie można usunąć");
                }
                else
                {
                    EPCategories.SetError(labSelectedCategoryName, "Wybierz kategorię do usunięcia");
                }
                return;
            }

            string selectedCategoryName = labSelectedCategoryName.Text;

            if ((new BibliotekaDataContext()).Kategorias.Count(x => x.nazwa == selectedCategoryName) == 0)
            {
                MessageBox.Show("Prawdopodobnie formularz wymaga odświeżenia. Nie ma kategorii, którą próbujesz usunąć.",
                    "Błąd usuwania kategorii", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            bool deleteSubs = cbSubCatsDecision.SelectedIndex == 0 ? false : true;
            bool makeSubsTLC = false;

            if (selectedCategory.kategoriaNadrzednaID == null && deleteSubs == false) { }
            {
                if ((new BibliotekaDataContext()).Kategorias.Count(x => x.kategoriaNadrzednaID == selectedCategory.id) == 0)
                {
                    makeSubsTLC = true;
                }
                else if (MessageBox.Show(
                    "Wybrana kategoria nie posiada kategorii nadrzędnej. Wybrałeś opcję przenoszącą podkategorię do kategorii nadrzędnej.\r\nKontynuacja będzie oznaczała zamianę podkategorii w kategorie najwyższego poziomu.\r\n\r\nCzy chcesz przerwać operację?",
                    "Sytuacja wyjątkowa podczas usuwania kategorii",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question
                    ) == DialogResult.No)
                {
                    makeSubsTLC = true; // Czy uczynic podkategorie korzeniami
                }
                else
                {
                    EPCategories.SetError(cbSubCatsDecision, "Wybrana kategoria nie posiada kategorii nadrzędnej");
                    return;
                }
            }

            /* +++ Operacje na bazie danych */
            using (BibliotekaDataContext db = new BibliotekaDataContext())
            {
                Kategoria newSelectedCategory = selectedCategory.Kategoria1;

                // pobieranie identyfikatorow podkategorii
                List<int> subsIDs = db.Kategorias.Where(x => x.kategoriaNadrzednaID == selectedCategory.id).Select(x => x.id).ToList();

                if (deleteSubs)
                {
                    // +++ uzupelniam poddrzewo kategorii
                    int treeElementsCount = -1;
                    while (treeElementsCount != subsIDs.Count)
                    {
                        treeElementsCount = subsIDs.Count;
                        subsIDs = db.Kategorias.Where(x => subsIDs.Contains(x.id) || subsIDs.Contains((int)x.kategoriaNadrzednaID)).Select(x => x.id).Distinct().ToList();
                    }
                    subsIDs.Add(selectedCategory.id);
                    // --- poddrzewo uzupelnione
                    // kasowanie powiazan kategorii z ksiazkami
                    db.KategoriaKsiazkis.DeleteAllOnSubmit(db.KategoriaKsiazkis.Where(x => subsIDs.Contains(x.kategoriaID)).ToArray());
                    // kasowanie calego drzewa podkategorii
                    db.Kategorias.DeleteAllOnSubmit(db.Kategorias.Where(x => subsIDs.Contains(x.id)).ToArray());
                }
                else if (makeSubsTLC)
                {
                    db.KategoriaKsiazkis.DeleteAllOnSubmit(db.KategoriaKsiazkis.Where(x => x.kategoriaID == selectedCategory.id).ToArray());
                    List<Kategoria> scl = db.Kategorias.Where(x => x.kategoriaNadrzednaID == selectedCategory.id).ToList();
                    foreach (Kategoria sc in scl)
                    {
                        sc.kategoriaNadrzednaID = null;
                    }
                    db.Kategorias.DeleteOnSubmit(db.Kategorias.Where(x => x.id == selectedCategory.id).Single());
                }
                else
                {
                    db.KategoriaKsiazkis.DeleteAllOnSubmit(db.KategoriaKsiazkis.Where(x => x.kategoriaID == selectedCategory.id).ToArray());
                    List<Kategoria> scl = db.Kategorias.Where(x => x.kategoriaNadrzednaID == selectedCategory.id).ToList();
                    foreach (Kategoria sc in scl)
                    {
                        sc.kategoriaNadrzednaID = selectedCategory.kategoriaNadrzednaID;
                    }
                    db.Kategorias.DeleteOnSubmit(db.Kategorias.Where(x => x.id == selectedCategory.id).Single());
                }

                try
                {
                    db.SubmitChanges();
                }
                catch (System.Data.SqlClient.SqlException sqlExp)
                {
                    sqlExceptionMessage = sqlExp.Message;
                    MessageBox.Show("Wystąpił błąd związany z bazą danych.", "Błąd usuwania kategorii", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                selectedCategory = newSelectedCategory;
            }
            /* --- Operacje na bazie danych */

            /* +++ Aktualizacja TreeView */
            SuspendLayout();
            TreeNode newSelectedNode = tvCategories.SelectedNode.Parent;
            if (deleteSubs == true)
            {
                tvCategories.SelectedNode.Remove();
            }
            else
            {
                foreach (TreeNode tn in tvCategories.SelectedNode.Nodes)
                {
                    tvCategories.SelectedNode.Parent.Nodes.Add(tn.Name, tn.Text);
                }
                tvCategories.SelectedNode.Nodes.Clear();
                tvCategories.SelectedNode.Remove();
            }
            tvCategories.SelectedNode = newSelectedNode;
            ResumeLayout();
            /* --- Aktualizacja TreeView */

            labSelectedCategoryName.Text = selectedCategory == null ? (selectedCategoryKey == null ? "" : selectedCategoryKey) : selectedCategory.nazwa;
        }
 private void tvCategories_AfterSelect(object sender, TreeViewEventArgs e)
 {
     if (e.Node.Name == "0")
     {
         selectedCategory = null;
         labSelectedCategoryName.Text = "Książki bez kategorii";
         labSelectedCategoryName.ForeColor = Color.FromArgb(0, 0, 255);
     }
     else if (e.Node.Name == "1")
     {
         selectedCategory = null;
         labSelectedCategoryName.Text = "Wszystkie kategorie";
         labSelectedCategoryName.ForeColor = Color.FromArgb(0, 0, 255);
     }
     else
     {
         selectedCategory = (new BibliotekaDataContext()).Kategorias.Where(x => x.nazwa == e.Node.Text).Single();
         labSelectedCategoryName.Text = selectedCategory.nazwa;
         labSelectedCategoryName.ForeColor = Color.FromArgb(0, 0, 0);
     }
     EPCategories.SetError(labSelectedCategoryName, null);
     EPCategories.SetError(cbSubCatsDecision, null);
 }
		private void detach_Kategorias(Kategoria entity)
		{
			this.SendPropertyChanging();
			entity.Kategoria1 = null;
		}
		private void attach_Kategorias(Kategoria entity)
		{
			this.SendPropertyChanging();
			entity.Kategoria1 = this;
		}
 partial void DeleteKategoria(Kategoria instance);
 partial void UpdateKategoria(Kategoria instance);
 partial void InsertKategoria(Kategoria instance);