Usuwanie wiersza z Datagrida - ObservableCollection

Odpowiedz Nowy wątek
2018-08-11 15:22

Rejestracja: 13 lat temu

Ostatnio: 3 tygodnie temu

0

Witam, piszę drobny program do obsługi wydruku dokumentów
Mam kontrolkę Datagrid i w niej, w jednej z kolumn button usuwający dany wiersz
Kod XAML

<DataGrid.Columns>
                <DataGridTextColumn Header="Asortyment" Binding="{Binding Asortyment}"/>
                <DataGridTextColumn Header="Numer Partii" Binding="{Binding NumerPartii}"/>
                <DataGridTextColumn Header="Data przydatności" Binding="{Binding DataPrzyd}"/>
                <DataGridTextColumn Header="Podpis" Binding="{Binding Podpis}"/>

                <DataGridTemplateColumn Width="45" Header="Usuń">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button x:Name="delete" Content="Usuń" Click="delete_Click"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>

        </DataGrid>

I kod do obsługi kliknięcia w C#

             DataTable dt = new DataTable();
            DataRowView row = (DataRowView)hdiDG.SelectedItem;
            dt.Rows.Remove(row.Row);

Kolumny Datagrida binduje w klasie

 public class DodajDoWidoku
        {
            public string Asortyment { get; set; }
            public string NumerPartii { get; set; }
            public string DataPrzyd { get; set; }
            public string Podpis { get; set; }
        }

Próbowałem na kilka sposobów z DataRowView i zawsze wyskakiwał błąd InvalidCastException : "Nie można rzutować obiektu typu 'DodajDoWidoku' na typ 'System.Data.DataRowView'."

Pozostało 580 znaków

2018-08-11 18:18

Rejestracja: 8 lat temu

Ostatnio: 3 miesiące temu

Stwórz klasę reprezentującą element listy

class element{
     string Name {get; private set};
     string Surname {get; private set};
}

W ViewModelu stwórz kolekcję która będzie bindowana do ItemsSource DataGrida

IList<element> PersonList = new ObservableCollection<element>();

każdy "Row" będzie otrzymywał obiekt "element" jako DataContext. Wystarczy po naciśnięciu przycisku wyszukać który to obiekt listy i go usunąć:

private void ButtonClick(object sender, RoutedEventArgs e)
{
     element El= (sender as Button).DataContext as Element; 
     if(element != null)
          myViewModel.PersonList.Remove(element);
}
edytowany 1x, ostatnio: gswidwa, 2018-08-11 18:19

Pozostało 580 znaków

2018-08-11 22:28

Rejestracja: 13 lat temu

Ostatnio: 3 tygodnie temu

0

Dziękuję za podpowiedź, co prawda obecny projekt nie robię w MVVM, ale zrobiłem w/g Twojego wzoru i działa jak należy.
Pozdrawiam

Pozostało 580 znaków

2018-08-12 11:10

Rejestracja: 13 lat temu

Ostatnio: 3 tygodnie temu

0

Przez Button działa, ale jednak muszę zrobić jako MenuItem i po kliknięciu nie usuwa się

NazwaKlasy el = (sender as MenuItem).DataContext as NazwaKlasy;
            if (el != null)
            {
                HDI.Remove(el);
            }

Pozostało 580 znaków

2018-08-12 16:57

Rejestracja: 8 lat temu

Ostatnio: 3 miesiące temu

0

A w DataContext na pewno masz element listy?

Pozostało 580 znaków

2018-08-12 19:03

Rejestracja: 13 lat temu

Ostatnio: 3 tygodnie temu

0

Nie może być inaczej, nie skompilowałby się

No jasne, że skompilowałoby się - gswidwa 2018-08-13 01:32
Sprawdź jaki typ zwraca Ci DataContext - gswidwa 2018-08-13 02:40

Pozostało 580 znaków

Odpowiedz

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