Dave
Dave

Reputation: 33

c# wpf - DataGrid delete selected rows

I am using c #, wpf, DataGrid, SqlDataAdapter, DataTable, MS Sql server On the main form there is a DataGrid and a button. Clicking on the button should be removed from the DataGrid selected lines. And then from the database. But this is not happening! Only from the DataGrid! Here is my code:

private void Button_DeleteSelectedRows_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            if (dataGrid.SelectedItems.Count == 1)
            {
                int selectedIndex = dataGrid.SelectedIndex;
                var row = dataTable.Rows[selectedIndex];
                row.Delete();

                dataAdapter.Update(dataTable);
            }
            else if (dataGrid.SelectedItems.Count > 1)
            {
                int count = dataGrid.SelectedItems.Count;

                for (int i = count - 1; i >= 0; i--)
                {
                    DataRowView rowView = dataGrid.SelectedItems[i] as DataRowView;

                    dataTable.AsEnumerable()
                               .Where(r => r["Name"].ToString() == rowView.Row["Name"].ToString())
                               .ToList()
                               .ForEach(r => r.Delete());
                    dataTable.AcceptChanges();
                }
                dataAdapter.Update(dataTable);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

}

P.S.: I do not use MVVM

Thank you very much for the help!

Upvotes: 1

Views: 4903

Answers (4)

amir
amir

Reputation: 11

This code works to delete selected rows. Be sure

while (Mydatagrid.SelectedItems.Count >= 1)
{
 DataRowView drv = (DataRowView)Mydatagrid.SelectedItem;
 drv.Row.Delete();
}

Upvotes: 1

Dave
Dave

Reputation: 33

I'm sorry for not having replied and kept you waiting! Your advice helped me a lot. I have decided this is the case:

else if (dataGrid.SelectedItems.Count > 1)
        {
            while (dataGrid.SelectedItems.Count > 0)
            {
             int selectedIndex = dataGrid.SelectedIndex;
            var row = dataTable.Rows[selectedIndex];
            row.Delete();

            dataAdapter.Update(dataTable);
            }
        }

[SOLVED]

currently I am thinking seriously alter the application to MVVM :D:D

Upvotes: 0

Kylo Ren
Kylo Ren

Reputation: 8823

Everything is right I guess, to remove rows from DataTable use following syntax:

datatable.Rows.Remove((myGrid.SelectedItem as DataRowView).Row);

Or in second code block:

DataRowView rowView = dataGrid.SelectedItems[i] as DataRowView;
        datatable.Rows.Remove(rowView.Row);

then at last put

datatable.AcceptChanges();

changes should reflected properly.

Upvotes: 0

Venkatesh Muniyandi
Venkatesh Muniyandi

Reputation: 5640

You may consider refactoring the for-loop into a while loop., e.g while(datagrid.SelectedItem.Count >=1). Generally you will encounter issues when accessing an collection based on index, in case if you delete an item within a loop.

Debug Tip: Try to check count of selected Items within the for-loop loop and check if the object exists @ particular index.

Upvotes: 0

Related Questions