当dbgrid内的一个列改变时, 如何使 edit 也跟着改变.(100分)

  • 主题发起人 tom12345
  • 开始时间
还是用dbedit吧,多省事,:D
 
Another_eYes,如何获得dbgrid.InplaceEditor.OnChange事件
 
type
TMyCustomGrid = class(TCustomGrid);
TMyCustomEdit = class(TCustomEdit);

....
with TMyCustomGrid(DBGrid1) do
begin
if InplaceEditor = nil then
ShowEditor;
if InplaceEditor <> nil then // ShowEditor不一定成功(比如一个readonly或disable的列就不行)
TMyCustomEdit(InplaceEditor).OnChange := xxxxxx;
end;
....
 
Another_eYes, 能给出完整的代码吗?
 
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
edit1.Text := DBGrid1.SelectedField.AsString;
end;
 
nicklung, 以上方法不行
 
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if pos(DBGrid1.SelectedField.AsString,edit1.Text) <> 0 then
begin
edit1.Text := edit1.Text + key;
end
else
begin
edit1.Text := DBGrid1.SelectedField.AsString + key;
end;
end;
 
我来试一下:
在dbgrid1的onkeypress事件中....
if dbgrid1.SelectedIndex=1
then edit1.Perform(wm_char,ord(key),0);
delphi 6 下测试通过!
 
你在Grid连的那个数据库访问对象比如说ADOTable
的Fieldediter中加入字段,然后在拖到Form上,
那么Grid中改变,则Edit也该变,反之也是.
 
测试通过!!
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids,DBGrids, StdCtrls, DB, DBTables;

type
TMyDBGrid=Class(TDBGrid)
Public
property InplaceEditor;
end;
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Edit1: TEdit;
Table1: TTable;
DataSource1: TDataSource;
procedure FormCreate(Sender: TObject);
procedure StringGrid1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DBGrid1CellClick(Column: TColumn);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DBGrid1.EditorMode:=True;
end;

procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Edit1.Text:=TMyDBGrid(DBGrid1).InplaceEditor.Text;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if TMyDBGrid(DBGrid1).InplaceEditor<>nil then
Edit1.Text:=DBGrid1.SelectedField.DisplayText;
end;

end.
 
yczzg和aizb两位大侠: 按你们的方法修改列的内容时, 只能在列的数据前插入字符, 而
不能在中间和后面插入字符;只能用<--键删除字符, 而不能用<Dlete>键删除字符; 并且
当移动到下一条记录并有数据时, 用<--键和<Dlete>键都不能删除字符.
nicklung和zxbyh两位大侠的方法不行.
 
to 楼主:
你试过我的方法没有?用我的方法我怎么无论如何也试不出你说的“只能在列的数据前插入字符, 而
不能在中间和后面插入字符;只能用<--键删除字符, 而不能用<Dlete>键删除字符; 并且
当移动到下一条记录并有数据时, 用<--键和<Dlete>键都不能删除字符.”的情况呢?
该方法如果说还有一个缺点的话就是必须要按键弹起的时候才会在Edit1中更新。
 
aizb, 我的确试过你的方法, 而且还要加上yczzg的方法才能达到以上效果.
我用的是delphi7.0
 
改造了一下:
首先,给Edit赋初值.....然后,如下:
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if dbgrid1.SelectedIndex=1
then begin
case key of
vk_home,vk_end,
vk_Up, vk_down,
vk_left, vk_right,
vk_delete:edit1.perform(wm_keydown,key,1);
else edit1.perform(wm_char,key,1);
end;
end;
end;
....特殊字符,如del,方向键等用wm_keydown消息发送,字符键用wm_char发送
这样就可以了!
 
yczzg, 还是一样.
 
我想你的程序其他地方还有问题,比如你的Edit是否有OnChange事件?是否又改了DBGrid所指向的DataSet的数据?
 
aizb, 我没有你说的那些问题. 能否把你的源程序、可执行文件、数据库文件一起打包给
我?我的邮箱:zjd_sg@sohu.com
 
晕,程序没有保存,上面就是全部源码了,数据库是Delphi带的DBDEMOS数据的Customer表.
 
晕,我是完全按你的源程序做的,无法实现.
 

Similar threads

S
回复
0
查看
958
SUNSTONE的Delphi笔记
S
S
回复
0
查看
779
SUNSTONE的Delphi笔记
S
D
回复
0
查看
702
DelphiTeacher的专栏
D
D
回复
0
查看
610
DelphiTeacher的专栏
D
顶部