我想把数据库表中[表结构是:id(int),name(char)两个字段]的name字段的所有内容,动态用checkbox显示在窗体上。同时每个checkbox前加一个combobox用来选择数量。
我要求,点一个按钮,就能把checkbox打钩了的项的名称及对应的数量能写到数据库的一张表中保存!比如:足球 3个,篮球 4个,羽毛球:8个.....请问这个功能可否实现?怎么实现?

解决方案 »

  1.   

    你的表中的记录数是不一定的,必须根据表格中记录的个数,动态的创建checkbox及与之对应的combobox.
      

  2.   

    var
      vCheckBox:TCheckBox;
      vComboBox:TComboBox;
      I,J:Integer;
    begin
      with ADOQuery1 do 
      begin
        //打开表,取全部内容
        for I:=0 to RecordCount-1 do 
        begin
          vCheckBox:=TCheckBox.Create(Self);
          with vCheckBox do 
          begin
            Name:=IntToStr(I);
            Caption:=FieldValues['Name'];
            Left:=20;
            Top:=(I+1)*32;
            Checked:=False;
          end;
          vComboBox:=TComboBox.Create(Self);
          with vComboBox do 
          begin
            vComboBox.Hint:=vCheckBox.Name;
            for J:=1 to FieldValues['ID'] do 
              Items.Add(IntToStr(J));
            ItemIndex:=0;
            Left:=50;
            Top:=(I+1)*32;
            OnClick:=SDOnClick;
          end;
        end;  
      end;
    end;程序启动时候调用上面代码
    然后按钮代码如下:
    var
      I:Integer;
    begin
      for I:=0 to Self.ControlCount-1 do 
        if Self.Controls[I] is TCheckBox then
          if (Self.Controls[I] as TCheckBox).Checked then
            with ADOQuery1 do 
            begin
              Close;
              Edit;
              FieldValues['ID']:=(Self.Controls[I] as TCheckBox).Tag;
              FieldValues['Name']:=(Self.Controls[I] as TCheckBox).Caption;
              Post;        
            end;
    end;
    这里当选择了vComboBox的内容后,自动把对应vCheckBox.Tag设置成此值内容。为了在对某一个vComboBox进行操作后能找到相对应的vCheckBox,可以使用如下方法:
    预先定义一个SDOnClick,类型和TComboBox的OnClick一致,内容为
    var
      I:Integer;
    begin
      for I:=0 to Self.ControlCount-1 do 
        if Self.Controls[I] is TCheckBox then
         if CompareStr((Self.Controls[I] as TCheckBox).Name,(Sender as TComboBox).Hint)=0 then
           (Self.Controls[I] as TCheckBox).Tag:=(Sender as TComboBox).ItemIndex+1;
    end;这样,上面建立vComboBox的时候指定的OnClick才会生效!
      

  3.   

    TO: §绕瀑游龙§ 
    var
      I:Integer;
    begin
      for I:=0 to Self.ControlCount-1 do 
        if Self.Controls[I] is TCheckBox then
          if (Self.Controls[I] as TCheckBox).Checked then
            with ADOQuery1 do 
            begin
              Close;
              Edit;
              FieldValues['ID']:=(Self.Controls[I] as TCheckBox).Tag;
              FieldValues['Name']:=(Self.Controls[I] as TCheckBox).Caption;
              Post;        
            end;
    end;
    这里有问题,应该是在点击CHECKBOX时候是QUERY定位到这条记录上来。
    只是EDIT;在选择combobox时候在写入数据并且提交
      

  4.   

    不过可以使用ListView或者checklist,动态创建控件,对资源要求可能高一些,你试试其他方式
      

  5.   

    谢谢大家!如果我不要求动态创建空件。只要求手动添加combobox.items的值(如:1,2,3,4...);手动填写checkbox的caption属性。只求大家告诉我如何能把checkbox.text的值和其对应的combobox随选择的数字的值能对应起来,成一条记录插到表中即可!(表结构:name,count)
    比如:在足球的checkbox打钩,点选combobox选择数量(比如选5),点按钮提交!足球作为name,5作为count,添加到数据库!
      

  6.   

    直接是用SQL不就可以了吗
    var
      a: string;
      b: string;
    begin
    if checkbox.value then 
      a := checkbox.text;
      b := combox.text;
    else 
    if checkbox1.value then 
       ...自己写ado.commandtext := "insert ...自己写
      

  7.   

    我界面上如果有50个combobox和checkbox,我要写50个判断?
    请问有没有更好的办法?
      

  8.   

    FrameSniper(§绕瀑游龙§) :在动态创建控件时,Name:=IntToStr(I);这句有问题,总包错:“0”不能作为控件名称!
      

  9.   

    而且:for I:=0 to RecordCount-1 do 
        begin
          vCheckBox:=TCheckBox.Create(Self);
          with vCheckBox do 
          begin
            Name:=IntToStr(I);
            Caption:=FieldValues['Name'];
            Left:=20;
            Top:=(I+1)*32;
            Checked:=False;
          end;
    也创建不了checkbox控件!这是为什么呀???????
      

  10.   

    你怎么不用tDBCtrlGrid控件呢,不用动态创建
      

  11.   

    怎么不用TDBCtrlGrid控件呢,不用动态创建CHECKBOX了,加一个DBcheckbox与字段相关联就行了
      

  12.   

    那个控件在data controls页里
      

  13.   

    for i:=0 to 5 do
      begin
        Check:=TCheckbox.Create(panel1);
        Check.Parent:=panel1;
        Check.Name:='C'+inttostr(i);
        Check.Top:=(I+1)*32;
        Check.Left:=10;
        Check.Visible:=true;
      end;