Wyciągnięcie elementu z datagridView w WPF C#

0

Cześć.

Szukam rozwiązania które może mi wyciągnąć dane z datagridview. Chciałbym do metody MouseDoubleClick wyciągnąć nr elementu do zmiennej czyli nr WZ-ki.

Mam wyciągnięty do stringa cały wiersz ale niestety nie potrafię wyciągnąć pojedyńczego elementu do zmiennej. Dokładnie chodzi o to że jak 2 razy kliknę jakiś element w wierszu to do zmiennej przypisze mi nr WZ z tego elementu.

W tej chwili mam coś takiego :


 private void datagridview_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {

       //int colind = datagridview.SelectedCells[1].Column.DisplayIndex;
      // int rowind = datagridview.Items.IndexOf(datagridview.SelectedCells[1].Item);

            var cos_tam = datagridview.SelectedItem.ToString();
            System.Windows.MessageBox.Show(cos_tam);

        }

I dostaję takiego message boxa :
screenshot-20181209234002.png

Chciałbym uzyskać wynik tylko 8181814006 czyli nr wz dzięki któremu będę mógł wyszukiwać dane z bazy.

W windowsForms było to stosunkowo proste bo użyłem tylko :

 dataGridView1.CurrentRow.Cells[0].Value.ToString();

I wszystko pięknie ładnie można byłoby przypisać. W WPF niestety ta opcja nie działa. Szukałem rozwiązań w internecie i niestety nic nie działało :/

0

Co jest źródłem danych twojego DataGridView?

Bo wygląda na to, że każdy jego element jest klasą anonimową zawierającą pola WZ, KUNNR, WZ_DATA i MATERIAL, ale gdyby to był "znany" typ, to wtedy mógłbyś zrobić proste:

var wz = (dataGridView1.SelectedItem as MojeKlasa).WZ;
0

Źródłem danych jest klasa WZ_DWS_SITO czyli klasa utworzona z modelu danych za pomocą EntityFramework.

Mam utworzoną metodę getdata do wyciągania danych do Datagridview:

 public void getdata()
        {

            EntitiesSito db = new EntitiesSito();

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

            datagridview.ItemsSource = query;

          

        }

Idąc za twoją podpowiedzią utworzyłem :

  private void datagridview_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {

       //int colind = datagridview.SelectedCells[1].Column.DisplayIndex;
      // int rowind = datagridview.Items.IndexOf(datagridview.SelectedCells[1].Item);

           /// var cos_tam = datagridview.SelectedItem.ToString();
       ///     System.Windows.MessageBox.Show(cos_tam);

            var wz = (datagridview.SelectedItem as WZ_DWS_SITO).WZ;


        }

I niestety dalej wywala błąd :./

screenshot-20181210113013.png

An unhandled exception of type 'System.NullReferenceException' occurred in Sito.exe

0

Nie zadziała, bo:

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

Tworzysz tutaj (poprzez Select) listę typu anonimowego zawierającego te 4 elementy, a nie listę typu WZ_DWS_SITO. Zrób sobie klasę, która będzie miała takie elementy jak ta twoja klasa anonimowa tutaj, czyli będziesz miał select postaci:

select new MojaKlasa
                         {
                             WZ = grp.Key.WZ,
                             KUNNR = grp.Key.KUNNR,
                             WZ_DATA, grp.Key.WZ_DATA,
                             MATERIAL = grp.Count()
                         }

(tylko oczywiście MojaKlasa musi posiadać właściwości o takich nazwach i odpowiednich typach) i wtedy na klasę MojaKlasa będziesz mógł zrzutować SelectedItem twojego DataGridView.

0

Działa sposób który podałeś, dziękuję bardzo.

Znalazłem jednak sposób ze zmienną dynamiczną która pozwoli mi uniknąć tworzenia nowej klasy i dzięki temu mogę wyodrębić element bez dodatkowego kodu.


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

Sposób działa szybko,sprawnie i przyjemnie. Chyba, że masz do tego jakieś zastrzeżenia lub uważasz, że używanie tego jest niepoprawne ?

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