描述:通过DBgrid ->datasource,ADOQuery->数据库 
需求:通过DBgrid可以任意的添加字段到数据库中(添加是可以了,而且可以成功地显示在Dbgrid中,问题是:当关掉程序再次运行的时候DBgrid显示的是静态绑定的字段,而我动态创建的字段和动态加在DBgrid中的title则没有显示出来(当然我没有从数据库取出字段和保存之前的title,后来尝试去做了碰到了难点,特来讨教:如何取出数据库中动态创建的字段【好像不能根据位置来取,如果是这样的话删掉一个其中就会乱了】)),同时也可以通过Dbgrid删除数据库中的字段(除了主键),目前还是添加字段功能无解,各路大神,显显灵,膜拜了
code:
通过小窗体动态添加:
procedure TFrmADField.Button1Click(Sender: TObject);
var
  i,k:integer;
  vcol:TColumn;
  sys:Tinifile;
  MyField:string;
  MyCaption:string;
  lstr:Tstrings;
  Const
    str='Alter Table T_Total Add %s char(30)';
begin
 k:=0;
  With FrmMain.ADOwait do
   begin
     Close;
     SQL.Add(Format(str,[Edit2.text])); 
     ExecSQL;
     Close;
     SQL.Clear;
     SQL.Add('select * From T_ToTal where tag=''w''');
     Open;
   end;   vcol:=FrmMain.DBgrdWait.Columns.add;
   for i:=0 to FrmMain.DBgrdWait.Columns.count-1 do
   begin
   if FrmMain.DBgrdWait.Columns[i].FieldName='' then
     FrmMain.DBgrdWait.Columns[i].FieldName:=Trim(Edit2.text);
     MyField:=Trim(Edit2.text);
   if Vcol.Title.Caption= '' then
     begin
       Vcol.Title.Caption:=Trim(Edit1.text);
       vcol.Width:=130;
       MyCaption:=Trim(Edit1.text);
     end;
     end;
     try
       lstr:=TStringlist.create;
       lstr.Add(MyCaption);
       lstr.SaveToFile(extractfilepath(paramstr(0))+'sys\my.txt');主窗体oncreate:
读取并添加到DBgrid:
procedure TFrmMain.FormCreate(Sender: TObject);
var
  i,j:integer;
  vcol:Tcolumn;
  MyField:string;
  MyCaption:string; 
  str:Tstrings;
  mStream:Tmemorystream; 
begin
  mStream:=TMemorystream.create;
  mStream.loadfromfile(extractfilepath(paramstr(0))+'sys\my.txt');//取之前创建的DBgrid title
   vcol:=DBgrdWait.Columns.add;
   for i:=0 to DBgrdWait.Columns.count-1 do  
  begin
    for j:=0 to adowait.Fieldcount-1 do
    begin 
      if DBgrdWait.Columns[i].Title.Caption='' then//这个条件的想法是DBgrid title动态创建字段的排在静态已经绑定字段的后面
        begin
         DBgrdWait.Columns[i].FieldName:=adowait.Fields[j].FieldName; //现在难点是如何取出这些字段,按位置取好像不对,如果我删掉一个字段的话位置不是全乱了?
         vcol.Title.Caption:=MyCaption; //这个取DBgrid title先不管
         vcol.Width:=130;
        end;
    end;  end;
麻烦帮看看 

解决方案 »

  1.   

    你这个问题根本就不是问题,创建字段之后,需要刷新数据源,也就是需要重新OPEN一下,
    DBGrid的字段建议不要静态绑定,不需要显示的列用visible来控制比较好。
    取字段,最好根据字段名来取,而不是根据排列序号。
    遍历DBGrid的列名和数据源的列名,那是嵌套循环。
      

  2.   

    通用的数据窗口?title之类的信息保存在ini
      

  3.   

    请问 怎么取字段? 字段是客户在edit中输入进去的,是个变量,在数据库中怎么读取这个字段变量呢? 教教
      

  4.   

    >>在数据库中怎么读取这个字段变量呢?你在数据库中怎么保存这个字段变量呢?建个表保存用户创建的字段不就行了?
      

  5.   

    大侠 创建临时表 如何创建,如何读取?不用ADO控件什么的能读取出来吗?
      

  6.   

    谢谢thx1180(唐伯虎)提醒 你不说我还真想不到 同时谢谢grjs2004(钓鱼不大,下水捞虾)的建议,还有sz-haitao的热心帮助 谢谢