Problem z eventem SelectionChanged WPF

0

Witam.

Mam problem z aplikacją napisaną w wpf. A że jestem nieogarnięty :D to nie potrafię sobie z tym poradzić.

Mam napisane 2 eventy : MouseDoubleClick oraz SelectionChanged . Gdy tworzę "uruchamiam" wszystko za pomocą MouseDoubleClik nr Dokumentu które przekazuje do datagridview2 to wszystko jak najbardziej działa. Następnie naciskając button chcę ten dokument usunąć z bazy.Wszystko działa dokumenty zostają usuniętę i baza ładuje się na nowo. Ogólnie wszystko śmiga.

Mam jednak problem z eventem SelectionChanged a minowicie. Jak klikam nr dokumentu wyświetlają mi się poniżej jego składowe. Następnie chcę usunąć ten dokument i podczas debuggowania zauważyłem że również usunięcie elementów z bazy przebiega poprawnie lecz jednak od razu włącza się event Selection changed który wywala mi błąd na elemencie kodu :


dynamic wka = datagridview.SelectedItem;
string wuzeta = wka.WZ.ToString();

a dokładnie na przypisaniu nr wz. W MouseDoubleClick nie mam tego problemu z tego względu że po usunięciu elementu event się nie uruchamia i czeka aż wybiorę następny element. Po SelectionChanged w momencie przechodzenia elementu na " wywala błąd.

Dziwne jest dla mnie to że przy pierwszym wybieraniu event SelectionChanged działa jak należy. Dopiero po wybraniu usunięcia "klikniętego" elementu wywala mi błąd:

Ponieżej przesyłam kod elementów używanych :


 public void datagridview_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {


            dynamic wka = datagridview.SelectedItem;
            string wuzeta = wka.WZ.ToString();


            acceptWZbtn.IsEnabled = true;

            SitoModel ent = new SitoModel();


            var query2 = (from cc in ent.WZ_DWS_SITO
                          where cc.WZ == wuzeta
                          orderby cc.PRZYCZYNA descending
                          select new
                          {
                              cc.MATERIAL,
                              cc.NAZWA_KLIENTA,
                              cc.NAZWA_MATERIALU,
                              cc.PARTIA,
                              cc.INDEKS,
                              cc.WZ_POZYCJA,
                              ZLECENIE_MERGE = (cc.ZLECENIE_MARZA * 100),
                              cc.PRZYCZYNA,
                              cc.CENA_MINIMALNA,
                              cc.ATP_SKLAD,
                              cc.L0,
                              cc.L1,
                              cc.L2,
                              cc.MARZA_ZLECENIE_ALL,
                              cc.ILOSC_60DNI_ABC_5PROCENT,
                              cc.WZ_NETTO,
                              cc.WZ_ZYSK,
                              cc.WZ_ILOSC_NA_WZ,
                              cc.WZ_CALA_NETTO,
                              cc.ZLECENIE_CENA_ZAKUPU,
                              cc.ZLECENIE_CENA_NETTO,
                              cc.WZ_CZAS,
                              cc.PH,
                              cc.WWW,
                              cc.ZLECENIE_ZYSK,
                              cc.KUNNR
                          }).ToList();

            datagridview2.ItemsSource = query2;

            string klient = query2.Select(x => x.KUNNR).FirstOrDefault().ToString();
            var kontr = (from k in ent.KONTROLOWANies select k).ToList();

            foreach (var it in kontr)
            {
                if (klient.Equals(it.ODBIORCA))
                {
                    nameofClientlabel.Foreground = Brushes.Red;
                    nameofClientlabel.Content = "[" + klient + "] " + query2.Select(x => x.NAZWA_KLIENTA).FirstOrDefault().ToString();
                }
                else
                {
                    nameofClientlabel.Foreground = Brushes.White;
                    nameofClientlabel.Content = "[" + klient + "] " + query2.Select(x => x.NAZWA_KLIENTA).FirstOrDefault().ToString();
                }
            }




            nameofPH.Content = "PH: " + query2.Select(x => x.PH).FirstOrDefault().ToString();

            var naglowki = (from d in ent.WZ_DWS_SITO where d.WZ == wuzeta select new { Naglowek = d.L0 + ", " + d.L1 + "," + d.L2 }).FirstOrDefault().ToString();

            naglowek_label.Content = naglowki;
}

  private void acceptWZbtn_Click(object sender, RoutedEventArgs e)
        {
            SitoModel ent = new SitoModel();
            dynamic wkaa = datagridview.SelectedItem;
            string actwuzetka = wkaa.WZ.ToString();

            var skad = (from d in ent.WZ_DWS_SITO
                        where d.WZ == actwuzetka
                        select d
                        //select new
                        //{
                        //    d.WZ,
                        //    d.KUNNR
                        //}
                        ).ToList();




            foreach (var row in skad)
            {
                ent.WZ_DWS_SITO.Remove(row);
            }


            ent.SaveChanges();
            DetailsDataGridViews();
            getdata();
        }

  public void getdata()
        {
            SitoModel db = new SitoModel();

            var query = (from d in db.WZ_DWS_SITO
                         where d.KUNNR != "0003000000"
                         orderby d.WZ_DATA descending
                         group d by new { d.WZ, d.KUNNR, d.WZ_DATA } into grp
                         select new
                         {
                             WZ = grp.Key.WZ,
                             KUNNR = grp.Key.KUNNR,
                             WZ_DATA = grp.Key.WZ_DATA,
                             MATERIAL = grp.Count(),

                         }
                         ).ToList();


            datagridview.ItemsSource = query;   
            acceptWZbtn.IsEnabled = false;
           


        }

