你所需要的是打开DBGrid.Options中的dgMultiSelect 选项...

解决方案 »

  1.   


    对!在加点好玩的:添加DBGrid的DrawDataCell事件,procedure TForm1.DBGrid1DrawDataCell(Sender: TObject;
      const Rect: TRect; Field: TField; State: TGridDrawState);
    begin
      with TDBGrid(Sender) do begin
        if SelectedRows.IndexOf(DataSource.Dataset.Book) >= 0 then
          Canvas.Brush.Color := clPurple
        else if gdSelected in State then
          Canvas.Brush.Color := clHighlight
        else if (DataSource.Dataset.RecNo and 1) <> 0 then
          Canvas.Brush.Color := $00DDEEFF
        else
          Canvas.Brush.Color := $00DDFFFF;
        DefaultDrawDataCell(Rect, Field, State);
      end;
    end;
      

  2.   

    同意第一位,对dbgrid作了控制以后,便可以通过程序代码实现你所要的功能。
    例如:
    for i := 0 to table1.recordcount - 1 do
    begin
      if dbgrid1.currentrows.selected then
      begin
        ...
      end;
      next;
    end;
      

  3.   

    谢谢各位指点,我看了TDataSet和TDBGrid的帮助文档后明白了。给分。不过还有问题,似乎不能像在资源管理器中通过按住Shift点开头和结尾的记录来大面积选择呀,只能按住Ctrl一个一个敲。
    还有,选好了以后不小心一动鼠标以前选的就都没了,确实和在资源管理器中一样。不过我不想这样。这应该是DBGrid控件的特性。我想的是:用户点一下记录就选上了,再点一下取消选择。点别的记录不影响以前的选择。有什么办法呀?是不是要自己响应OnClick,太麻烦了……to: cobi(小新国际)
    您的代码似乎有点问题,TDBGrid是没有CurrentRows这么个属性的。应该改成:
    (我用ADO)
    for i := 1 to ADODataSet.RecordCount do
    begin
      ADODataSet.RecNo:=i;
      if DBGrid1.SelectedRows.CurrentRowSelected then
      begin
        ...
      end;
      next;
    end; 或是用Inprise提供的方法:procedure TForm1.Button1Click(Sender: TObject);
    var
      i, j: Integer;
      s: string;
    begin
      if DBGrid1.SelectedRows.Count>0 then
        with DBGrid1.DataSource.DataSet do
          for i:=0 to DBGrid1.SelectedRows.Count-1 do
          begin
            GotoBook(pointer(DBGrid1.SelectedRows.Items[i])); ...      end;
    end;