listView的刷新问题
arg 2002-04-29 09:24:02 我在使用 listView 时碰到了如一个问题 百思不得其解
请高手指教
在使用listview显示数据库中的纪录
在listview.onchange中会判断数据集是否改变,如果改变的话就保存记录。
我发现保存后listview中有一条被不管选中与否都会有一个虚线框,这个items点击时 listview.selected 竟然是 nil .使得我的 listview.onclick 事件不能正确运行,请帮帮我,我已经琢磨了2天了
以下是代码:
//显示数据库
rocedure TLabOtherInfoFrm.ListViewShowDB(AListView: TListView; AClientDataSet:
TClientDataSet; NowPos: integer; ItemNameField, AFieldName1, AFieldName2:
string);
var
aListViewData: TListViewData;
alistItem: TlistItem;
i: integer;
funPointer: TLVChangeEvent;
begin
funPointer := AListView.OnChange;
AListView.OnChange := nil;
try
for i := 0 to AListView.Items.Count - 1 do
TListViewData(AListView.Items[i].Data).Free;
AListView.Items.Clear;
AListView.Selected := nil;
if AClientDataSet.IsEmpty then exit;
i := 0;
while I <= 3 do
begin
AClientDataSet.First;
while not AClientDataSet.Eof do
begin
{ TODO -o蒋彦博 : 函数还是不够通用。 }
if AClientDataSet.FieldByName('zt').asInteger = i then
begin
alistItem := AlistView.Items.Add;
alistItem.Caption :=
AClientDataSet.fieldbyname(ItemNameField).asString;
aListViewData := TListViewData.Create;
aListViewData.strID :=
AClientDataSet.fieldbyname(AFieldName1).asString;
aListViewData.strName :=
AClientDataSet.fieldbyName(AFieldName2).asstring;
alistItem.Data := aListViewData;
alistItem.ImageIndex := i;
end;
AClientDataSet.Next;
end;
inc(i);
end;
if (NowPos > AListView.Items.Count - 1) or (NowPos < 0) then exit;
AListView.Items[NowPos].Selected := TRUE;
finally
AListView.OnChange := funpointer;
//AListView.Refresh;
end;
end;
//点击事件
procedure TLabOtherInfoFrm.ListView2Click(Sender: TObject);
begin
try
if (ListView2.Items.Count = 0) or not (ListView2.Selected <> nil) then exit;
DMLabOtherInfo.cdsLabGrade.Locate('ID',
TListViewData(ListView2.Selected.Data).strID, [loPartialKey]);
repFlag := DMLabOtherInfo.cdsLabGrade.fieldbyname('zt').asinteger;
// NowPos := ListView2.Selected.Index;
except
ShowMessage('数据库错误!');
end;
end;
//onchange事件
if ActFlag <> 0 then
begin
if Application.MessageBox('数据已经改变保存吗?', '消息', MB_OKCANCEL +
MB_ICONWARNING) <> IDOK then
begin
cancal_actionExecute(self);
Exit;
end;
save_actionExecute(self);
end;
分不够的话 请提出了来我在开贴加