如何把一个表的其中一列作为数据集的表头(50分)

  • 主题发起人 主题发起人 ylyxx
  • 开始时间 开始时间
Y

ylyxx

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手,如何把一个表的其中一列作为数据集的表头?我用的是ADO控件,表内容如下:<br>FLXH   FLMC<br>0 合计<br>1 床位费<br>2 西药费<br>3 中成药费<br>4 中草药费<br>5 手术费<br>6 化验费<br>7 一般检查费<br>8 超声波费<br>9 其它内镜费<br>10 照片透视费<br>11 CT检查费<br>12 病理费<br>13 材料费<br>14 一般处置费<br>15 注射费<br>16 护理费<br>17 监护费<br>18 输氧费<br>19 输血费<br>21 临床检验费<br>22 接生费<br>23 治疗费<br>24 诊察费<br>25 心电图费<br>26 彩色B超费<br>27 电子胃镜费<br>28 腹腔镜手术费<br>29 理疗费<br>30 脑电图<br>31 其它费<br>32 空调费<br>33 高压氧舱<br>34 麻醉费<br>如何把这个FLMC作为一个数据集的表头?同时这个表以后增加内容,所以不能把表头写死,这代码如何写?请指点一下,最好能举例说明,谢谢
 
用一个表存储表格字段的名称(就是你说的:合计,床位号...),使用的时候用一个ADOQuery查出该表的字段个数然后动态赋值给DBGrid就可以了,方法如下:<br>dbGrid.Columns.Title.Caption := 字段值;
 
var<br> &nbsp;I: Integer;<br>begin<br> &nbsp;for I := 0 to 34 do //I是FLXH的值<br> &nbsp;DBGrid.Columns.Title.Caption := strX; //strX是FLMC的值<br>end;
 
只能使用临时表,然后用ADO控件查询出来
 
根据 FLMC 字段动态创建一个数据库临时表<br>TabNameList:= TStringList.Create;<br>GetTableNames(TabNameList); <br> <br>if TabNameList.IndexOf('TempTab') &lt; 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;//创建临时表<br> &nbsp;end<br>else<br> &nbsp;begin<br> &nbsp; &nbsp;//增加 FLMC 变动的记录来增加字段<br> &nbsp;end;<br><br>再通过ADO控件得到动态的表头。。
 
var<br> &nbsp;i: Integer;<br> &nbsp;ADOQuery1:TADOQuery;<br>begin<br> &nbsp;ADOQuery1:=TADOQuery.create(nil);<br> &nbsp;ADOQuery1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/aSECsmall/aModule.mdb;Persist Security Info=False';//aModule.mdb你的数据库<br> &nbsp;ADOQuery1.Close;<br> &nbsp;ADOQuery1.SQL.Clear;<br> &nbsp;ADOQuery1.SQL.Add('select * from YourTable');// YourTable你的数据表<br> &nbsp;for i := 0 to ADOQuery1.Recordcount-1 do <br> &nbsp;begin<br> &nbsp; &nbsp;DBGrid.Columns.Title.Caption :=ADOQuery1.Fields[1].asString;<br> &nbsp; &nbsp;//Fields[1].保证是你的数据表中的FLMC或者用ADOQuery1.FieldByName('FLMC').asString<br> &nbsp; &nbsp;ADOQuery1.next;<br> &nbsp;end;<br>end;
 
Johnny_du能说得详细一些吗?
 
可以。我的意思就是说:<br>1、你首先创建一个包含两个字段的表(字段为:FLXH和FLMC);<br>2、每次程序运行时动态设置DBGird的列的Visible属性,设置依据为第一步创建的表的行数(比如DBGrid所连接的表总共有100个字段,那么相应底层的数据表也会有100个或更多字段,第一步创建的表加入目前包含35个行(也就是你的例子里面的行数));<br>3、用一个ADO来取第一步创建的表的各行,然后用dbGrid.Columns.Title.Caption := ‘字段值’方法来设置DBGrid的各个列的表头就可以了(当然,其中要一个循环,就是我第二次发言写出的方案)。
 
Johnny_du我正在试,另外,有网友提出让我用DBGrid动态创建Column,你有这方面的例子吗?
 
我开始也写了建议你动态创建Column的建议,但是后来想想不妥,其原因有二:<br>1、动态创建Column的话你底层数据库表也要动态来配合创建字段(如:原来是35列,以后如需要增加到50列则底层数据表也要相应扩容)。这个实现起来麻烦,还需要用户自定义数据类型以及其它约束(如:是否允许为空,是否关键字,字段长度以及小数位数等(若是Number类字段));<br>2、动态创建DBGrid的Column代码也较繁琐,不如用静态创建好Column然后动态设置其Visible属性来得简单。<br>所以综上所述,我还是最后把动态创建Column的建议删除了,建议你用动态设置Visible属性来解决你的问题。<br>当然,动态创建Column以及底层数据库表字段的方法从理论上讲是完全可行的,但是这个方案对编程人员以及用户的要求都较高,所以在简单方法可以满足需求的情况下,我还是建议你用简单的方法,毕竟越简单的方法越不容易出错的。:)呵呵
 
以下是一个动态为DBGrid(dbgrd1)创建3个列,并且为各列命名为0、1、2的示例代码,也就是你要的动态创建DBGrid的Column的例子。<br>procedure TfmInputJHMB.btn1Click(Sender: TObject);<br>var<br> &nbsp;I: Integer;<br>begin<br> &nbsp;inherited;<br> &nbsp;for I := 0 to 2 do<br> &nbsp;begin<br> &nbsp; &nbsp;dbgrd1.Columns.Add;<br> &nbsp; &nbsp;dbgrd1.Columns.Title.Caption := IntToStr(I);<br> &nbsp;end;<br>end;
 
同意七度时空
 
接受Johnny_du的答案
 
既然这样请把分加给我好吗?:)呵呵
 
多人接受答案了。
 
后退
顶部