做项目用到了编辑ListView的列,原来写过对StringGrid的单元格编辑,着了下代码,同时也在网上参考了代码写出来了。
大致意思:双击时找到当前选择的行,并通过列遍历找到具体的列,找到行列就可以定位单元格了,然后读出来数据到Edit,同时设置Edit显示,当离开Edit时把具体的值写回ListView。
不多说了上代码,请参考。
Edit的事件如下:
procedure TfrmYuanCaiLiaoIn.edtListviewChange(Sender: TObject);
begin
ListViewBookIn.Selected.SubItems[nCurIndex - 1] := edtListview.Text;
end;
procedure TfrmYuanCaiLiaoIn.edtListviewExit(Sender: TObject);
begin
if edtListview.Text <> '' then
begin
ListViewBookIn.Selected.SubItems[nCurIndex-1] := edtListview.Text;
edtListview.Visible := False;
end;
end;
procedure TfrmYuanCaiLiaoIn.FormCreate(Sender: TObject);
begin
nCurIndex := 0;
end;
ListView代码:
procedure TfrmYuanCaiLiaoIn.ListViewBookInDblClick(Sender: TObject);
var
W, X, nCount: Integer;
Rect: TRect;
Pos: TPoint;
nCol: Integer;
begin
if Assigned(ListViewBookIn.Selected) then//判断双击的区域是否为有效区域
begin
Pos := ListViewBookIn.ScreenToClient(Mouse.CursorPos);
nCount := ListViewBookIn.Columns.Count;
X := -GetScrollPos(ListViewBookIn.Handle, SB_HORZ);
for nCol := 0 to nCount - 1 do
begin
W := ListView_GetColumnWidth(ListViewBookIn.Handle, nCol);
if Pos.X <= X + W then
begin
Break;
end;
X := X + W
end;
nCurIndex := nCol;
if nCol = nCount then
begin
Exit;
end;
if nCol = 1 then
begin
Exit; //第1列不允许编辑,nCol 就是选定哪一列
end;
if X < 0 then
begin
W := W + X;
X := 0;
end;
Rect := ListViewBookIn.Selected.DisplayRect(drBounds);
Pos.X := X;
Pos.Y := Rect.Top;
MapWindowPoints(ListViewBookIn.Handle, Handle, Pos, 1);
edtListview.SetBounds(Pos.X, Pos.Y, W, Rect.Bottom- Rect.Top + 3);
edtListview.Parent := ListViewBookIn;
edtListview.Top := ListViewBookIn.Selected.Top;
edtListview.Text := ListViewBookIn.Selected.SubItems[nCurIndex-1];
edtListview.Visible := True;
edtListview.SetFocus
end;
end;
ListView需要设定 HideSelection为FALSE、RowSelect为TRUE
注:如果您觉得ListView行间距小,可以放一个ImageList上去,把ImageList的Height修改为18,然后让ListView的Images选择ImageList即可。