直接在 DataGrid 中插入、更新和删除行并将更改保存在数据库中

Posted

技术标签:

【中文标题】直接在 DataGrid 中插入、更新和删除行并将更改保存在数据库中【英文标题】:Insert, Update, and Delete rows directly in DataGrid and save changes in database 【发布时间】:2020-08-23 13:27:16 【问题描述】:

我有一个ListView,其中包含我的 SQL Server 数据库中的表列表。我的列表视图项也有一个Selected 事件,它用数据库中的表填充我的DataGrid

我希望用户能够INSERT, UPDATE, & DELETE 所选表中的行并将这些更改保存在数据库中。

这是我在选择 ListView 项目时填充 DataGrid 的代码。我删除了一些,以免太长:

    public partial class TableManagement : UserControl

    public TableManagement()
    
        InitializeComponent();
    


      private void CustomerContact_Selected(object sender, RoutedEventArgs e)
    
        try
        
            string connectionString = ("Data Source=WINDOWS-B1AT5HC\\SQLEXPRESS;Initial Catalog=CustomerRelations;Integrated Security=True;");
            DataTable dt = new DataTable();
            SqlConnection connection = new SqlConnection(connectionString);
            SqlDataAdapter cmd = new SqlDataAdapter("SELECT [TXT_CUST_CNT], [Inactive] FROM [hb_CustCntct] ", connection);
            cmd.Fill(dt);
            dt.AcceptChanges();
            dt_TableManagement.DataContext = dt;

            dt_TableManagement.SelectedIndex = 0;

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

这是我的XMAL 代码listVeiwDataGrid

            <!--Grid 1-->
        <Grid x:Name="Grid1" Grid.Row="1" Grid.Column="0" Margin="15">
            <ListView>
                <ListViewItem x:Name="CustomerContact" Content="Customer Contact" Selected="CustomerContact_Selected"/>
                <ListViewItem x:Name="CsrNames" Content="Customer Service Representative Names" Selected="CsrNames_Selected"/>
                <ListViewItem x:Name="DisputeClassification" Content="Dispute Classification" Selected="DisputeClassification_Selected"/>
                <ListViewItem x:Name="DisputeStatus" Content="Dispute Status" Selected="DisputeStatus_Selected"/>
                <ListViewItem x:Name="FinancialAdjustment" Content="Financial Adjustment" Selected="FinancialAdjustment_Selected"/>
                <ListViewItem x:Name="InitialCallAnalysis" Content="Initial Call Analysis" Selected="InitialCallAnalysis_Selected"/>
                <ListViewItem x:Name="InitialCallReason" Content="Initial Call Reason" Selected="InitialCallReason_Selected"/>
                <ListViewItem x:Name="MeterIssue" Content="Meter Issue" Selected="MeterIssue_Selected"/>
                <ListViewItem x:Name="OpenInError" Content="Open In Error" Selected="OpenInError_Selected"/>
                <ListViewItem x:Name="PrimaryCause" Content="Primary Cause" Selected="PrimaryCause_Selected"/>
                <ListViewItem x:Name="RequestedWork" Content="Requested Work" Selected="RequestedWork_Selected"/>
                <ListViewItem x:Name="RevenueClass" Content="Revenue Class" Selected="RevenueClass_Selected"/>
                <ListViewItem x:Name="ServiceOrderDetails" Content="Service Order Details" Selected="ServiceOrderDetails_Selected"/>
                <ListViewItem x:Name="ServiceOrderType" Content="Service Order Type" Selected="ServiceOrderType_Selected"/>
                <ListViewItem x:Name="ServiceOrderAdjustment" Content="Service Order Adjusted" Selected="ServiceOrderAdjustment_Selected"/>
                <ListViewItem x:Name="UnderlyingCause" Content="Underlying Cause" Selected="UnderlyingCause_Selected"/>
                <ListViewItem x:Name="UtilityReportType" Content="Utility Report Type" Selected="UtilityReportType_Selected"/>
                <ListViewItem x:Name="WFMIssuedBy" Content="WFM Issued By" Selected="WFMIssuedBy_Selected"/>
            </ListView> 
        </Grid>

        <!--Grid 2-->
        <Grid x:Name="Grid2" Grid.Row="1" Grid.Column="2" Margin="15">
            <DataGrid x:Name="dt_TableManagement"
              materialDesign:ListBoxAssist.IsToggle="True"
              Background="White"
              EnableColumnVirtualization="True"
              EnableRowVirtualization="True"
              ItemsSource="Binding">
            </DataGrid>
        </Grid>

【问题讨论】:

【参考方案1】:

为了方便起见,您可以使用DataAdapter 来设置您的SELECT、INSERT、UPDATE、DELETE 命令。

因此,在DataAdapter 将填充您的DataSet / DataTable 而不是直接使用命令之后,它将能够自动检测更改的条目更改并使用适当的方法(INSERT/UPDATE/DELETE)当您只执行调用 DataAdapter 的 Update 方法。

DataAdapterFill 方法,使用“SELECT”命令和Update 命令,根据DataRow 的RowState 属性使用插入/更新/删除。所以当你删除/添加/修改行时,它只是改变它的状态。行的状态将以​​某种方式“更改”,直到您 AcceptChanges - DataAdapterUpdate 方法实际上是这样做的。 例如,您使用 DataAdapter 填充了一些数据表,然后删除了一些 DataRow - 该行仍然存在于 DataTable 中,但处于“已删除”状态。现在,当您使用刚刚修改的 DataTable 参数执行数据适配器的“更新”方法时 - DataAdapter 会查找以某种方式修改的行,并为这些行执行适当的 SQL 命令(在本例中为 DeleteCommand)。

要使用所有命令,您必须设置SqlDataAdapter的正确属性

UpdateCommand InsertCommand DeleteCommand

【讨论】:

我对代码进行了一些更改以反映您的建议。但是,我知道我仍然遗漏了一些东西,我是否需要以相同的格式使用 DataAdapter (INSERT/UPDATE/DELETE)? 我编辑了原始答案以更详细地向您解释这一点。

以上是关于直接在 DataGrid 中插入、更新和删除行并将更改保存在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

WPF关闭datagrid插入行

easyui datagrid没有ID情况下,easyui datagrid 删除行信息方法

如何在 SQL Server 触发器中复制插入、更新、删除的行

DOJO Datagrid 通过按钮删除行

使用 DataGrid 更新访问表时出错

检查 CollectionViewSource 中的行是不是是新行