Set focus to next available node after deleting one or more rows in datagrid. Fixes issue #1471

This commit is contained in:
Ansgar Becker
2009-11-28 23:13:35 +00:00
parent 5f9a62de94
commit 1dc71c845d

View File

@@ -7058,7 +7058,7 @@ end;
}
function TMainForm.GridPostDelete(Sender: TBaseVirtualTree): Boolean;
var
Node: PVirtualNode;
Node, FocusAfterDelete: PVirtualNode;
Nodes: TNodeArray;
sql: WideString;
Affected: Int64;
@@ -7066,14 +7066,18 @@ var
msg: String;
begin
Node := Sender.GetFirstSelected;
FocusAfterDelete := nil;
sql := 'DELETE FROM '+mask(SelectedTable.Text)+' WHERE';
while Assigned(Node) do begin
EnsureChunkLoaded(Sender, Node);
sql := sql + ' (' +
GetWhereClause(@DataGridResult.Rows[Node.Index], @DataGridResult.Columns) +
') OR';
FocusAfterDelete := Node;
Node := Sender.GetNextSelected(Node);
end;
if Assigned(FocusAfterDelete) then
FocusAfterDelete := Sender.GetNext(FocusAfterDelete);
sql := Copy(sql, 1, Length(sql)-3);
try
@@ -7104,6 +7108,10 @@ begin
end;
SetLength(DataGridResult.Rows, Length(DataGridResult.Rows) - Selected);
Sender.DeleteSelectedNodes;
if not Assigned(FocusAfterDelete) then
FocusAfterDelete := Sender.GetLast;
if Assigned(FocusAfterDelete) then
SelectNode(Sender as TVirtualStringTree, FocusAfterDelete);
Sender.EndUpdate;
end else begin
// Should never get called as we block DELETEs on tables without a unique key