一个关于DBGrid的问题,请大家帮助(本来是300,结果选错了变100,问题解决另开帖加200) (100分)

  • 主题发起人 主题发起人 IamWLJ888
  • 开始时间 开始时间
I

IamWLJ888

Unregistered / Unconfirmed
GUEST, unregistred user!
代码:
寻求解决如下一个问题的方法:
怎么将DBGrid表格,如:
|时间|地点|人物|
1 XXXX XXXX XXXX 这是另一个表
2 XXXX XXXX XXXX |
3 XXXX XXXX XXXX |
4 XXXX XXXX XXXX V
用以下表格显示,如:--------------------
|时间|地点|人物| |时间|地点|人物|
1 XXXX XXXX XXXX 3 XXXX XXXX XXXX
2 XXXX XXXX XXXX 4 XXXX XXXX XXXX
要求要并排,表2的第一行内容是表1最后一行下一记录的内容。当表1或表2行选择变动时,另一
表也相应变动。
由于字段不太多,但屏幕的高度有限,我是想将一个表分两列显示,第二列是接第一个列的
内容。
我想用DBGrid解决,不用其他表格解决。
 
用dbgrid不能實現,你還是想別的辦法吧。
 
用DBCtrlGrid吧,基本可以满足要求
在Data Controls页面
 
数据不多,就用 TStringGrid

要不用两个DbGrid
 
当表1或表2行选择变动时,另一表也相应变动。
意思不明确
 
TO tomol:怎么用呢?
TO jsxjd:两个DBGrid怎什做呢,我也想过用两个的,但试过多次,做不了关联。
TO seaerwang:其实也就是把表1的后面未显示出的内容显示在表2中,当表1行向下移动时
表2的内容相应于表1的行而变动。表1显示的最后一行内容的下一记录显示在表2的第一行中。
同样移动表2时,表2第一行的内容上一记录显示在表1的最后一行。
 
to IamWLJ888
表1,表2是不是一张表,如果是就用DBCtrlGrid.
设置ColCount=2就行了.
 
你的問題是典型的尋求靈活顯示之問題,已有之DataControl元件是為特定環境而開發的,方便
但不夠靈活,應改用standard或aditional頁之元件如TStringGrid,其關鍵在於你應在程序中
實現數據關聯和數據取出的代碼,再display出來,又或你定制組件,才是正確的解決問題的思路!
但願以上對你有幫助。
 
to coldew: ~具体怎么用呢?
To wudoo:您说得对,关键在于数据的关联,如不是这样,我可以用STRINGGRID来实现的,
我曾试过用2个TABLE,2个DATASOURCE,2个DBGRIDEH来做,但DBGIRDEH内的数据总
不能按要求同步。
非常感谢各位,不过问题还是没有解决。

希望大家继续帮忙。
 
coldew的方法应该是最简单的了。
 
dbgrid似乎不行,用STRINGGRID吧
 
两个表:
用一个变量,来记录 第一个表最后一个数据的位置不就行了?

当然有添加,删除,插入那就麻烦了。
只有在事件中进行判断了。
 
如果是两个表,就用两个query吧!一个做主表q1,一个做从表q2,可以用关联字段的方法把它们
联接起来。然后在q1的记录滚动事件里
q2.sql.add('select * from q2 inner join q1 on q1.id = q2.id');
当q1的记录有改变时,q2的记录也会随之自动改变。
你看行不行?
 
额外多建两个表,结构一样。窗体上放三个Table,两个DbGrid,两个DataSource,
在FormCreate里把Table1(有记录的)的前一半记录赋值给Table2,后一半给Table3。
然后在Table2的BeforeScroll事件里写如下代码:
if Table2.Eof then
begin
Table2.DisableControls;
Table3.DisableControls;
Table2.AppendRecord([oo and xx]);
Table3.First;
Table3.Delete;
Table3.Post;
Table2.Post;
Table2.EnableControls;
Table3.EnableControls;
end;
Table3类似,你试试看。
 
我也在关注此问题。最难解决的就是StringGrid和DataSource的关联,
或者自己写数据改动的事件但是不知效率如何,恳请各位高人指点。
 
不就是要解决查询时候用吗。
生成临时表不就解决了吗。
临时表的字段多一倍而已。
数据重新组织不就搞定了。
 
没什么意义,如果屏幕的显示分辩率改变,可能还显示不下。
实现其实也不难,用移动就可以了。例如可以显示10记录,
两个TABLE,打开同一表, table2的首行移到第11条记录,
当TABLE1的记录移动时,在EVENT事件中写代码,移动TABLE2的记录。
 
自己数据重绘时间啊
 
TO ldaan3、ego、Dragon_Sky、wmsoft:关键还是表1、表2显示不能同步。
TO liuxiaouo、zblue:能否具体一点呢,最好写出例子,好吗?

我想解决这个问题,对于显示字段不多并且要求多显示一些记录的人应是很有益的。

另外我想延伸一下这个问题:
光标显示超过表1最后一行时,焦点自动跳转到表2,同样光标显示小于表2的第一行时,焦点
自动跳转到表1。这个我有一个方法如下:

GChangeYN: Boolean;
G1Row, G2Row: Integer;
DataG1, DataG2: TDbGridEH;
LData1, LData2: TDataSet;

procedure TForm1.LData1BeforeScroll(DataSet: TDataSet);
begin
if GChangeYN=False then
begin
G1Row := DataG1.Row + 1;
if G1Row>DataG1.RowCount - 1 then
begin
DataG2.SetFocus;
GChangeYN := True;
LData1.RecNo := LData1.RecNo - 1;
end;
end else GChangeYN := False;
end;

procedure TForm1.LData2BeforeScroll(DataSet: TDataSet);
begin
if GChangeYN=False then
begin
G2Row := DataG2.Row - 1;
if G2Row<1 then
begin
DataG1.SetFocus;
GChangeYN := True;
LData2.RecNo := LData2.RecNo + 1;
end;
end else GChangeYN := False;
end;

但有一个问题,当按着鼠标的左键拖动时,不能凑效,怎么办呢。

我做了一个关联移动的尝试如下:
procedure TForm1.LData1BeforeScroll(DataSet: TDataSet);
begin
LData2.RecNo := LData1.RecNo + DataG1.RowCount - DataG1.Row;
if DataG1.Row=DataG1.RowCount - 1 then LData2.RecNo := LData2.RecNo + 1;
if (DataG1.Row=1) and (LData1.RecNo<>1) then LData2.RecNo := LData2.RecNo - 1;
end;

向下移动正常,但如果是表1的最后一行向上移动时,会产生表2第一条不同步,随后又正常了。
鼠标按住拖动一样无法凑效。

上面两部分结合在一起无法使用。

其实我需要的是可以分列显示并可关联数据的Grid。

请大家继续帮忙啊,最好能给出具体实现的代码。

其实分数不是主要的,我还可多加一些。
 
用dbctrlgrid多好,样式灵活、控制简单。

就算你添加了很多控制代码实现了此功能又能怎么样呢?也就是
做到和dbctrlgrid差不太~~多而已。
何必做那些无用功呢?
 

Similar threads

回复
0
查看
848
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部