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;

分不够的话 请提出了来我在开贴加
...全文
384 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyfhz 2002-05-05
  • 打赏
  • 举报
回复
同意netfriend(NetFriend) 的说法,
另外,TListView在刷新上有时会发生问题,你把窗口移到后面,再把它显示出来看
一下ListView是不是发生了改变,
还有如果ListView的MultiSelected为True的话,直接设置
ListView.Selected不会清除原来选中的记录
arg 2002-04-30
  • 打赏
  • 举报
回复
我用的数据库本来就有 primary key
qi_gu 2002-04-30
  • 打赏
  • 举报
回复
请你给你的数据库加个primary key,试试
arg 2002-04-30
  • 打赏
  • 举报
回复
关键是为什么listview会产生这样的问题。要是对我的程序不懂得话请提出来

还有。我现在没有使用 lisview的多选时,保存时也会出现选中两条的现象,哎。。
yixia 2002-04-30
  • 打赏
  • 举报
回复
我看不明白!
hch_d 2002-04-30
  • 打赏
  • 举报
回复
gz...
horlen 2002-04-29
  • 打赏
  • 举报
回复
up
NetFriend 2002-04-29
  • 打赏
  • 举报
回复
建议保存数据后,设置LISTVIEW中修改的数据对应的ITEM为SELECTED状态,如果修改了多个ITEMS,就设置修改的第一个ITEM为SELECTED状态。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