Problem z DataGrid

0

Witam wszystkich,
Mam pewien problem w mojej aplikacji który polega na wyświetleniu konkretnego wiersza z DataGrid. widzę w projekcie, że funkcja znajduje obecnie zaznaczony wiersz lecz nie przypisuje do zmiennej. Bardzo proszę o pomoc.

     private void DGCompany_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            DataGrid dataGrid = (DataGrid)sender;
            CustomerModel companyData = DGCompany.SelectedItem as CustomerModel;
            if (companyData != null)
            MessageBox.Show(companyData.Name);

        }

Podczas Debugu jak najadę myszką na SelectedItem widzę że przechowuje on wskazany wiersz lecz gdy najadę na companyData widzę cały czas null.

1

Jeżeli cast as się nie uda, to zostaje przypisany null

0
WeiXiao napisał(a):

Jeżeli cast as się nie uda, to zostaje przypisany null

A masz pomysł co może być nie tak że przypisuje null? class CustomerModel ma identyczne prop co dane w DataGrid...

namespace AppSalesMan2
{
     class CustomerModel
    {
      
        public int CompanyID { get; set; }
        public string Name { get; set; }
        public int SAP { get; set; }
        public int IFA { get; set; }
        public string Postcode { get; set; }
        public string City { get; set; }
        public int SalesManID { get; set; }
        public bool RequestForChange { get; set; }

    }
}

Zamieszczam też cały kod tej classy z dataGridem

namespace AppSalesMan2.Windows
{
    /// <summary>
    /// Logika interakcji dla klasy CustomerList.xaml
    /// </summary>
    public partial class CustomerListWindow : Window
    {
        private SalesMansModel _salesMansModel;
        
        public CustomerListWindow(SalesMansModel salesMansModel)
        {
            _salesMansModel = salesMansModel; 
            InitializeComponent();
            using (var Db = new AppSalesMan2DbContext())
            {
                CustomerDataRepository repository = new CustomerDataRepository(Db);
                DGCompany.ItemsSource = repository.GetCustomerList(_salesMansModel.SalesManID);
            }
        }

        private void btnBack_Click(object sender, RoutedEventArgs e)
        {
             new MenuWindow(_salesMansModel).Show();
             this.Close();

        }

        private void NameChange_Click(object sender, RoutedEventArgs e)
        {
            CustomerModel SelectedCustomer = DGCompany.SelectedItems as CustomerModel;
            
            
        }

        private void DGCompany_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            DataGrid dataGrid = (DataGrid)sender;
            CustomerModel companyData = DGCompany.SelectedItem as CustomerModel;
            if (companyData != null)
            MessageBox.Show(companyData.Name);

        }
    }
}
0

Udało mi się rozwiązać problem w taki sposób, może komuś się przyda w przyszłości :)
Mimo wszystko dalej zastanawia minie dlaczego wcześniejszy kod nie działał. Kiedyś miałem podobną sytuację z DataGridem i działało bez problemu... Jeżeli ktoś zna odpowiedź będę wdzięczny za wytłumaczenie :)

   private void DGCompany_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            
            dynamic companyData = DGCompany.SelectedItem;
            
            if (companyData != null)
            MessageBox.Show(companyData.Name);

        }
3

dynamic służy do czegoś innego. Po to masz silne typowanie w c#, żeby z niego korzystać.
Co zwraca customerDataRepository.GetCustomerList ? Kolekcje obiektów typu CustomerModel ?

0

Metoda zwraca obiekt z bazy jako ObservableCollection

    public ObservableCollection<CustomerData> GetCustomerList(int SalesManId)
        {
            ObservableCollection<CustomerData> CustomerList = new ObservableCollection<CustomerData>();
            var customerDatas = CustomerDatas.Where(x => x.SalesManID == SalesManId);
            foreach (var item in customerDatas)
            {
                CustomerList.Add(new CustomerData()
                {
                    CompanyID = item.CompanyID,
                    Name = item.Name,
                    SAP = item.SAP,
                    IFA = item.IFA,
                    Postcode = item.Postcode,
                    City = item.City,
                    SalesManID = item.SalesManID

                });
            }

            return CustomerList;
        }
2

No masz niezgodność typów. W datagrid masz kolekcje CustomerData, a w metodzie DGCompany_SelectionChanged próbujesz castować na CustomerModel.

1

Kilka błędów na początek:

private void NameChange_Click(object sender, RoutedEventArgs e)
        {
            CustomerModel SelectedCustomer = DGCompany.SelectedItems as CustomerModel;

        }

Według: https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc189829(v%3Dvs.95)
DataGrid.SelectedItems jest typem System.Collections.IList<Type T> a ty próbujesz przekonwertować go do CustomerModel

Następnie:

private void DGCompany_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            DataGrid dataGrid = (DataGrid)sender;
            CustomerModel companyData = DGCompany.SelectedItem as CustomerModel;
            if (companyData != null)
            MessageBox.Show(companyData.Name);

        }

Po co zamieniasz sender na DataGrid, skoro potem odwołujesz się do DGCompany?
Zrób tak:

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (sender.GetType() != typeof(DataGrid))
                throw new Exception("sender nie jest DataGridem");
            DataGrid dataGrid = sender as DataGrid;
            if(dataGrid.SelectedItem == null)
                throw new Exception("SelectedItem = null");
            if (dataGrid.SelectedItem.GetType() != typeof(CustomerModel))
                throw new Exception("SelectedItem jest niewłaściwym typem (" + dataGrid.SelectedItem.GetType().ToString() + ")");
            CustomerModel companyData = dataGrid.SelectedItem as CustomerModel;
        }

I jeszcze jedno - mówisz o najechaniu myszką, a nigdzie nie widzę zdarzeń MouseEnter / MouseLeave

0

Dzięki za uwagi zastosuję w projekcie :) pisząc o najechaniu myszką miałem na myśli debuger i podgląd co siedzi w obiekcie :)

0

Wprowadziłem twoje poprawki i dostałem informację o niewłaściwym typie tak jak pisał wcześniej kzkzg castowałem na nie właściwy typ po zmianach działa
Jeszcze muszę poprawić właściwy typ na IList aby wszystko było poprawnie

 CustomerData customerData = DGCompany.SelectedItem as CustomerData;
           
            if (customerData != null)
            {
                ChangeNameWindow changeNameWindow = new ChangeNameWindow(customerData, this,_salesMansModel.SalesManID);
                changeNameWindow.Owner = this;
                changeNameWindow.ShowDialog();
            }

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