Jak ponownie użyć identyfikatorów skasowanych recordów?

0

Cześć, mam taki problem, że gdy kasuję rekordy z bazy to nie mogę zapisać w miejsce skasowanego nowego rekordu, tylko liczy cały czas do przodu.

Oto kod programu, coś źle wykonuję?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Rozliczacz
{
    public partial class Form1 : Form
    {
        int a = 0;
        int newId = 0;
        public Form1()
        {
            InitializeComponent();

            tableDataGridView.EnableHeadersVisualStyles = false;
            tableDataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["dataGridViewTextBoxColumn1"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["dataGridViewTextBoxColumn2"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["dataGridViewTextBoxColumn3"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["dataGridViewTextBoxColumn4"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["dataGridViewTextBoxColumn5"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["dataGridViewTextBoxColumn6"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["dataGridViewTextBoxColumn7"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.RowHeadersVisible = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            a = 1;
            tableDataGridView.AllowUserToAddRows = true;
            string numer_rysunku;
            int ilosc_wykonana;
            float cena_sztuka;
            float cena_calosc;
            string komentarz;

            //BindingSource bindingSource = (BindingSource)tableDataGridView.DataSource;
            DataTable dataTable = database1DataSet.Table;

            numer_rysunku = textBox1.Text;
            ilosc_wykonana = int.Parse(textBox2.Text);
            cena_sztuka = float.Parse(textBox3.Text);
            komentarz = textBox4.Text;
            cena_calosc = ilosc_wykonana * cena_sztuka;

            if (dataTable.Rows.Count > 0)
            {
                newId = dataTable.Rows.Count+1;
            }

            else
            {
                newId = 1;
            }

            dataTable.Rows.Add(newId, DateTime.UtcNow, numer_rysunku, ilosc_wykonana, cena_sztuka, cena_calosc, komentarz);
            tableDataGridView.DataSource = database1DataSet.Table;

            textBox6.Text = "0";
            for (int i = 0; i < tableDataGridView.Rows.Count; i++)
            {
                if (tableDataGridView.Rows[i].Cells["dataGridViewTextBoxColumn6"].Value != null)
                {
                    textBox6.Text = Convert.ToString(float.Parse(textBox6.Text) + float.Parse(tableDataGridView.Rows[i].Cells["dataGridViewTextBoxColumn6"].Value.ToString()));
                }
            }

            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);
            dataTable.AcceptChanges();
            this.tableTableAdapter.Fill(this.database1DataSet.Table);
        }

        private void button2_Click(object sender, EventArgs e)
        {

            DataTable dataTable = database1DataSet.Table;

            if (tableDataGridView.Rows.Count > 0 && a == 1)
            {
                tableDataGridView.AllowUserToAddRows = false;

                DataRow lastRow = dataTable.Rows[dataTable.Rows.Count - 1];
                lastRow.Delete(); // Usuwanie wiersza

                tableDataGridView.DataSource = database1DataSet.Table;

                textBox6.Text = "0";
                for (int i = 0; i < tableDataGridView.Rows.Count; i++)
                {

                    if (tableDataGridView.Rows[i].Cells["dataGridViewTextBoxColumn6"].Value != null)
                    {
                        textBox6.Text = Convert.ToString(float.Parse(textBox6.Text) + float.Parse(tableDataGridView.Rows[i].Cells["dataGridViewTextBoxColumn6"].Value.ToString()));
                    }
                }
            }

            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);
        }

        private void button3_Click(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: Ten wiersz kodu wczytuje dane do tabeli 'database1DataSet.Table' . Możesz go przenieść lub usunąć.
            this.tableTableAdapter.Fill(this.database1DataSet.Table);
        }

        private void tableBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);

        }
    }
}

0

W miejsce skasowanego czyli masz na myśli żeby ten nowy rekord miał to sam id co usunięty?

0

Tak dokładnie o to mi chodzi.

4

tak sie nie robi. Nie reuzywa sie idkow. A jak chcesz reuzywać to musisz to recznie obsłużyć i samemu nadawać idki. Ale w wielowatkowej aplikacji pewnie sie to rozwali

1

Jak masz w bazie kolumnę id ustawiona tak że sama się wypełnia to musisz zaktualizować rekord a nie usuwać i dodawać nowy. Ewentualnie możesz pobrać id tego rekordu który usuwasz, ustawić w bazie seed na id ktore usunąłeś (czy tam o 1 niższy) i wtedy Ci wstawi nowy rekord z tym id co chcesz, tylko potem musiałbyś seed ustawić z powrotem na tym co był ale to chyba za gruba misja

0

Ale w wielowatkowej aplikacji pewnie sie to rozwali przecież to formy, tu chyba nic wielowatkowego nie bedzie sie działo :P

2
czarnygej napisał(a):

W miejsce skasowanego czyli masz na myśli żeby ten nowy rekord miał to sam id co usunięty?

bboylubsko napisał(a):

Tak dokładnie o to mi chodzi.

Nie, nie, nieeeeeeee

A żródłem pozornego problemu jest to, że przykładasz zbyt wielkie oczekiwania do ID, np nie dostarczasz swojego sortowania

ALBO żle myślisz o tej parze czynności, bo chciałeś UPDATE

0

Po prostu chciałem coś zrobić w celu archiwizacji usuniętych rekordów, np. w drugiej bazie. Jak byłby taki nieład w Id ciężko byłoby to ogarnąć. Czy jest możliwość, że np. rekord zaznaczony w dataGridView już by był interpretowany jako wybrany do przeprowadzenia na nim operacji usunięcia i archiwizacji w drugiej bazie danych?

Ledwo co liznąłem temat na studiach, poświęcono całe 40 minut na omówienie baz danych więc może faktycznie robię jakieś podstawowe błędy.

Dziękuję za odpowiedzi.

0

Pytanie podstawowe, czy wiesz co robisz?
Jeśli tak to wiesz jak to wygląda krok po kroku.
Jeśli wiesz jak to wygląda krok po kroku to implementujesz mechanizmy sprawdzające - np. zapis do pliku kolejno wykonywanych działań.
Jak nie masz takich umiejętności to napisanie Ci odpowiedzi pomoże Ci tylko w tym jednym wypadku, a Ty potrzebujesz się nauczyć kontrolować działanie programu - kontrolować czyli wydawać polecenia i sprawdzać ich wykonania.
W tym wypadku jak masz taki problem to kreujesz 2 minimalne bazy danych np. 3 elementowe (akurat żeby można było posortować) drugą pustą i projektujesz rozwiązanie, tak jak to piszesz usuwające jeden rekord i sprawdzając czy przed tym został zapisany do drugiej bazy danych.
Tak jak pisałęm "np. zapis do pliku kolejno wykonywanych działań." - i tutaj kolejno sprawdzasz 1) czy została wykonana reakcja na klikniećie 2) czy rekord został odczytany w prawidłowy sposób 3) czy został utworzony nowy a w pustej bazie danych 4) czy wartości nowego rekordu w drugiej bazie danych są takie same jak oryginału 5) czy stary rekord został usunięty.

Z tego co piszesz, w którymś miejscu masz błąd, i to zapewne jest jeden z tych obszarów które wskazałem.

