Вставка, обновление и удаление строк непосредственно в DataGrid и сохранение изменений в базе данных - PullRequest
2 голосов
/ 08 мая 2020

У меня есть ListView со списком таблиц из моей SQL базы данных сервера. У меня также есть событие Selected для элементов представления списка, которые заполняют мой DataGrid таблицей в базе данных.

Я хотел бы, чтобы пользователь мог INSERT, UPDATE, & DELETE строк в выбранной таблице и сохранять эти изменения в базе данных.

Вот мой код, который заполняет DataGrid, когда выбран элемент ListView. Я удалил некоторые, чтобы не делать это слишком долго:

    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 код для listVeiw и DataGrid

            <!--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 Ответ

1 голос
/ 08 мая 2020

Чтобы упростить задачу, вы можете использовать DataAdapter, где вы можете установить свои команды SELECT, INSERT, UPDATE, DELETE.

Итак, после того, как DataAdapter заполнит ваш DataSet / DataTable вместо использования команды напрямую, он сможет автоматически обнаруживать измененные изменения записей и использовать соответствующий метод (INSERT / UPDATE / DELETE), когда вы вызываете только метод DataAdapter Update.

DataAdapter имеет метод Fill, который использует команду «SELECT» и команду Update, использующую вставку / обновление / удаление на основе RowState свойство DataRow. Поэтому, когда вы удаляете / добавляете / изменяете строку, она просто меняет ее состояние. Состояние строк будет каким-то образом «Изменено» до тех пор, пока вы не AcceptChanges - что на самом деле делает Update метод DataAdapter. Например, вы заполнили некоторую таблицу данных с помощью DataAdapter, а затем удалили некоторую DataRow - строка все еще существует в DataTable, но в состоянии «Удалено». Теперь, когда вы выполняете метод «Обновить» адаптера данных с параметром DataTable, который вы только что изменили, DataAdapter ищет строки, измененные каким-либо образом, и выполняет соответствующие SQL команды для строк (в случае DeleteCommand).

Чтобы использовать все команды, вы должны установить правильные свойства SqlDataAdapter

  • UpdateCommand
  • InsertCommand
  • DeleteCommand
...