Problem z DataGrid

Aleksander Golek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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.

Kopiuj
     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.

WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5226
1

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

Aleksander Golek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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...

Kopiuj
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

Kopiuj
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);

        }
    }
}
Aleksander Golek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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 :)

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

        }
kzkzg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 935
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 ?

Aleksander Golek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Metoda zwraca obiekt z bazy jako ObservableCollection

Kopiuj
    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;
        }
kzkzg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 935
2

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

Grzegorz Świdwa
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 385
1

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

Kopiuj
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:

Kopiuj
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:

Kopiuj
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

Aleksander Golek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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 :)

Aleksander Golek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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

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

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.