Reputation: 33
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
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
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
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
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