Как лучше всего удалить записи из базы данных с помощью DataGrid

Я пытаюсь создать приложение С# WPF с базой данных сервера Microsoft SQL. Что-то вроде Company Manager, теперь я хочу закодировать управление сотрудниками:

  • добавление/редактирование/удаление сотрудников

Я создал модель Employee, dbContext и страницу с DataGrid с привязанной базой данных. Затем я сделал AddEmployeeButton_Click(); в моем EmployeePage.xaml.cs.

private void AddEmployeeButton_Click(object sender, RoutedEventArgs e)
    {
        using (var databaseContext = new CompanyManagerContext())
        {
            var newEmployee = new Employee
            {
                FirstName = FirstNameTextBox.Text,
                LastName = LastNameTextBox.Text,
                BirthDate = BirthdayDatePicker.SelectedDate,
                HomePhoneNumber = HomePhoneTextBox.Text,
                MobilePhoneNumber = MobilePhoneTextBox.Text,
                MailAdress = EmailTextBox.Text,
                State = StateTextBox.Text,
                City = CityTextBox.Text,
                ZipCode = ZipCodeTextBox.Text,
                Street = StreetTextBox.Text,
            };

            try
            {
                databaseContext.Employees.Add(newEmployee);
                databaseContext.SaveChanges();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        ClearEmployeeData();
        EmployeesDataGrid.Items.Refresh();
    }

но моя проблема, как создать DeleteEmployeeButton_Click(); Я хочу создать метод (на DeleteEmployeeButton_Click()), который удаляет выбранные записи. Как лучше всего это сделать?

Это мой xaml EmployeePage:

<Page x:Class="CompanyManager.Pages.EmployeePages"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:models="clr-namespace:CompanyManager.Core.Models"
      mc:Ignorable="d" 
      d:DesignHeight="700" d:DesignWidth="900"
      Title="EmployeePages">
<Page.Resources>
    <CollectionViewSource x:Key="CollectionViewSource"
                          d:DesignSource="{d:DesignInstance {x:Type models:Employee}, CreateList=True}"></CollectionViewSource>
</Page.Resources>

<Grid Background="White">
    <Grid x:Name="ContentArea">
        <!-- Personal Details -->
        <Label x:Name="FirstNameLabel" Content="First Name" Margin="25,30,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Label x:Name="LastNameLabel" Content="Last Name" Margin="25,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Label x:Name="BirthdayLabel" Content="Birthday date" Margin="25,90,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>

        <TextBox x:Name="FirstNameTextBox" Margin="250,31,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>
        <TextBox x:Name="LastNameTextBox" Margin="250,62,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>
        <DatePicker x:Name="BirthdayDatePicker" Margin="250,92,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></DatePicker>

        <!-- Contact -->
        <Label x:Name="HomePhoneLabel" Content="Home phone number" Margin="25,120,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Label x:Name="MobilePhoneLabel" Content="Mobile phone number" Margin="25,150,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Label x:Name="EmailLabel" Content="Email Adress" Margin="25,180,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>

        <TextBox x:Name="HomePhoneTextBox" Margin="250,120,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>
        <TextBox x:Name="MobilePhoneTextBox" Margin="250,151,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>
        <TextBox x:Name="EmailTextBox" Margin="250,182,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>

        <!-- ADRESS -->
        <Label x:Name="StateLabel" Content="State" Margin="25,210,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Label x:Name="CityLabel" Content="City" Margin="25,240,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Label x:Name="ZipCodeLabel" Content="Zip Code" Margin="25,270,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        <Label x:Name="StreetLabel" Content="Street" Margin="25,300,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>

        <TextBox x:Name="StateTextBox" Margin="250,212,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>
        <TextBox x:Name="CityTextBox" Margin="250,243,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>
        <TextBox x:Name="ZipCodeTextBox" Margin="250,273,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>
        <TextBox x:Name="StreetTextBox" Margin="250,302,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="100" Height="26"></TextBox>

        <!-- Job details -->
        <Label x:Name="JobPositionLabel" Content="Jobposition" Margin="25,330,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Height="30" Width="81"/>
        <Label x:Name="SalaryLabel" Content="Salary" Margin="25,360,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Height="25" Width="58"/>


        <!-- <Image x:Name="EmployeePhoto" Margin="25,425,705,115"/> -->
        <!-- DataGrid -->
        <DataGrid x:Name="EmployeesDataGrid" HorizontalAlignment="Left" Margin="545,31,0,0" VerticalAlignment="Top" Height="554" Width="290"
                  DataContext="{StaticResource CollectionViewSource}" 
                  AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" RowDetailsVisibilityMode="VisibleWhenSelected" IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="IdColumn" Header="Id" Binding="{Binding Id}"/>
                <DataGridTextColumn x:Name="FirstNameColumn" Header="First Name" Binding="{Binding FirstName}"/>
                <DataGridTextColumn x:Name="LastNameColumn" Header="Last Name" Binding="{Binding LastName}"/>
                <DataGridTextColumn x:Name="MobilePhoneNumberColumn" Header="Mobile Phone" Binding="{Binding MobilePhoneNumber}"/>
            </DataGrid.Columns>
        </DataGrid>

    </Grid>

    <Grid x:Name="ButtonsArea">
        <Button Name="AddEmployeeButton" Content="Add Employee" Margin="28,625,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Click="AddEmployeeButton_Click"/>
        <Button Name="EditEmployeeButton" Content="Edit Employee" Margin="138,625,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Click="EditEmployeeButton_Click"/>
        <Button Name="DeleteEmployeeButton" Content="Delete Employee" Margin="245,625,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Click="DeleteEmployeeButton_Click"/>
    </Grid>
</Grid>


person michalmichalek    schedule 25.01.2017    source источник


Ответы (1)


При условии, что вы установили для свойства Source элемента CollectionViewSource значение IEnumerable<Employee>, вы могли бы, например, обработать событие PreviewKeyDown для DataGrid следующим образом:

<DataGrid x:Name="EmployeesDataGrid" HorizontalAlignment="Left" Margin="545,31,0,0" VerticalAlignment="Top" Height="554" Width="290"
                  DataContext="{StaticResource CollectionViewSource}" 
                  AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" RowDetailsVisibilityMode="VisibleWhenSelected" IsReadOnly="True"
                  PreviewKeyDown="dg_PreviewKeyDown">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="IdColumn" Header="Id" Binding="{Binding Id}"/>
        <DataGridTextColumn x:Name="FirstNameColumn" Header="First Name" Binding="{Binding FirstName}"/>
        <DataGridTextColumn x:Name="LastNameColumn" Header="Last Name" Binding="{Binding LastName}"/>
        <DataGridTextColumn x:Name="MobilePhoneNumberColumn" Header="Mobile Phone" Binding="{Binding MobilePhoneNumber}"/>
    </DataGrid.Columns>
</DataGrid>

private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
{
    Employee employee = EmployeesDataGrid.SelectedItem as Employee;
    if (employee != null)
    {
        using (var databaseContext = new CompanyManagerContext())
        {
            try
            {
                databaseContext.Employees.Attach(employee);
                databaseContext.Employees.Remove(employee);
                databaseContext.SaveChanges();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

Затем вы сможете удалить запись, выбрав строку и нажав кнопку [УДАЛИТЬ].

person mm8    schedule 25.01.2017
comment
Я пытался использовать этот способ раньше, но получил ошибку: Объект не может быть удален, так как он не найден в ObjectStateManager. - person michalmichalek; 25.01.2017
comment
Что, если вы прикрепите его, прежде чем удалить, как предлагается здесь?: stackoverflow.com/questions/7791149/ - person mm8; 25.01.2017