DBGrid的问题?

特招 2004-09-22 03:12:58
建一个ADOConnection,两个ADOQuery,两个DataSource,两个DBGrid
其中ADOConnection-ADOQuery1--DataSource1--DBGrid1
ADOConnection-ADOQuery2--DataSource2--DBGrid2
ADOQuery1:select * from zd
ADOQuery2:select * from zs
zd表 zs表
zd_id name zs_id lei
1 a 1 4
2 s 2 5
3 e 3 6

zd表中的zd_id 和zs表中的zs_id是一对一的关系

想实现如下功能:
点击DBGrid1中的一条数据,DBGrid2中的数据也跟着移动到相应的位置
比如
DBGrid1中的记录移动到 id =2
那么DBGrid2中的记录也跟着移动到id =2

我的代码如下:
void __fastcall TForm1::DBGrid1ColEnter(TObject *Sender)
{
String h,i;
h = ADOQuery1->FieldByName("zd_id")->AsString;
for(int a = 1;a<=ADOQuery2->RecordCount;a++)
{
i = ADOQuery2->FieldByName("zs_id")->AsString;
if (h!=i)
{
ADOQuery2->Next();
if (ADOQuery2->Eof)
{
ADOQuery2->First();
}
}
else
break;
}
}
可以移动 但是这个不好 需要循环很多次
我想一下移动到那个地方 需要帮忙 呵呵
...全文
138 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nhlqm 2004-09-26
  • 打赏
  • 举报
回复
用主明细表比较好
真如实观 2004-09-24
  • 打赏
  • 举报
回复
有三个方法可以参考:
1,master/detail
2,在DBGrid1的OnAfterScroll中写:
int idA=ADOADOQuery1->FieldByName("zd_id")->Value;
String sSQL="select * from zs表 where zs_id="+IntToStr(idA);
ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add(sSQL);
ADOQuery2->Open();
3,在DBGrid1的OnAfterScroll中写locate方法。
特招 2004-09-24
  • 打赏
  • 举报
回复
locate的问题已经解决.

void __fastcall TForm1::DBGrid1CellClick(TColumn *Column)
{
Form1->moveRec();
}

void __fastcall TForm1::DBGrid1ColEnter(TObject *Sender)
{
Form1->moveRec();
}

void __fastcall TForm1::moveRec()
{
String h,i;
TLocateOptions Opts;
Opts.Clear();
Opts << loPartialKey;
h = ADOQuery1->FieldByName("zd_id")->AsString;

ADOQuery2->Locate("zs_id",h,Opts);
}
我是这样实现的,不过有缺陷,
只有当鼠标点击的时候,DBGrid2才能定位到zd_id 和 zs_id相同的记录.
如果用键盘的上下箭头来移动记录,那么DBGrid2记录将得不到定位.

问:用什么方法或函数才能在DBGrid1移动记录时,触发定位事件呢?
特招 2004-09-23
  • 打赏
  • 举报
回复
Locate()怎么用啊 能讲讲吗?
gxf189 2004-09-22
  • 打赏
  • 举报
回复
這個做法只是相對數據量不大的情況下, 是可以的, 如果是數據量大的情況應該采用ADOQuery的Locate()方法來定位, 這樣可提高運行速度!
gxf189 2004-09-22
  • 打赏
  • 举报
回复
這個可以在ADOQuery里寫SQL 語句來解決, 例如:在ADOQuery1 加SQL語句:select * from TableName1
在ADOQuery2 加SQL語句:select * from TableName2 where zd_id =:zd_id
然後,在DBGrid1的onChangeNode事件中打開ADOQuery1, 再把ADOQuery1中的zd_id值賦給ADOQuery2,zd_id參數, 再把ADOQuery2打開即可!
pangdu 2004-09-22
  • 打赏
  • 举报
回复
学习

604

社区成员

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

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