5
bboylubsko napisał(a):

Po prostu chciałem coś zrobić w celu archiwizacji usuniętych rekordów, np. w drugiej bazie.

W realnym programowaniu, np system biznesowy, rzadko zachodzi takie zwyczajne kasowanie. Nie można tak sobie skasować Kontrahenta (choć firma zlikwidowana) bo posiada dokumenty historyczne itd ... znacznie częściej się daje znacznik "Nieaktywny". Nie ma żadnego problemu ilosciowego, bazy to wytrzymują

I tu docieramy do rdzenia: bardzo rzadko się prezentuje w komponencie GUI banalne select * from - praktycznie zawsze są to bardziej złożone kwerendy

Więc słowo "kasowanie" ale i "archiwizacja" zasługują na dłuższe pomedytowanie, Np archiwizacja w jakim celu ? Bo każda będzie miał inny odcień.

0

Kurczę, wydaje mi się, że staracie mi się coś przekazać, lecz to co chcecie przekazać jest zbyt obszerne by mi to przekazać.
Od razu zaznaczę, nie jest to aplikacja konsumencka. Powstała z powodu uporządkowania sobie rzeczy w pracy.
Ot tak wpadło mi do głowy, że coś napomknęli na studiach o bazie danych i można to wykorzystać, lecz teraz wiem, że nie zostało przedstawione jakieś podejście do tego wszystkiego.
Panowie pewnie pracują w tym zawodowo, więc mogą patrzeć z góry na wywody "ledwo co kojarzącego" (celowo tak podkreślam, może niektórzy tak, nie twierdzę, że wszyscy, bo widać zrozumienie w niektórych postach), ale nic od razu nie ruszy od kopa.

Może od razu powinienem opisać całą sytuację. Aplikacja, którą tworzę miała mi służyć do uporządkowania spraw związanych z pracą. Chciałem mieć spokój od karteczek i mieć to zapisane w bazie danych. Ba, nawet mój mózg sięgnął tak daleko fantazją, żeby stworzyć drugą aplikację i bazę danych umieścić na jakimś serwerze, żeby obie strony miały do niej dostęp.
Ale śmiechem zabiję ostatnie zdanie ze względu na możliwości piszącego. Czyli podsumowując, odnoszenie się do rekordów w bazie danych poprzez ich numer identyfikacyjny jest niepoprawne (choć jest on unikatowy).
Jak pisałem chciałbym teraz spróbować zrealizowac takie rozwiązanie:
Zaznaczam interesujący mnie rekord w bazie danych w oknie dataGridView -> Klikam przycisk KASUJ lub ARCHIWIZUJ -> Rekord znika z bieżącej bazy danych. W przypadku archiwizacji dodawany jest rekord w drugiej bazie danych o nazwie Archiwum lub coś w tym stylu.

2
bboylubsko napisał(a):

Czyli podsumowując, odnoszenie się do rekordów w bazie danych poprzez ich numer identyfikacyjny jest niepoprawne (choć jest on unikatowy).

Odnoszenie się do rekordu po ID jest poprawne W TEJ SAMEJ BAZIE (i m.in. dlatego po kasowaniu są "marnowane" - unikalnosc nie tylko w przestrzeni, ale w czasie)

Oczekiwanie zachowania tożsamości po ID w różnych bazach danych*) jest mrzonką
Zachowanie tożsamości pomiędzy różnymi bazami danych ztcw realizuje się na dwa sposoby:
po UUID/GUID
po kluczu naturalnym, np Polacy po PESEL (choć, jak przemyśleć dokaldnie, ma to ograniczenia)

*) chyba że ta "druga" baza danych jest tylko repliką pierwszej

2

Nie robisz tego w opisany sposób.
Przeczytaj dwa razy co napisał @ZrobieDobrze
Wyobraź sobie sytuację:
Masz wiersz w bazie z ID 5. Kasujesz go według swojego schematu. Ten wpis idzie z ID5 do innej bazy. Na jego miejscu zapisujesz inny rekord i wykorzystujesz to "wolne ID" Co się stanie z rekordem jeśli znów będziesz chciał go usunąć i zarchiwizować. Nastąpi kolizja ID w innej bazie, tej od archiwizacji.
Także nie rób tego w ten sposób.
Albo w ogóle nie potrzebujesz inkrementowanego ID, albo nie potrzebujesz takiej archiwizacji.
Prędzej czy później baza się rozrośnie i będziesz potrzebował mieć do tego rekordu jakąś tabelę zależną gdzie ID będzie kluczem obcym np. opisana już faktura-firma. Nagle wszystkie faktury firmy X mogą stać się fakturami firmy Y.
Albo na Twoim przykładzie rysunek może mieć złączenie z osobą która go wykonała, firmą dla której go wykonano.
Dlaczego upierasz się by ID nadawane przez bazę miało ciągłość? Może potrzebujesz własnego numeru?
Przemyśl temat jeszcze raz.

5

"Cześć, mam taki problem, że gdy kasuję rekordy z bazy to nie mogę zapisać w miejsce skasowanego nowego rekordu, tylko liczy cały czas do przodu." - ja mu napisałem jak rozwiązywać takie problemy. Poza tym o czym Ty piszesz, chłopak ma wygenerowany kod który jakoś tam się kompiluje znaczy narzędzia ma. Rozumiem, że Ty mu powiesz tak "bez kompilatora za 50 tysięcy to nawet się nie zabieraj do takiej roboty". Co Ty właściwie tutaj robisz @cerrato ?

Może to lekki offtop, ale go umieszczę, bo wydaje mi się, że jest to dość ważna uwaga.

Totalnie nie zgadzam się z tym, co @johnny_Be_good napisał w powyższym cytacie. Na tym polega różnica między wiedzą a doświadczeniem/mądrością. Johnny może i ma wiedzę i jest w stanie napisać kod, który rozwiązuje problem pytającego, ale na sprawę trzeba spojrzeć szerzej (o czym pisali powyżej @jurek1980, @AnyKtokolwiek czy @ZrobieDobrze).
OK, może podane przez Ciebie rozwiązanie jest poprawne pod względem technicznym (za bardzo nie analizowałem Twojej odpowiedzi, bo nie ma większego sensu iść tą drogą), ale nadal - za wiele nie wnosi do tematu. Pozwala pytającemu pozornie rozwiązać jeden problem, ale tak naprawdę to zastosowanie się do Twoich rad spowoduje powstanie kilku kolejnych, do tego poważnych - które spowodują bałagan w bazie i rozjechanie się trzymanych tam danych.

jaki sobie cel obrałeś, zniechęcić do nauki tylu ludzi ilu dasz radę?

Zauważ, że pytający sam napisał o sobie, że jest początkujący i ledwo co kojarzy temat. Dostał życzliwe odpowiedzi, w których tłumaczyliśmy, że to kiepski pomysł zrobić to w sposób, w jaki on planował. A potem wpadł @johnny_Be_good, napisał coś z czym się nikt w wątku nie zgadza, a do tego zacząłeś mnie obrażać. Co do Twoich wycieczek po mnie - raczej to spłynęło i zbytnio mnie ruszyło. Ale mimo wszystko - ze względu chociażby na @bboylubsko czy osoby, które będą czytać później ten wątek, trzeba jasno i stanowczo zaznaczyć, że nie masz racji, a swoją "pomocą" możesz spowodować więcej szkód, niż pożytku.

