【问题标题】:What is the best way to delete records from database using DataGrid使用 DataGrid 从数据库中删除记录的最佳方法是什么
【发布时间】:2017-01-25 10:47:02
【问题描述】:

我正在尝试使用 microsoft sql server 数据库创建 C# WPF 应用程序。 像公司经理这样的东西,现在我想编写员工管理代码:

  • 添加/编辑/删除员工

我使用绑定数据库的 DataGrid 创建了 Employee 模型、dbContext 和页面。 然后我做了 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>

【问题讨论】:

    标签: c# sql-server wpf entity-framework xaml


    【解决方案1】:

    如果您已将 CollectionViewSource 的 Source 属性设置为 IEnumerable&lt;Employee&gt;,您可以像这样处理 DataGrid 的 PreviewKeyDown 事件:

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

    然后您应该可以通过选择一行并按 [DELETE] 按钮来删除记录。

    【讨论】:

    • 我之前尝试过使用这种方式,但收到错误消息:“无法删除该对象,因为它在 ObjectStateManager 中找不到。”
    • 如果按照这里的建议在删除之前附加它怎么办?:stackoverflow.com/questions/7791149/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多