DBGrid自动填充上一单元格内容(200分)

  • 主题发起人 主题发起人 knife_s
  • 开始时间 开始时间
K

knife_s

Unregistered / Unconfirmed
GUEST, unregistred user!
以前写过这个功能,不过随写随丢了
就是按下方向键,在DBGRID中自动填充上一单元格的内容。
谢谢了
 
在数据集里面操作,OnNewRecord事件里面写,先取出上一条记录的值,然后赋值给记录的默认值。
 
to levi
我现在是想对数据集进行批量修改,有部分内容是相同的,不会新增数据,所以也没有OnNewRecord
因为要处理一些数据,也不好用AfterScroll,
 
keydown里存值,最好加上键值判断
if key=vk_down or key=vk_up......//类似的,没写完自己写吧
str:=dbgrd1.SelectedField.Text;
keyup里改值
edit;
dbgrd1.SelectedField.Text:=str;
post;
 
没看懂,对数据进行批量修改,又不新增数据,是什么意思?
比如说表有两条记录, 想把第二条记录的内容改成跟第一条一样?
如果第二条已经有数据了,那为何要改成跟第一条一样?如果第二条没数据,那新增这条记录的目的又是什么?
LZ说明白点,以便大家好提供意见。
 
procedure TForm1.DBGridEh1KeyPress(Sender: TObject;
var Key: Char);
var
ADBGridEh: TDBGridEh;
MyGrid: TMyGrid;
begin
if Key = #13 then
begin
Key := #0;
ADBGridEh := TDBGridEh(Sender);
MyGrid := TMyGrid(DBGridEh1);
if MyGrid.Row < MyGrid.RowCount - 1 then
exit;
ADBGridEh.DataSource.DataSet.Append;
ADBGridEh.SelectedIndex := 0;
end;
end;

procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject;
const Rect: TRect;
DataCol: Integer;
Column: TColumnEh;
State: TGridDrawState);
var
ADBGridEh: TDBGridEh;
MyGrid: TMyGrid;
r: TRect;
begin
ADBGridEh := TDBGridEh(Sender);
MyGrid := TMyGrid(ADBGridEh);
if MyGrid.Row < MyGrid.RowCount - 1 then
exit;
PostMessage(Handle, wm_my_do0, 0, 0);
end;

procedure TForm1.my_do0(var Message: TMessage);
var
ADBGridEh: TDBGridEh;
MyGrid: TMyGrid;
r, Rect, Rect0: TRect;
i: integer;
begin
ADBGridEh := DBGridEh1;
MyGrid := TMyGrid(ADBGridEh);
if not (ADBGridEh.DataSource.DataSet.State in [dsEdit, dsInsert]) then
begin
exit;
end;
if MyGrid.Row < MyGrid.RowCount - 1 then
exit;
with MyGriddo
begin
Canvas.Pen.Color := clSilver;
for i := 0 to ColCount - 1do
begin

Rect := CellRect(i, rowcount - 1);
r := Rect;
dec(r.Left);
inc(r.Right);
r.Bottom := Rect.Bottom + (Rect.Bottom - Rect.top);
inc(r.Bottom);
r.Top := Rect.Bottom;
if i = 0 then
begin
Canvas.Rectangle(r);
Rect0 := CellRect(0, 0);
inc(Rect0.Right);
r := Rect0;
r.Top := Rect.Bottom + 1;
r.Bottom := r.top + (Rect0.Bottom - Rect0.Top);
Canvas.CopyRect(r, Canvas, Rect0);
end
else
begin
Canvas.Rectangle(r);
end;
end;
end;
end;

procedure TForm1.DBGridEh1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
var
ADBGridEh: TDBGridEh;
MyGrid: TMyGrid;
acol, arow: integer;
r: TRect;
begin
ADBGridEh := TDBGridEh(Sender);
MyGrid := TMyGrid(ADBGridEh);
r := MyGrid.CellRect(0, MyGrid.RowCount - 1);
if (y < r.Bottom) or (y > r.Bottom + MyGrid.DefaultRowHeight) then
exit;
ADBGridEh.DataSource.DataSet.Append;
end;
 
类似
if Key = #13 then
begin
Key := #0;
ADBGridEh := TDBGridEh(Sender);
MyGrid := TMyGrid(DBGridEh1);
if MyGrid.Row < MyGrid.RowCount - 1 then
exit;
ADBGridEh.DataSource.DataSet.Append;
ADBGridEh.SelectedIndex := 0;
end;
 
已经解决了,在Keydown 和Keyup中写事件
开始走了一点弯路,在测试这两个事件时,各入了一个ShowMessage,结果Down事件Show来后,不会激活Up事件
 
后退
顶部