自定义数据导航 、增删改:效果如下图,仅当做笔记本,老鸟勿喷:
代码如下:
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
nbFirst: TButton;
nbPrior: TButton;
nbNext: TButton;
nbLast: TButton;
nbDelete: TButton;
Panel1: TPanel;
DataSource1: TDataSource;
nbEdit: TButton;
nbInsert: TButton;
nbPost: TButton;
nbCancel: TButton;
DBEdit1: TDBEdit;
NorthwindConnection: TFDConnection;
EmployeesTable: TFDQuery;
CustomersTable: TFDQuery;
DataSource2: TDataSource;
procedure DataSource1StateChange(Sender: TObject);
procedure nbFirstClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DataSource1StateChange(Sender: TObject);
var
CanModify: Boolean;
begin
//TfunctionTable.Insert;
{设置导航按钮的有效性}
nbFirst.Enabled := (Not DataSource1.DataSet.Bof) and (Not nbpost.Enabled) ;
nbLast.Enabled := (Not DataSource1.DataSet.Eof) and (Not nbpost.Enabled);
nbPrior.Enabled := (nbFirst.Enabled) and (Not nbpost.Enabled);
nbNext.Enabled := (nbLast.Enabled) and (Not nbpost.Enabled);
nbpost.Enabled := DataSource1.DataSet.State in [dsInsert,dsEdit];
nbinsert.Enabled := {bCanNew and }Not nbpost.Enabled ;
nbEdit.Enabled := {bCanModify and} Not nbpost.Enabled;
nbCancel.Enabled := nbpost.Enabled ;
//nbDelete.Enabled := bCanDelete;
//nbPrint.Enabled := bCanPrint;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
nbFirst.Click;
end;
procedure TForm1.nbFirstClick(Sender: TObject);
var
UpEnable, DnEnable: Boolean;
CanModify: Boolean;
nav:boolean;
begin
case (sender as tbutton).Tag of
1: DataSource1.DataSet.First;
2: DataSource1.DataSet.Prior;
3: DataSource1.DataSet.Next;
4: DataSource1.DataSet.Last;
5: begin
DataSource1.DataSet.INSERT;
nav:=false;
end;
6: begin
DataSource1.DataSet.Edit;
nav:=false;
end;
7: DataSource1.DataSet.Delete;
8: begin
DataSource1.DataSet.Post;
nav:=true;
end;
9: begin
DataSource1.DataSet.Cancel;
nav:=true;
end;
end;
{Enabled 是导航各按钮的ENABLED}
CanModify := DataSource1.DataSet.Active and (Not nbpost.Enabled) {DataSource1.DataSet.Modified};
UpEnable := DataSource1.DataSet.Active and not DataSource1.DataSet.BOF;
DnEnable := DataSource1.DataSet.Active and not DataSource1.DataSet.EOF;
nbFirst.Enabled := UpEnable and nav;
nbPrior.Enabled := UpEnable and nav;
nbNext.Enabled := DnEnable and nav;
nbLast.Enabled := DnEnable and nav;
end;
end.
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 525
ClientWidth = 830
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object DBGrid1: TDBGrid
Left = 0
Top = 106
Width = 830
Height = 137
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = DEFAULT_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -11
TitleFont.Name = 'Tahoma'
TitleFont.Style = []
end
object Panel1: TPanel
Left = 0
Top = 0
Width = 830
Height = 41
Align = alTop
Caption = 'Panel1'
TabOrder = 1
object nbDelete: TButton
Tag = 7
Left = 327
Top = 10
Width = 64
Height = 25
Caption = 'nbDelete'
TabOrder = 0
OnClick = nbFirstClick
end
object nbFirst: TButton
Tag = 1
Left = 0
Top = 10
Width = 65
Height = 25
Caption = 'nbFirst'
TabOrder = 1
OnClick = nbFirstClick
end
object nbLast: TButton
Tag = 4
Left = 195
Top = 10
Width = 62
Height = 25
Caption = 'nbLast'
TabOrder = 2
OnClick = nbFirstClick
end
object nbNext: TButton
Tag = 3
Left = 130
Top = 10
Width = 67
Height = 25
Caption = 'nbNext'
TabOrder = 3
OnClick = nbFirstClick
end
object nbPrior: TButton
Tag = 2
Left = 65
Top = 10
Width = 64
Height = 25
Caption = 'nbPrior'
TabOrder = 4
OnClick = nbFirstClick
end
object nbEdit: TButton
Tag = 6
Left = 397
Top = 10
Width = 75
Height = 25
Caption = 'nbEdit'
TabOrder = 5
OnClick = nbFirstClick
end
object nbInsert: TButton
Tag = 5
Left = 263
Top = 10
Width = 58
Height = 25
Caption = 'nbInsert'
TabOrder = 6
OnClick = nbFirstClick
end
object nbPost: TButton
Tag = 8
Left = 456
Top = 10
Width = 67
Height = 25
Caption = 'nbPost'
TabOrder = 7
OnClick = nbFirstClick
end
object nbCancel: TButton
Tag = 9
Left = 529
Top = 10
Width = 75
Height = 25
Caption = 'nbCancel'
TabOrder = 8
OnClick = nbFirstClick
end
end
object DBEdit1: TDBEdit
Left = 8
Top = 79
Width = 121
Height = 21
DataField = 'LastName'
DataSource = DataSource1
TabOrder = 2
end
object DataSource1: TDataSource
DataSet = EmployeesTable
OnStateChange = DataSource1StateChange
Left = 280
Top = 80
end
object NorthwindConnection: TFDConnection
Params.Strings = (
'ConnectionDef=Northwind')
Connected = True
LoginPrompt = False
Left = 245
Top = 239
end
object EmployeesTable: TFDQuery
Active = True
Connection = NorthwindConnection
SQL.Strings = (
'SELECT * FROM Northwind.dbo.Employees')
Left = 245
Top = 287
end
object CustomersTable: TFDQuery
Active = True
Connection = NorthwindConnection
SQL.Strings = (
'SELECT * FROM Northwind.dbo.Customers')
Left = 56
Top = 395
end
object DataSource2: TDataSource
DataSet = CustomersTable
Left = 312
Top = 328
end
end
代码简单说明:
nbFirstClick 是把导航按钮和增删改几个按钮同时选择起来,再单击左侧的ONclick即成了'按钮组'CLICK
.再根据不同的tag,判断出是哪个按钮(tag 是自己根据需要输入);代码也可能有待完善的地方指教。
{procedure TDBNavigator.BtnClick(Index: TNavigateBtn);
begin
if (DataSource <> nil) and (DataSource.State <> dsInactive) then
begin
if not (csDesigning in ComponentState) and Assigned(FBeforeAction) then
FBeforeAction(Self, Index);
with DataSource.DataSet do
begin
case Index of
nbPrior: Prior;
nbNext: Next;
nbFirst: First;
nbLast: Last;
nbInsert: Insert;
nbEdit: Edit;
nbCancel: Cancel;
nbPost: Post;
nbRefresh: Refresh;
nbDelete:
if not FConfirmDelete or
(MessageDlg(SDeleteRecordQuestion, mtConfirmation,
mbOKCancel, 0) <> idCancel) then Delete;
nbApplyUpdates: Self.ApplyUpdates;
nbCancelUpdates: Self.CancelUpdates;
end;
end;
end;
if not (csDesigning in ComponentState) and Assigned(FOnNavClick) then
FOnNavClick(Self, Index);
end;
procedure TDBNavigator.DataChanged;
var
UpEnable, DnEnable: Boolean;
CanModify: Boolean;
begin
CanModify := Enabled and FDataLink.Active and FDataLink.DataSet.CanModify;
UpEnable := Enabled and FDataLink.Active and not FDataLink.DataSet.BOF;
DnEnable := Enabled and FDataLink.Active and not FDataLink.DataSet.EOF;
Buttons[nbFirst].Enabled := UpEnable;
Buttons[nbPrior].Enabled := UpEnable;
Buttons[nbNext].Enabled := DnEnable;
Buttons[nbLast].Enabled := DnEnable;
Buttons[nbDelete].Enabled := CanModify and not (FDataLink.DataSet.BOF and FDataLink.DataSet.EOF);
Buttons[nbRefresh].Enabled := Enabled and (nbRefresh in VisibleButtons) and FDataLink.Active and FDataLink.DataSet.CanRefresh;
Buttons[nbApplyUpdates].Enabled := CanModify and (nbApplyUpdates in VisibleButtons) and Self.CanApplyUpdates;
Buttons[nbCancelUpdates].Enabled := CanModify and (nbCancelUpdates in VisibleButtons) and Self.CanCancelUpdates;
end;
procedure TDBNavigator.EditingChanged;
var
CanModify: Boolean;
begin
CanModify := Enabled and FDataLink.Active and FDataLink.DataSet.CanModify;
Buttons[nbInsert].Enabled := CanModify;
Buttons[nbEdit].Enabled := CanModify and not FDataLink.Editing;
Buttons[nbPost].Enabled := CanModify and FDataLink.Editing;
Buttons[nbCancel].Enabled := CanModify and FDataLink.Editing;
Buttons[nbRefresh].Enabled := Enabled and (nbRefresh in VisibleButtons) and FDataLink.Active and FDataLink.DataSet.CanRefresh;
Buttons[nbApplyUpdates].Enabled := CanModify and (nbApplyUpdates in VisibleButtons) and Self.CanApplyUpdates;
Buttons[nbCancelUpdates].Enabled := CanModify and (nbCancelUpdates in VisibleButtons) and Self.CanCancelUpdates;
end;
}