BindingSource - anulowanie zmian na wybranym wierszu

0

Cześć,
mam mały problem z aplikacją Windows Form.
Mam dwie formy: ParentForm - posiada dataGridView wyświetlającą listę dodanych do bazy firm. Poniżej mam przyciski Dodaj, Edytuj, Usuń którymi zarządzam kolejną formą: ChildrenForm, która posiada TextBoxy do dodania firmy oraz przyciski Zapisz oraz Anuluj. Problem polega na tym, że nie potrafię zrobić anulowania zmian edycji wybranej z Grida firmy.
Wybieram firmę z listy, klikam Edytuj firmę gdzie w nowej formatce nanoszę zmiany np. w nazwie firmy (po wpisaniu nowej nazwy, wartość automatycznie aktualizuje się na Gridzie w formatce ParentForm nawet gdy nie wybieram przycisku Zapisz). Po wprowadzeniu zmian klikam przycisk Anuluj i...zmiany danej firmy są widoczne na gridzie. Co prawda wartość ta nie jest zapisywana do bazy danych ale chciałbym zrobić to tak aby po kliknięciu Anuluj wartość w Gridzie była taka jak przed edycją firmy. Ma ktoś jakiś pomysł?

ParentForm:

private void CompaniesForm_Load(object sender, EventArgs e)
    {
        using (var connect = new ContactEntities())
        {
            companyBindingSource.DataSource = connect.Companies.ToList();
        }
    }

Przycisk edytuj firme:

private void buttonEditCompany_Click(object sender, EventArgs e)
    {
        CompanyForm company = new CompanyForm();
        company.MdiParent = this.MdiParent;
        company.Company = (Company)companyBindingSource.Current;
        company.Show();
    }

CompanyForm:

public Company Company { get; set; }    
private void CompanyForm_Load(object sender, EventArgs e)
        {
            using (var connect = new ContactEntities())
            { 
                companyBindingSource.DataSource = Company;
            }
        }

Wszystkie kontrolki zostały utworzone poprzez designer i automatycznie zbindowane.

0

Dziwny ten Twój kod. BindingSource.DataSource powinno zawierać kolekcję pobraną z bazy i najpierw tak jest, ale potem nie mam pojęcia dlaczego do DataSource zapisujesz aktualnie wybrany element czyli zastępujesz kolekcję jednym elementem. Wgl. nie powinieneś używać ToList bo wtedy utworzysz kopie i wtedy edytowana kolekcja nie będzie tą samą, którą używasz do pobierania danych z bazy oraz ich aktualizacji i np. jak dodasz lub usuniesz element to nie zostanie on uwzględniony. A co do Twojego pytania, żeby się automatycznie nie aktualizowało no to kopiujesz obiekt pobrany z binding source current, ale chodzi o kopię jego wartości, a nie referencji no i na nim dokonujesz operacji, a nie bezpośrednio na tym obiekcie pobranym z binding source, no a później w zależności od tego czy chcesz anulować to go porzucasz, a jak zapisać to go podmieniasz z obiektem current binding source.
Do tego przy tej edycji powinieneś korzystać z kontrolek niepowiazanych z tym Twoim bindingsource

0

Dziękuję za odpowiedź. W pierwszej formatce do BindingSource.DataSource przypinam wartości pobrane z bazy danych. Pod przyciskiem buttonEditCompany pobieram aktualnie zaznaczony wiersz i przypisuję go do właściwości zdefiniowanej w drugiej formatce (CompanyForm) w celu przekazania wartości i podpięcia ich do kontrolek robiąc to przy pomocy BindingSource.DataSource = Company. Nie mam pomysłu w jaki inny sposób podpiąć automatycznie wartości edytowanego wiersza do kontrolek typu TextBox. Odnośnie pytanie to dziękuję za wyjaśnienie - przekazuje referencję a nie wartości i stąd problem. Mógłbyś przedstawić zarys realizacji kopiowania wartości z aktualnie wybranego wiersza?
Dziękuję za pomoc!

0

Przedtem tego nie ogarnąłem, ale teraz chyba zaczynam kojarzyć, że masz dwa obiekty binding source jeden w parent form, a drugi w company form i one mają taką samą nazwę. Jak tak no to przez to, że są tak samo nazwane i nie ma całego kodu to wprowadza to człowieka w błąd. No dobra teraz pytanie odnośnie tego Company form. Czy on służy tylko do edycji tego pobranego rekordu z bazy i masz w nim tylko textboxy? Jeżeli tak no to nie jest Ci w nim potrzebny żaden binding source. Wtedy po prostu do każdej kontrolki (właściwości Text) przypisujesz odpowiednią wartość odczytaną z właściwości tego obiektu Company i masz powiedzmy taką jakby kopię tego obiektu. No i jeżeli chcesz to zapisać no to z powrotem do tego obiektu Company do każdej właściwości zapisujesz wartości odczytane z textboxa. Binding source też możesz użyć ale właśnie zależy jakie masz operacje do wykonania czy będziesz to jakoś rozszerzał czy nie. Jeżeli użyłbyś tego BindigSource to tak jak mówiłem musisz mieć kopię obiektu. Do kopiowania są tam jakieś biblioteki byś musiał poszukać. W sumie to płytka kopia się nie nada bo przecież tam są też uwzględnione powiadomienia o zmianie wartości. To albo głęboka kopia, albo piszesz nową klasę, która będzie zawierała tylko wlaściwości odpowiadajęce kolumnom i potem odpowiedni kod, który Ci utworzy odpowiednie kopie tych wartości.

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