Jeśli ktoś pyta, jak grabiami zamontować lampę, to prawdziwa pomoc nie polega na tym, żeby mu ten absurdalny pomysł rozbić na poszczególne kroki i wyjaśnić jak to ogarnąć, ale powiedzieć, że grabie nie służą do tego. Osoba pytająca w tym wątku miała swoją wizję. Jak sama zaznaczyła - jest początkująca i za bardzo się nie zna na temacie. My staramy się jej pokazać, że opcja, którą sobie wymyśliła jest kiepska. A potem wpadasz Ty i zarzucasz mi, że tłumacząc to, że grabie nie są narzędziem elektryka, chcę kogoś zniechęcić. Wydaje mi się, że @bboylubsko raczej to zrozumiał i docenił, że osoby bardziej doświadczone i z większą wiedzą od niego podpowiadają, jak to można zrobić porządnie a nie w sposób, jaki On sobie wykombinował.

3

Żeby zachować chronologię stosuj daty, a nie opieraj się na kluczu.

Zamiast przenoszenia do drugiej bazy podczas kasowania/archiwizacji, stosuj odpowiednie flagi, tj. "ARCHIVED". Przy pobieraniu określ status, który chcesz pobrać - ACTIVE / ARCHIVED

Naprawdę, nie przejmuj się IDkami w ten sposób, w jaki się przejmujesz.

0

Ogólnie to tak jak przedmówcy, raczej mało kto usuwa dane z tablicy, zazwyczaj są one oflagowywane na zasadzie "inUse/archival", a następnie odpowiednio odfiltrowywane i listowane w tabelce.
Natomiast jeśli po prostu razi Ciebie to, że Id-ki nie są poukładane to może warto się zastanowić, czy nie lepiej byłoby zamiast pobierać całej tabeli z bazy danych, pobrać tylko cześć (bez id) a następnie dodać tą tabelę (id) wraz z funkcją inkrementacji wartości już w momencie ładowania/odświeżania danych.

0

Dzięki za odpowiedzi. Chciałem mieć porządek z ID, ale tak jak mówicie, może zrobię to w sposób taki, że dodam flagę.
Niestety nie mam pojęcia czym są flagi w bazie danych i jak się je nadaje i zdejmuje, ale kwestia do poczytania.

Czyli przede mną następujące problemy techniczne do rozwikłania:

  1. Jak rozpoznać, który rekord jest zaznaczony w GridView, np. chciałbym nadać flagę na zaznaczonym rekordzie w programie.
  2. Jak przypisać flagę ARCHIVED do zaznaczonego rekordu (kliknę przycisk archiwizuj to jest nakładana flaga na rekord).
  3. Jak odfiltrować rekordy w bazie, żeby w zakładce aktualne mieć wylistowane tylko rekordy bez tej flagi (element GridView1).
  4. Jak odfiltrować rekordy w bazie, żeby w zakładce zarchiwizowane mieć tylko rekordy z nałożoną flagą ARCHIVED (element GridView2).

Zastosowanie flag znacząco upraszcza sytuację, bo z tego co wywnioskowałem dane dalej pozostają w jednej bazie danych, nie muszę tworzyć drugiej pod archiwum.
Wszystko tylko zależy od tego jak użytkownik przefiltruje rekordy.

Czy teraz założenia są poprawne i mógłbym przejść do strony rozwiązania mojego planu w sposób techniczny, czy jeszcze na etapie założeń jest błędne podejście do sprawy?

Bardzo dziękuję za odpowiedzi, widać że nawet niedoświadczona osoba może liczyć na naprostowanie swoich pomysłów, tak aby było to zgodne z ogólno przyjętymi zasadami.

Na ten moment aplikacja prezentuje się następująco, 4 przyciski i nic więcej bym od tego nie oczekiwał :)

444.PNG

1

Flaga to po prostu kolumna typu bit czyli 0 albo 1. Tworzysz w bazie danych w swojej tabeli Produkt (czy jak się tam nazywa) kolumnę np. Active, jak produkt jest git to dajesz tam 1, jak chcesz usunąć produkt to ustawiasz 0. Jak pobierasz produkty to dajesz warunek where Active = 1 i pobiera Ci tylko te które są ok. Teraz przeczytałem więcej tego posta i widzę że potrzebujesz flagi Archived - analogicznie do przykładu z Active tylko oczywiście na odwrót - 0 jest ok a 1 nie. Takich flag różnych możesz mieć ile chcesz w tabeli. A flagę jak zmienić to UPDATE w bazie danych typu update Produkt set Archived = 1 where Id = X

0

Dodałem kolejną kolumnę, dzięki za post. Teraz kombinuję jak wykryć zaznaczony rekord w DataGridView, oto kod podpięty pod przycisk kasowania, jednak nie działa on poprawnie, bo o ile rekord znika z dataGridView to po ponownym włączeniu aplikacji rekord widnieje ponownie, czyli nie są zachowywane zmiany w bazie danych. Mógłby ktoś wskazać co jest nie tak?

        private void button2_Click(object sender, EventArgs e)
        {
            DataTable dataTable = database1DataSet.Table;

            if (tableDataGridView.Rows.Count > 0)
            {
                tableDataGridView.AllowUserToAddRows = false;

                int selectedIndex = tableDataGridView.SelectedRows[0].Index; // Pobierz indeks zaznaczonego wiersza
                DataRowView selectedRow = (DataRowView)tableDataGridView.SelectedRows[0].DataBoundItem; // Pobierz dane zaznaczonego wiersza
                database1DataSet.Table.Rows.RemoveAt(selectedIndex);                // Usuń rekord z DataTable

                tableDataGridView.DataSource = database1DataSet.Table;

                textBox6.Text = "0";
                for (int i = 0; i < tableDataGridView.Rows.Count; i++)
                {

                    if (tableDataGridView.Rows[i].Cells["CENACALA"].Value != null)
                    {
                        textBox6.Text = Convert.ToString(float.Parse(textBox6.Text) + float.Parse(tableDataGridView.Rows[i].Cells["CENACALA"].Value.ToString()));
                    }
                }
            }

            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);
        }
0

A nie masz tak automatycznego seedowania bazy danych przy włączeniu aplikacji? Czyli że zawsze Ci tworzy podane dane na nowo przy starcie apki

0

