Desidero abilitare l'utente a evidenziare una riga su WPF DataGrid e premere il tasto di cancellazione per eliminare la riga.Che cos'è l'evento "premuto il tasto cancella" per il Datagrid WPF?
- la funzionalità è già integrato nel UI della griglia, in modo per l'utente, la riga scompare
- Attualmente gestire questo sull'evento SelectionChanged (codice qui sotto)
- I ciclo attraverso tutti i "e.RemovedItems" ed eliminarli con LINQ
il problema è: anche quando semplicemente sE letta una riga e spostati da essa, viene attivato il cambio di selezione e quella riga è in e.RemovedItems (che è dispari, perché scegliere semplicemente qualcosa inserito in un contenitore RemovedItems?).
Quindi, sto cercando un evento DeleteKeyPressed così posso semplicemente gestirlo. Come si chiama quell'evento?
Sto utilizzando il toolkit di marzo 2009.
XAML:
<Grid DockPanel.Dock="Bottom">
<toolkit:DataGrid x:Name="TheDataGrid"
SelectionChanged="TheDataGrid_SelectionChanged"
AutoGenerateColumns="True"
RowEditEnding="TheDataGrid_RowEditEnding"/>
code-behind:
private void TheDataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if (e.RemovedItems.Count > 0)
{
Message.Text = "The following were removed: ";
foreach (object obj in e.RemovedItems)
{
Customer customer = obj as Customer;
Message.Text += customer.ContactName + ",";
_db.Order_Details.DeleteAllOnSubmit(
customer.Orders.SelectMany(o => o.Order_Details));
_db.Orders.DeleteAllOnSubmit(customer.Orders);
_db.Customers.DeleteOnSubmit(customer);
}
}
try
{
_db.SubmitChanges();
}
catch (Exception ex)
{
Message.Text = ex.Message;
}
}
RISPOSTA:
Grazie lnferis, che era esattamente quello che stavo cercando, qui è il mio evento di gestione dell'eliminazione finito per il datagrid, nota che l'evento KeyDown non si attiva per qualche motivo.
XAML:
<toolkit:DataGrid x:Name="TheDataGrid"
KeyDown="TheDataGrid_KeyDown"
PreviewKeyDown="TheDataGrid_PreviewKeyDown"
AutoGenerateColumns="True"
RowEditEnding="TheDataGrid_RowEditEnding"/>
code-behind
private void TheDataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Delete)
{
var grid = (DataGrid)sender;
if (grid.SelectedItems.Count > 0)
{
string checkMessage = "The following will be removed: ";
foreach (var row in grid.SelectedItems)
{
Customer customer = row as Customer;
checkMessage += customer.ContactName + ",";
}
checkMessage = Regex.Replace(checkMessage, ",$", "");
var result = MessageBox.Show(checkMessage, "Delete", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
foreach (var row in grid.SelectedItems)
{
Customer customer = row as Customer;
_db.Order_Details.DeleteAllOnSubmit(
customer.Orders.SelectMany(o => o.Order_Details));
_db.Orders.DeleteAllOnSubmit(customer.Orders);
_db.Customers.DeleteOnSubmit(customer);
}
_db.SubmitChanges();
}
else
{
foreach (var row in grid.SelectedItems)
{
Customer customer = row as Customer;
LoadData();
_db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, customer); //TODO: this doesn't refresh the datagrid like the other instance in this code
}
}
}
}
}
private void TheDataGrid_KeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("never gets here for some reason");
}
Il KeyDown non dovrebbe mai arrivare qui perché è già gestore (e.Handled = true) nel gestore precedente nella bolla. – Shimmy