screenshot-20190122082636.png

0

3 razy napisałeś, że wywala Ci błąd, ale ani razu nie napisałeś jaki. Podejrzewam, że jak usuniesz zaznaczony to już nie masz zaznaczenia, ale event (poprawnie) zadziała, ponieważ zmiana nastąpiła.

0
  1. jaki błąd
  2. jak usuniesz zaznaczony rekord to po usunięciu go nie ma
  3. sprawdź coś (jak napiszesz jaki błąd to będzie wiadomo co) i jak to coś jest null to wyjdź z metody
0

Błąd :

An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll

Additional information: Nie można wykonać wiązania w czasie wykonania na pustym odwołaniu.

W tym momencie kodu :


            dynamic wka = datagridview.SelectedItem;
            string wuzeta = wka.WZ.ToString();

Wartość po usunięciu jest nullem i dlatego wyskakuje błąd.

screenshot-20190122095847.png

1

Tak jak kolega wyżej napisał, sprawdź jeśli jest nullem to wyjdź z metody.

1
BLAZO napisał(a):

Wartość po usunięciu jest nullem i dlatego wyskakuje błąd.

i naprawdę nie dało Ci to do myślenia???

0
abrakadaber napisał(a):
BLAZO napisał(a):

Wartość po usunięciu jest nullem i dlatego wyskakuje błąd.

i naprawdę nie dało Ci to do myślenia???

Dało mi do myślenia ale nie wiedziałem jak naprawiać tego typu błąd :

Naprawiłem to w ten sposób :


 if ( datagridview.SelectedItem == null)
            {
                return;
            }
            else
            {
                wuzeta = wka.WZ.ToString();
            }

Dziękuję za pomoc.

0

to nawet nie musi być aż tak skomplikowane :) - w metodzie datagridview_SelectionChanged wystarczy, że na samym początku dasz tylko to

 if ( datagridview.SelectedItem == null)
                return;
0
abrakadaber napisał(a):

to nawet nie musi być aż tak skomplikowane :) - w metodzie datagridview_SelectionChanged wystarczy, że na samym początku dasz tylko to

 if ( datagridview.SelectedItem == null)
                return;

Ok dziękuję za pomoc :)

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