Dane z poziomu kodu nie są dodawane, jedynie przez wpisanie ich ręcznie w aplikacji, nie wiem czy dobrze Cię zrozumiałem :). Może podeślę filmik, który przedstawi lepiej sytuację.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Rozliczacz
{
    public partial class Form1 : Form
    {
        int newId = 0;
        public Form1()
        {
            InitializeComponent();

            if (label9.Text == "0")
            { 
                label9.Visible = false; 
            }

            else
            { 
                label9.Visible = true; 
            }

            if (label10.Text == "0")
            { 
                label10.Visible = false; 
            }

            else
            { 
                label10.Visible = true; 
            }

            button9.Visible = false;

            tableDataGridView.EnableHeadersVisualStyles = false;
            tableDataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["DATA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["RYSUNEK"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["CENASZTUKA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["CENACALA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["SZTUKI"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["KOMENTARZ"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["ARCHIWIZACJA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.RowHeadersVisible = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox6.Text = "0";

            tableDataGridView.AllowUserToAddRows = false;
            string numer_rysunku;
            int ilosc_wykonana;
            float cena_sztuka;
            float cena_calosc;
            string komentarz;

            DataTable dataTable = database1DataSet.Table;

            numer_rysunku = textBox1.Text;
            ilosc_wykonana = int.Parse(textBox2.Text);
            cena_sztuka = float.Parse(textBox3.Text);
            komentarz = textBox4.Text;
            cena_calosc = ilosc_wykonana * cena_sztuka;

            if (dataTable.Rows.Count > 0)
            {
                newId = dataTable.Rows.Count + 1;
            }

            else
            {
                newId = 1;
            }

            dataTable.Rows.Add(newId, DateTime.Now, numer_rysunku, ilosc_wykonana, cena_sztuka, cena_calosc, komentarz, 0);
            tableDataGridView.DataSource = database1DataSet.Table;

            for (int i = 0; i < tableDataGridView.Rows.Count; i++)
            {
                if (tableDataGridView.Rows[i].Cells["CENACALA"].Value != null)
                {
                    textBox6.Text = Convert.ToString(float.Parse(textBox6.Text) + float.Parse(tableDataGridView.Rows[i].Cells["CENACALA"].Value.ToString()));
                }
            }

            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);
            dataTable.AcceptChanges();
            this.tableTableAdapter.Fill(this.database1DataSet.Table);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            DataTable dataTable = database1DataSet.Table;

            if (tableDataGridView.Rows.Count > 0)
            {
                tableDataGridView.AllowUserToAddRows = false;

                int selectedIndex = tableDataGridView.SelectedRows[0].Index; // Pobierz indeks zaznaczonego wiersza
                DataRowView selectedRow = (DataRowView)tableDataGridView.SelectedRows[0].DataBoundItem; // Pobierz dane zaznaczonego wiersza
                database1DataSet.Table.Rows.RemoveAt(selectedIndex);                // Usuń rekord z DataTable

                tableDataGridView.DataSource = database1DataSet.Table;

                textBox6.Text = "0";
                for (int i = 0; i < tableDataGridView.Rows.Count; i++)
                {

                    if (tableDataGridView.Rows[i].Cells["CENACALA"].Value != null)
                    {
                        textBox6.Text = Convert.ToString(float.Parse(textBox6.Text) + float.Parse(tableDataGridView.Rows[i].Cells["CENACALA"].Value.ToString()));
                    }
                }
            }

            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);
        }

        private void button3_Click(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: Ten wiersz kodu wczytuje dane do tabeli 'database1DataSet.Table' . Możesz go przenieść lub usunąć.
            this.tableTableAdapter.Fill(this.database1DataSet.Table);
            try
            {
                DataTable dataTable = database1DataSet.Table;
                tableDataGridView.DataSource = database1DataSet.Table;

                textBox6.Text = "0";
                for (int i = 0; i < tableDataGridView.Rows.Count; i++)
                {
                    if (tableDataGridView.Rows[i].Cells["dataGridViewTextBoxColumn6"].Value != null)
                    {
                        textBox6.Text = Convert.ToString(float.Parse(textBox6.Text) + float.Parse(tableDataGridView.Rows[i].Cells["dataGridViewTextBoxColumn6"].Value.ToString()));
                    }
                }
            }

            catch 
            {
            }

        }

        private void tableBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);

        }

        private void button10_Click(object sender, EventArgs e)
        {
            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = "calc";
            info.UseShellExecute = true;
            Process.Start(info);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            int x = 1;
            string path = Application.StartupPath + "/Zrzuty";
            string filename = x + ".png";

            if (!Directory.Exists(path))
            {
                if (label10.Text == "0")
                {
                    label10.Visible = false;
                }
                else
                {
                    label10.Visible = true;
                    label10.Text = "Błąd!";
                    label10.ForeColor = Color.Red;
                }

                MessageBox.Show("Folder \"Zrzuty\" nie istnieje.", "Błąd");
                return;
            }
            

            else
            {
                Rectangle bounds = this.Bounds;
                using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
                {
                    using (Graphics g = Graphics.FromImage(bitmap))
                    {
                        g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                    }

                    while (File.Exists(path + @"\" + filename))
                    {
                        x = x + 1;
                        filename = x + ".png";
                    }

                    bitmap.Save(path + @"\" + filename);
                    label10.Text = filename;
                    label10.ForeColor = Color.Green;

                    label9.Text = "Zapisano plik:";
                    if (label9.Text == "0")
                    { 
                        label9.Visible = false;
                    }

                    else
                    { 
                        label9.Visible = true;
                    }

                    if (label10.Text == "0")
                    { 
                        label10.Visible = false;
                    }

                    else
                    { 
                        label10.Visible = true;
                    }
                }
            }
        }

        private void label9_Click(object sender, EventArgs e)
        {
            string path = Application.StartupPath + "/Zrzuty";

            if (!Directory.Exists(path))
            {
                MessageBox.Show("Folder \"Zrzuty\" nie istnieje.", "Błąd");
                return;
            }

            Process.Start(new ProcessStartInfo()
            {
                FileName = path,
                UseShellExecute = true,
                Verb = "open"
            });
        }

        private void label10_Click(object sender, EventArgs e)
        {
            string filename = label10.Text;
            string path = Application.StartupPath + "/Zrzuty" + @"\" + filename;

            if (!File.Exists(path))
            {
                MessageBox.Show("Plik nie istnieje.", "Błąd");
                return;
            }

            var p = new Process();
            p.StartInfo = new ProcessStartInfo(path)
            {
                UseShellExecute = true
            };
            p.Start();
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked == true)
            {
                this.tableDataGridView.Location = new Point(0, 60);

                label5.Location = new Point(7, 384);
                textBox5.Location = new Point(142,383);

                label6.Location = new Point(488, 384);
                textBox6.Location = new Point(604, 383);

                label7.Location = new Point(726, 384);

                button1.Visible = false;
                button2.Visible = false;
                button3.Visible = false;
                button4.Visible = false;

                button9.Visible = true;
                this.Size = new Size(772, 465);
                this.CenterToScreen();
            }
            else 
            {
                this.tableDataGridView.Location = new Point(260, 134);

                label5.Location = new Point(264, 464);
                textBox5.Location = new Point(399, 463);

                label6.Location = new Point(748, 464);
                textBox6.Location = new Point(864, 463);

                label7.Location = new Point(986, 464);

                button1.Visible = true;
                button2.Visible = true;
                button3.Visible = true;
                button4.Visible = true;

                button9.Visible = false;
                this.Size = new Size(1049, 553);
                this.CenterToScreen();
            }
        }

        private void tableDataGridView_LocationChanged(object sender, EventArgs e)
        {

        }

        private void button9_Click(object sender, EventArgs e)
        {
            int x = 1;
            string path = Application.StartupPath + "/Zrzuty";
            string filename = x + ".png";

            if (!Directory.Exists(path))
            {
                MessageBox.Show("Folder \"Zrzuty\" nie istnieje.", "Błąd");
                return;
            }


            else
            {
                Rectangle bounds = this.Bounds;
                using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
                {
                    using (Graphics g = Graphics.FromImage(bitmap))
                    {
                        g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                    }

                    while (File.Exists(path + @"\" + filename))
                    {
                        x = x + 1;
                        filename = x + ".png";
                    }

                    bitmap.Save(path + @"\" + filename);
                }
            }
        }
    }
}

1

@bboylubsko:

label11 button3 - tego nie da sie czytać.
Nawet tak wiodące, że od nich coś zależy jak label9
Ify wg talemnej zawartości buttona17.Label == "0"

Ktoś obcy z miejsca jest rozstrzelany, ale i ty sam musisz tracić multum energii na domyślanie się, zwłaszcza po przerwie.
Właściwość "Name" jest do tego, aby je używać.

0

Poradziłem sobie z tym stosując komendy sqlconnection:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Rozliczacz
{
    public partial class Form1 : Form
    {
        int newId;
        private string connectionString = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=" + Application.StartupPath + "\\Database1.mdf;Integrated Security=True"; // Aktualizuj ścieżkę do pliku .mdf

        public Form1()
        {
            InitializeComponent();

            tableDataGridView.EnableHeadersVisualStyles = false;
            tableDataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["DATA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["RYSUNEK"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["CENASZTUKA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["CENACALA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["SZTUKI"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["KOMENTARZ"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["ARCHIWIZACJA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.RowHeadersVisible = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox6.Text = "0";

            if (string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox2.Text) || string.IsNullOrWhiteSpace(textBox3.Text) || string.IsNullOrWhiteSpace(textBox4.Text))
            {
                MessageBox.Show("Wszystkie pola muszą być wypełnione.", "Błąd");
                return;
            }

            tableDataGridView.AllowUserToAddRows = false;
            string numer_rysunku;
            int ilosc_wykonana;
            float cena_sztuka;
            float cena_calosc;
            string komentarz;

            DataTable dataTable = (DataTable)tableDataGridView.DataSource;

            numer_rysunku = textBox1.Text;
            ilosc_wykonana = int.Parse(textBox2.Text);
            cena_sztuka = float.Parse(textBox3.Text);
            komentarz = textBox4.Text;
            cena_calosc = ilosc_wykonana * cena_sztuka;

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                using (SqlCommand command = new SqlCommand("INSERT INTO [Table] (DATA, RYSUNEK, SZTUKI, CENASZTUKA, CENACALA, KOMENTARZ, ARCHIWIZACJA) VALUES (@Data, @Rysunek, @Sztuki, @CenaSztuka, @CenaCalosc, @Komentarz, @Archiwizacja); SELECT SCOPE_IDENTITY();", connection))
                {
                    command.Parameters.AddWithValue("@Data", DateTime.Now);
                    command.Parameters.AddWithValue("@Rysunek", numer_rysunku);
                    command.Parameters.AddWithValue("@Sztuki", ilosc_wykonana);
                    command.Parameters.AddWithValue("@CenaSztuka", cena_sztuka);
                    command.Parameters.AddWithValue("@CenaCalosc", cena_calosc);
                    command.Parameters.AddWithValue("@Komentarz", komentarz);
                    command.Parameters.AddWithValue("@Archiwizacja", 0);
                    int newId = Convert.ToInt32(command.ExecuteScalar());
                    dataTable.Rows.Add(newId, DateTime.Now, numer_rysunku, ilosc_wykonana, cena_sztuka, cena_calosc, komentarz, 0);
                    tableDataGridView.DataSource = dataTable;
                }
            }

            float sum = 0;
            foreach (DataRow row in dataTable.Rows)
            {
                if (!row.RowState.Equals(DataRowState.Deleted))
                {
                    float cenaCalosc = float.Parse(row["CENACALA"].ToString());
                    sum += cenaCalosc;
                }
            }
            textBox6.Text = sum.ToString();
        }



        private void button2_Click(object sender, EventArgs e)
        {
            if (tableDataGridView.SelectedRows.Count > 0)
            {
                int selectedIndex = tableDataGridView.SelectedRows[0].Index;
                DataRowView selectedRow = (DataRowView)tableDataGridView.SelectedRows[0].DataBoundItem;
                int id = Convert.ToInt32(selectedRow["Id"]);

                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    using (SqlCommand command = new SqlCommand("DELETE FROM [Table] WHERE Id = @Id", connection))
                    {
                        command.Parameters.AddWithValue("@Id", id);
                        command.ExecuteNonQuery();
                    }
                }

                ((DataTable)tableDataGridView.DataSource).Rows.RemoveAt(selectedIndex);

                float sum = 0;
                foreach (DataRow row in ((DataTable)tableDataGridView.DataSource).Rows)
                {
                    if (!row.RowState.Equals(DataRowState.Deleted))
                    {
                        float cenaCalosc = float.Parse(row["CENACALA"].ToString());
                        sum += cenaCalosc;
                    }
                }
                textBox6.Text = sum.ToString();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    using (SqlCommand command = new SqlCommand("SELECT * FROM [Table]", connection))
                    {
                        DataTable dataTable = new DataTable();
                        SqlDataAdapter adapter = new SqlDataAdapter(command);
                        adapter.Fill(dataTable);

                        tableDataGridView.DataSource = dataTable;

                        textBox6.Text = "0";
                        foreach (DataRow row in dataTable.Rows)
                        {
                            if (!row.RowState.Equals(DataRowState.Deleted))
                            {
                                float cenaCalosc = float.Parse(row["CENACALA"].ToString());
                                textBox6.Text = (float.Parse(textBox6.Text) + cenaCalosc).ToString();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Wystąpił błąd podczas ładowania danych: " + ex.Message, "Błąd");
            }
        }

        private void tableBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);

        }
        }

    }
}

1
bboylubsko napisał(a):

Dodałem kolejną kolumnę, dzięki za post. Teraz kombinuję jak wykryć zaznaczony rekord w DataGridView, oto kod podpięty pod przycisk kasowania, jednak nie działa on poprawnie, bo o ile rekord znika z dataGridView to po ponownym włączeniu aplikacji rekord widnieje ponownie, czyli nie są zachowywane zmiany w bazie danych. Mógłby ktoś wskazać co jest nie tak?

        private void button2_Click(object sender, EventArgs e)
        {
            DataTable dataTable = database1DataSet.Table;

            if (tableDataGridView.Rows.Count > 0)
            {
                tableDataGridView.AllowUserToAddRows = false;

                int selectedIndex = tableDataGridView.SelectedRows[0].Index; // Pobierz indeks zaznaczonego wiersza
                DataRowView selectedRow = (DataRowView)tableDataGridView.SelectedRows[0].DataBoundItem; // Pobierz dane zaznaczonego wiersza
                database1DataSet.Table.Rows.RemoveAt(selectedIndex);                // Usuń rekord z DataTable

                tableDataGridView.DataSource = database1DataSet.Table;

                textBox6.Text = "0";
                for (int i = 0; i < tableDataGridView.Rows.Count; i++)
                {

                    if (tableDataGridView.Rows[i].Cells["CENACALA"].Value != null)
                    {
                        textBox6.Text = Convert.ToString(float.Parse(textBox6.Text) + float.Parse(tableDataGridView.Rows[i].Cells["CENACALA"].Value.ToString()));
                    }
                }
            }

            this.Validate();
            this.tableBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.database1DataSet);
        }

W tym przykładzie po linijce

database1DataSet.Table.Rows.RemoveAt(selectedIndex); // Usuń rekord z DataTable

Powinieneś na database1DataSet zastosować jakąś metodę zatwierdzającą stan tablicy, nie pamietam dokładnie, ale jest to albo AcceptChanges(), albo SaveChanges().
Dodatkowo to tak jak @ZrobieDobrze napisał, stosuj jakieś konwencje nazewnicze, bo label1-labelx nic nikomu nie mówi, nawet jeśli jest to jedynie dla Ciebie, to jak za rok usiądziesz do kodu to sam się pogubisz.
Mógłbyś jeszcze spróbować podzielić kod na mniejsze części, bo 400 linijek kodu i to jeszcze w klasie z eventami to dużo, według mnie bardzo dużo (sam wyznaję zasadę 100 linijek na klasę).

Edit:
Właśnie zauważyłem, że nawet w metodzie button1_Click() dokładnie w linijce 99 jest komenda:

99. dataTable.AcceptChanges();

Której brakowało w metodzie służącej do usuwania rekordów.
Jeśli już stosujesz jakąś konwencję, w tym wypadku operacje na danych przy wykorzystaniu ADO.NET (DataSet), to się jej trzymaj, nie mieszaj tego z operacjami wykonywanymi na SqlCommand

0

Dziękuję za opinie, mam nadzieje, że teraz kod jest bardziej przejrzysty. Proszę o komentarz co do poprawności, według mnie działa dobrze. Faktycznie zabrakło dataTable.AcceptChanges();. Przerzuciłem się jednak na SqlCommand mam nadzieję, że nie mam zbyt dużego bałaganu. Kod postaram się podzielić jak tylko poczytam jak tego dokonać :)

