Problem z eventem SelectionChanged WPF

Problem z eventem SelectionChanged WPF
BL
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:95
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 :

Kopiuj

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 :

Kopiuj

 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

litrmleka
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:lubuskie
  • Postów:201
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.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
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

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
BL
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:95
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 :

Kopiuj

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

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

screenshot-20190122095847.png

litrmleka
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:lubuskie
  • Postów:201
1

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

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
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???


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
BL
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:95
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 :

Kopiuj

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

Dziękuję za pomoc.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

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

Kopiuj
 if ( datagridview.SelectedItem == null)
                return;

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
BL
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:95
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

Kopiuj
 if ( datagridview.SelectedItem == null)
                return;

Ok dziękuję za pomoc :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.