Dziwne zachowanie menuStrip

0

Na formularzu umieściłem m.in. przycisk "Zapisz", który wywołuje funkcję ZapiszFakturę() i prawidłowo zapisuje dane do tabel :

        private void buttonZapisz_Click_1(object sender, EventArgs e) 
        {   ZapiszFakture();   }
       private bool ZapiszFakture() 
        {
                BindingManagerBase MojObj = this.fakturypozycjeDataGridView.BindingContext[dataSetFaktury.Tables["fakturypozycje"]];
                for (int i = MojObj.Count - (this.fakturypozycjeDataGridView.RowCount -1); i < MojObj.Count; i++)
                {
                    MojObj.Position = i;
                    DataRow row = ((DataRowView)MojObj.Current).Row;
                    row["NrFaktury"] = this.nrFakturyTextBox.Text;
                }
            this.Validate();
            this.fakturypozycjeBindingSource.EndEdit();
            this.fakturyBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.dataSetFaktury);
            return true;
        }

Ze względów estetycznych postanowiłem jednak zamiast przycisków, wprowadzić MenuStrip, które dodatkowo ma wbudowaną obsługę skrótów klawiszowych.

Do pozycji menu przypisałem te same funkcje, które obsługiwały przyciski i wszystko działa prawidłowo z wyjątkiem nieszczęsnej procedury "Zapisz" :

        private void zapiszToolStripMenuItem_Click(object sender, EventArgs e)
        {   ZapiszFakture(); }

Zdarzenie wybrania w menu pozycji "Zapisz", wywołuje dokładnie tą samą funkcję, która obsługuje przycisk "Zapisz". Niestety, w pzypadku wywołania jej z poziomu menu, funkcja nie działa prawidłowo. Zaczyna się "wysypywać" obsługa BindingManagerBase (następuje pogubienie się w pozycjach rekordów).

Testowo ustawiłem na formularzy zarówno przycisk "Zapisz" jak i obsługę zapisu z poziuomu MenuStrip - jeżeli zapis faktury wybiorę przyciskiem, to wszystko jest O.K. , jeżeli z menu, występują błedy w obsłudze.

Czy ma ktoś jakiś pomysł dlaczego tak jest ?

PS.
Z ciekawości obsłużyłem jeszcze zdarzenie KeyDown, ale również "wysypuje" się obsługa BindingManagerBase :(

        private void FormFaktura_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F4)
                  ZapiszFakture();
        }
0

na poczatek zjebka:

bindingmanagerbase sie wysypuje --- ale jak?? dziala nieprawidlowo? dostajesz wyjatek? jaki jest jego typ/komunikat? nie podales najwazniejszej inforamacji, albo ja tak zagmatwales, ze jej nie widze..

a teraz troche domyslow... jesli roznicę Ci robi sam klik w Button vs w Menu...

Jedyna roznica miedzy tymi dwoma jaka mi teraz przychdzi na mysl, to roznica w focusie: klik na button przekazuje focus buttonowi, poprzednia kontroka go traci. Klik na menu nie pamietam jak sie zachowuje dokladnie, ale wydaje mi sie ze nie powoduje przekazania focusa do menu i jego utraty na poprzedniej kontrolce. Co to by znaczylo i jak wazny jest ten szczegol? Ano, databindingi dzialaja w trzech momentach:

  • laduja dane, gdy cos obserwowanego sie zmieni [zmiana property w konfiguracji, zmiana elementow w datasource itede]
  • laduja dane, gdy Visible przechodzi z false na true -- no, ale zakladam ze cala formatka jest widoczna
  • zapisuja dane z kontorlek do datasource, gdy ... traca focus.

..wiec, jesli jakas kontrolka NIE straci focusu, jakies dane wklepane na formatke mogly NIE zostac przekazane do DataSource, przez co inne kontrolki ktore tych danych sie spodziewaja - nie dostaja ich. Grid moglby NIE zapisac zawartosci NewRow'a, albo zmian w EditingRow'ie - bo nie mial defocus'a i ciagle sadzi ze uzytkownik na nim wciaz pracuje..

A takie efekty, zaleznie od Twojej logiki moga powodowac rozne ciekawe desynchronizacje w normalnie dzialajacej i odswiezajacej sie formatce.. i rzucac wyjatkami z dziwnych miejsc, albo siedziec cicho i po prostu nic nie robic jak gdyby nigdy nic sie nigdzie nie zmienilo..

0

Na początek podziękowania : dzięki, dzięki, dzięki :)

Jak słusznie zasugerowałeś, winę za takie zachowanie BMB ponosi brak defocusowania w przypadku obsługi MenuStrip oraz skrótu klawiszowego - jedna komenda i problem rozwiązany. Samemu na rozwiązanie chyba nigdy bym nie wpadł.

Jeżeli ktoś w przyszłości miałby podobny problem, uzupełnię informację, za brak których dostałem zjebkę :)

BindingMenagerBase wykazywał nic nie mówiący błąd : Column 'NrFaktury' cannot be null (przy innej konstrukcji danych może to być zupełnie inny błąd).
Dopiero po dokładnym zdebagowaniu kodu okazało się, że BMB nie uzwględnia własnego ostatniego wiersza w kolekcji, a sięga do wiersza spoza właściwego zakresu (przejmował ostatnią pozycję z porzedniej faktury, co było związane ze sposobem realizacji edycji kolekcji BMB).
Tak jak napisałeś, problem sprowadzał się do braku uwzględniania w kolekcji, nie zdefokusowanego wiersza na DGV.

Jeszcze raz dziękiu za pomoc.

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