using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace Rozliczacz
{
    public partial class Form1 : Form
    {
        private string connectionString = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=" + Application.StartupPath + "\\Database1.mdf;Integrated Security=True";
        private DataTable dataTable;

        public Form1()
        {
            InitializeComponent();

            LabelOtwierajacyFolderZeZrzutem.Visible = (LabelOtwierajacyFolderZeZrzutem.Text != "0");
            LabelOtwierajacyPlikZeZrzutem.Visible = (LabelOtwierajacyPlikZeZrzutem.Text != "0");
            PrzyciskWykonajZrzutEkranuTrybMin.Visible = false;
            PrzyciskArchiwizujRekord.Visible = true;
            PrzyciskPrzywrocRekord.Visible = false;

            PrzyciskWyswietlBiezaceDane.BackColor = Color.FromArgb(84, 133, 224);

            tableDataGridView.EnableHeadersVisualStyles = false;
            tableDataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["DATA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["RYSUNEK"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["CENASZTUKA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["CENACALA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["SZTUKI"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["KOMENTARZ"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.Columns["ARCHIWIZACJA"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            tableDataGridView.RowHeadersVisible = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    using (SqlCommand command = new SqlCommand("SELECT * FROM [Table] WHERE ARCHIWIZACJA = 0", connection))
                    {
                        SqlDataAdapter adapter = new SqlDataAdapter(command);
                        dataTable = new DataTable();
                        adapter.Fill(dataTable);

                        tableDataGridView.DataSource = dataTable;

                        decimal sum = 0;

                        foreach (DataRow row in dataTable.Rows)
                        {
                            if (row.RowState != DataRowState.Deleted)
                            {
                                decimal cenaCalosc = decimal.Parse(row["CENACALA"].ToString());
                                sum += cenaCalosc;
                            }
                        }

                        TextBoxLacznaNaleznosc.Text = sum.ToString();
                    }
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show("Wystąpił błąd podczas wczytywania danych: " + ex.Message, "Błąd");
            }
        }

        private void PrzyciskDodajRekord_Click(object sender, EventArgs e)
        {
            TextBoxLacznaNaleznosc.Text = "0";

            if (string.IsNullOrWhiteSpace(TextBoxNumerRysunku.Text) || string.IsNullOrWhiteSpace(TextBoxIloscWykonana.Text) || string.IsNullOrWhiteSpace(TextBoxCenaZaSztuke.Text) || string.IsNullOrWhiteSpace(TextBoxKomentarz.Text))
            {
                MessageBox.Show("Wszystkie pola muszą być wypełnione.", "Błąd");
                return;
            }

            string numer_rysunku = TextBoxNumerRysunku.Text;
            int ilosc_wykonana = int.Parse(TextBoxIloscWykonana.Text);
            decimal cena_sztuka = decimal.Parse(TextBoxCenaZaSztuke.Text);
            string komentarz = TextBoxKomentarz.Text;
            decimal cena_calosc = ilosc_wykonana * cena_sztuka;

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                using (SqlCommand command = new SqlCommand("INSERT INTO [Table] (DATA, RYSUNEK, SZTUKI, CENASZTUKA, CENACALA, KOMENTARZ, ARCHIWIZACJA) VALUES (@Data, @Rysunek, @Sztuki, @CenaSztuka, @CenaCalosc, @Komentarz, @Archiwizacja); SELECT SCOPE_IDENTITY();", connection))
                {
                    command.Parameters.AddWithValue("@Data", DateTime.Now);
                    command.Parameters.AddWithValue("@Rysunek", numer_rysunku);
                    command.Parameters.AddWithValue("@Sztuki", ilosc_wykonana);
                    command.Parameters.AddWithValue("@CenaSztuka", cena_sztuka);
                    command.Parameters.AddWithValue("@CenaCalosc", cena_calosc);
                    command.Parameters.AddWithValue("@Komentarz", komentarz);
                    command.Parameters.AddWithValue("@Archiwizacja", 0);
                    int newId = Convert.ToInt32(command.ExecuteScalar());
                    dataTable.Rows.Add(newId, DateTime.Now, numer_rysunku, ilosc_wykonana, cena_sztuka, cena_calosc, komentarz, 0);
                }
            }

            decimal sum = 0;

            foreach (DataRow row in dataTable.Rows)
            {
                if (row.RowState != DataRowState.Deleted)
                {
                    decimal cenaCalosc = decimal.Parse(row["CENACALA"].ToString());
                    sum += cenaCalosc;
                }
            }

            TextBoxLacznaNaleznosc.Text = sum.ToString();
        }

        private void PrzyciskKasujRekord_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Czy na pewno chcesz skasować rekord z bazy danych?", "Potwierdzenie", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
            {
                if (tableDataGridView.SelectedRows.Count > 0)
                {
                    int selectedIndex = tableDataGridView.SelectedRows[0].Index;
                    DataRowView selectedRow = (DataRowView)tableDataGridView.SelectedRows[0].DataBoundItem;
                    int id = Convert.ToInt32(selectedRow["Id"]);

                    using (SqlConnection connection = new SqlConnection(connectionString))
                    {
                        connection.Open();
                        using (SqlCommand command = new SqlCommand("DELETE FROM [Table] WHERE Id = @Id", connection))
                        {
                            command.Parameters.AddWithValue("@Id", id);
                            command.ExecuteNonQuery();
                        }
                    }

                    dataTable.Rows.RemoveAt(selectedIndex);

                    decimal sum = 0;

                    foreach (DataRow row in dataTable.Rows)
                    {
                        if (row.RowState != DataRowState.Deleted)
                        {
                            decimal cenaCalosc = decimal.Parse(row["CENACALA"].ToString());
                            sum += cenaCalosc;
                        }
                    }

                    TextBoxLacznaNaleznosc.Text = sum.ToString();
                }
            }

            else if (result == DialogResult.No)
            {
                return;
            }
        }

        private void PrzyciskArchiwizujRekord_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Czy na pewno chcesz zarchiwizować rekord w bazie danych?", "Potwierdzenie", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
            {
                if (tableDataGridView.SelectedRows.Count > 0)
                {
                    int selectedIndex = tableDataGridView.SelectedRows[0].Index;
                    DataRowView selectedRow = (DataRowView)tableDataGridView.SelectedRows[0].DataBoundItem;
                    int id = Convert.ToInt32(selectedRow["Id"]);

                    using (SqlConnection connection = new SqlConnection(connectionString))
                    {
                        connection.Open();
                        using (SqlCommand command = new SqlCommand("UPDATE [Table] SET ARCHIWIZACJA = 1 WHERE Id = @Id", connection))
                        {
                            command.Parameters.AddWithValue("@Id", id);
                            command.ExecuteNonQuery();
                        }
                    }

                    selectedRow["ARCHIWIZACJA"] = 1;

                    try
                    {
                        using (SqlConnection connection = new SqlConnection(connectionString))
                        {
                            connection.Open();
                            using (SqlCommand command = new SqlCommand("SELECT * FROM [Table] WHERE ARCHIWIZACJA = 0", connection))
                            {
                                SqlDataAdapter adapter = new SqlDataAdapter(command);
                                dataTable = new DataTable();
                                adapter.Fill(dataTable);

                                tableDataGridView.DataSource = dataTable;

                                decimal sum = 0;

                                foreach (DataRow row in dataTable.Rows)
                                {
                                    if (row.RowState != DataRowState.Deleted)
                                    {
                                        decimal cenaCalosc = decimal.Parse(row["CENACALA"].ToString());
                                        sum += cenaCalosc;
                                    }
                                }

                                TextBoxLacznaNaleznosc.Text = sum.ToString();
                            }
                        }
                    }

                    catch (Exception ex)
                    {
                        MessageBox.Show("Wystąpił błąd podczas wczytywania danych: " + ex.Message, "Błąd");
                    }
                }
            }

            else if (result == DialogResult.No)
            {
                return;
            }
        }

        private void PrzyciskPrzywrocRekord_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Czy na pewno chcesz przywrócić zarchiwizowany rekord do bazy danych?", "Potwierdzenie", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
            {
                if (tableDataGridView.SelectedRows.Count > 0)
                {
                    int selectedIndex = tableDataGridView.SelectedRows[0].Index;
                    DataRowView selectedRow = (DataRowView)tableDataGridView.SelectedRows[0].DataBoundItem;
                    int id = Convert.ToInt32(selectedRow["Id"]);

                    using (SqlConnection connection = new SqlConnection(connectionString))
                    {
                        connection.Open();
                        using (SqlCommand command = new SqlCommand("UPDATE [Table] SET ARCHIWIZACJA = 0 WHERE Id = @Id", connection))
                        {
                            command.Parameters.AddWithValue("@Id", id);
                            command.ExecuteNonQuery();
                        }
                    }

                    selectedRow["ARCHIWIZACJA"] = 0;                     // Zaktualizuj wartość ARCHIWIZACJA na 0 w obiekcie DataRowView

                    try
                    {
                        using (SqlConnection connection = new SqlConnection(connectionString))
                        {
                            connection.Open();
                            using (SqlCommand command = new SqlCommand("SELECT * FROM [Table] WHERE ARCHIWIZACJA = 1", connection))
                            {
                                SqlDataAdapter adapter = new SqlDataAdapter(command);
                                dataTable = new DataTable();
                                adapter.Fill(dataTable);

                                tableDataGridView.DataSource = dataTable;

                                decimal sum = 0;

                                foreach (DataRow row in dataTable.Rows)
                                {
                                    if (row.RowState != DataRowState.Deleted)
                                    {
                                        decimal cenaCalosc = decimal.Parse(row["CENACALA"].ToString());
                                        sum += cenaCalosc;
                                    }
                                }

                                TextBoxLacznaNaleznosc.Text = sum.ToString();
                            }
                        }
                    }

                    catch (Exception ex)
                    {
                        MessageBox.Show("Wystąpił błąd podczas wczytywania danych: " + ex.Message, "Błąd");
                    }
                }
            }

            else if (result == DialogResult.No)
            {
                return;
            }
        }

        private void PrzyciskWyjscie_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void PrzyciskWyswietlBiezaceDane_Click(object sender, EventArgs e)
        {
            PrzyciskWyswietlBiezaceDane.BackColor = Color.FromArgb(66, 120, 221);
            PrzyciskWyswietlArchiwalneDane.BackColor = Color.FromArgb(94, 148, 250);

            PrzyciskArchiwizujRekord.Visible = true;
            PrzyciskPrzywrocRekord.Visible = false;

            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    using (SqlCommand command = new SqlCommand("SELECT * FROM [Table] WHERE ARCHIWIZACJA = 0", connection))
                    {
                        SqlDataAdapter adapter = new SqlDataAdapter(command);
                        dataTable = new DataTable();
                        adapter.Fill(dataTable);

                        tableDataGridView.DataSource = dataTable;

                        decimal sum = 0;

                        foreach (DataRow row in dataTable.Rows)
                        {
                            if (row.RowState != DataRowState.Deleted)
                            {
                                decimal cenaCalosc = decimal.Parse(row["CENACALA"].ToString());
                                sum += cenaCalosc;
                            }
                        }

                        TextBoxLacznaNaleznosc.Text = sum.ToString();
                    }
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show("Wystąpił błąd podczas wczytywania danych: " + ex.Message, "Błąd");
            }
        }

        private void PrzyciskWyswietlArchiwalneDane_Click(object sender, EventArgs e)
        {
            PrzyciskWyswietlArchiwalneDane.BackColor = Color.FromArgb(66, 120, 221);
            PrzyciskWyswietlBiezaceDane.BackColor = Color.FromArgb(94, 148, 250);

            PrzyciskArchiwizujRekord.Visible = false;
            PrzyciskPrzywrocRekord.Visible = true;

            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    using (SqlCommand command = new SqlCommand("SELECT * FROM [Table] WHERE ARCHIWIZACJA = 1", connection))
                    {
                        SqlDataAdapter adapter = new SqlDataAdapter(command);
                        dataTable = new DataTable();
                        adapter.Fill(dataTable);

                        tableDataGridView.DataSource = dataTable;

                        decimal sum = 0;

                        foreach (DataRow row in dataTable.Rows)
                        {
                            if (row.RowState != DataRowState.Deleted)
                            {
                                decimal cenaCalosc = decimal.Parse(row["CENACALA"].ToString());
                                sum += cenaCalosc;
                            }
                        }

                        TextBoxLacznaNaleznosc.Text = sum.ToString();
                    }
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show("Wystąpił błąd podczas wczytywania danych: " + ex.Message, "Błąd");
            }
        }

        private void PrzyciskUstalenia_Click(object sender, EventArgs e)
        {

        }

        private void PrzyciskWykonajZrzutEkranuTrybMax_Click(object sender, EventArgs e)
        {
            int x = 1;
            string path = Application.StartupPath + "/Zrzuty";
            string filename = x + ".png";

            if (!Directory.Exists(path))
            {
                if (LabelOtwierajacyPlikZeZrzutem.Text == "0")
                {
                    LabelOtwierajacyPlikZeZrzutem.Visible = false;
                }

                else
                {
                    LabelOtwierajacyPlikZeZrzutem.Visible = true;
                    LabelOtwierajacyPlikZeZrzutem.Text = "Błąd!";
                    LabelOtwierajacyPlikZeZrzutem.ForeColor = Color.Red;
                }

                MessageBox.Show("Folder \"Zrzuty\" nie istnieje.", "Błąd");
                return;
            }

            else
            {
                Rectangle bounds = this.Bounds;
                using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
                {
                    using (Graphics g = Graphics.FromImage(bitmap))
                    {
                        g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                    }

                    while (File.Exists(path + @"\" + filename))
                    {
                        x = x + 1;
                        filename = x + ".png";
                    }

                    bitmap.Save(path + @"\" + filename);
                    LabelOtwierajacyPlikZeZrzutem.Text = filename;
                    LabelOtwierajacyPlikZeZrzutem.ForeColor = Color.Green;

                    LabelOtwierajacyFolderZeZrzutem.Text = "Zapisano plik:";

                    if (LabelOtwierajacyFolderZeZrzutem.Text == "0")
                    {
                        LabelOtwierajacyFolderZeZrzutem.Visible = false;
                    }

                    else
                    {
                        LabelOtwierajacyFolderZeZrzutem.Visible = true;
                    }

                    if (LabelOtwierajacyPlikZeZrzutem.Text == "0")
                    {
                        LabelOtwierajacyPlikZeZrzutem.Visible = false;
                    }

                    else
                    {
                        LabelOtwierajacyPlikZeZrzutem.Visible = true;
                    }
                }
            }
        }

        private void PrzyciskWykonajZrzutEkranuTrybMin_Click(object sender, EventArgs e)
        {
            int x = 1;
            string path = Application.StartupPath + "/Zrzuty";
            string filename = x + ".png";

            if (!Directory.Exists(path))
            {
                MessageBox.Show("Folder \"Zrzuty\" nie istnieje.", "Błąd");
                return;
            }

            else
            {
                Rectangle bounds = this.Bounds;
                using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
                {
                    using (Graphics g = Graphics.FromImage(bitmap))
                    {
                        g.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size);
                    }

                    while (File.Exists(path + @"\" + filename))
                    {
                        x = x + 1;
                        filename = x + ".png";
                    }

                    bitmap.Save(path + @"\" + filename);
                }
            }
        }

        private void PrzyciskUruchomKalkulator_Click(object sender, EventArgs e)
        {
            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = "calc";
            info.UseShellExecute = true;
            Process.Start(info);
        }

        private void CheckBoxTrybMiniLubMax_CheckedChanged(object sender, EventArgs e)
        {
            if (CheckBoxTrybMiniLubMax.Checked == true)
            {
                this.tableDataGridView.Location = new Point(0, 60);

                label5.Location = new Point(7, 384);
                TextBoxNumerKonta.Location = new Point(142, 383);

                label6.Location = new Point(488, 384);
                TextBoxLacznaNaleznosc.Location = new Point(604, 383);

                label7.Location = new Point(726, 384);

                PrzyciskDodajRekord.Visible = false;
                PrzyciskKasujRekord.Visible = false;
                PrzyciskArchiwizujRekord.Visible = false;
                PrzyciskWyjscie.Visible = false;
                PrzyciskPrzywrocRekord.Visible = false;

                PrzyciskWykonajZrzutEkranuTrybMin.Visible = true;
                this.Size = new Size(772, 465);
                this.CenterToScreen();
            }

            else
            {
                this.tableDataGridView.Location = new Point(260, 134);

                label5.Location = new Point(264, 464);
                TextBoxNumerKonta.Location = new Point(399, 463);

                label6.Location = new Point(748, 464);
                TextBoxLacznaNaleznosc.Location = new Point(864, 463);

                label7.Location = new Point(986, 464);

                PrzyciskDodajRekord.Visible = true;
                PrzyciskKasujRekord.Visible = true;
                PrzyciskArchiwizujRekord.Visible = true;
                PrzyciskWyjscie.Visible = true;
                PrzyciskPrzywrocRekord.Visible = true;

                PrzyciskWykonajZrzutEkranuTrybMin.Visible = false;
                this.Size = new Size(1050, 553);
                this.CenterToScreen();
            }

        }

        private void LabelOtwierajacyFolderZeZrzutem_Click(object sender, EventArgs e)
        {
            string path = Application.StartupPath + "/Zrzuty";

            if (!Directory.Exists(path))
            {
                MessageBox.Show("Folder \"Zrzuty\" nie istnieje.", "Błąd");
                return;
            }

            Process.Start(new ProcessStartInfo()
            {
                FileName = path,
                UseShellExecute = true,
                Verb = "open"
            });
        }

        private void LabelOtwierajacyPlikZeZrzutem_Click(object sender, EventArgs e)
        {
            string filename = LabelOtwierajacyPlikZeZrzutem.Text;
            string path = Application.StartupPath + "/Zrzuty" + @"\" + filename;

            if (!File.Exists(path))
            {
                MessageBox.Show("Plik nie istnieje.", "Błąd");
                return;
            }

            var p = new Process();
            p.StartInfo = new ProcessStartInfo(path)
            {
                UseShellExecute = true
            };
            p.Start();
        }
    }
}

1

Po pierwsze nie widzę, żebyś gdziekolwiek zamykał połączenie z bazą, w każdej metodzie jest

connection.open()

ale nigdzie nie ma

connection.close()

każde otworzone połączenie powinno być zamykane, inaczej w końcu wyczerpiesz pulę socketów.
Fakt faktem, że opakowanie klasy SqlConnection w using wywoła metodę Dispose() i zrobi to za ciebie, dlatego obecnie pewnie nawet nie zauważyłeś tego problemu, ale dobrą praktyką jest i tak zamykanie tego połączenia w bloku using.

Dodatkowo opakuj sobie conection.open() w taką funkcję:

if(connection.State != ConnectionState.Open)
{
    connection.open()
}

Zabezpieczy to kod przed wyjatkiem związanym z niezamkniętym połączeniem.

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