1、设置DBGrid的Options的dgRowSelect和dgMultiSelect为True,在最左列点鼠标就可以选择多列。
2、Hook DBGrid的OnMouseMove和OnMouseDown事件,自己编写一定的代码。

解决方案 »

  1.   

    Lin大侠:可看好了,看仔细了,通过设置DBGrid的dgMultiSelect为true,我早在
    贴中讲过,但这种多选只能用按住Ctrl后一次次进行多选.而我的问题是
    我虽比较菜,也不至于连常识都不懂!
    在一时也很难找到现成控件情况下,我准备修改源码
    刚刚把c:\Program files\Borland\CBuilder\Source\Vcl\dbcgrids.pas打出-----
    19页A4纸,共1180行-------头疼欲裂------
    那位大侠能在从何入手,在何方位努力,应雕琢那段指点一二-------
    本菜鸟将感恩不尽!!!
      

  2.   

    还要多谢Lin大侠!!!
    不过通过钩子来做是否可行?请给出示例!!!
      

  3.   

    得分心切,没看仔细。我觉得比较难。:=(
    不过你可以试试在DBGrid得OnMouseMove事件中加入(DBGrid1 as TCustomGrid).MouseCoord(X,Y),其返回的MouseCoord.Y值表示鼠标所在的行,不只有没有用?
      

  4.   

    对不起,Lin大侠,刚才离线一段时间:我的妹儿:  [email protected]  或   [email protected]可能我还真必须不得不头疼地去修改DBGrid的源码!!!因为还是有其他目标要实现——主要是——要对表示Lookup查找型字段的DBGrid的Cell单元格能够直接修改
    有些我在贴中说明过的情况就不再在此重复了
    大家知道,将Lookup字段的ButtonStyle属性设为cbsAuto,就可以在单元格上
    出现一个下拉按钮,可以拉出供选取的字段值(如果不是Lookup字段,还可在
    Picklist中设置一些供下拉的选值,并且ButtonStyle若为cbsEllipsis将以省略
    号按钮代替下拉按钮)。
    但是查找字段的Cell是绝对修改不了的,只能通过下拉列表选上去!
    可是我们经理下死令了——必须能够键入值,并达到如下的效果:
    其实是Access中的效果——
    下拉按钮的效用当然要保留,另外还必须能键入字串,
    并响应出FindNearest式的查找效果——
    具体举例:假如此Lookup字段名为Name,其值来源于另一个表,
    首先要能键入值,比如我只键入了try三个字母,会自动从查找的源表找出
    相近的值显示在单元格上:trybird,其中bird被抹黑选中,当我接着键入
    w字后,又会找出相近的值:tryworm,其orm中被抹黑选中,依此类推,就这样……唉,菜鸟到死思方尽,虫子成堆累不甘!另外,要提醒各位大侠的是此贴并非50分,而是双50——100分
    因为我在C++ Builder中也挂了一模一样的一贴,
    愿象lin一样的热心大侠,一式两份地来响应
    只要热心相帮并对俺解决问题有助的大侠,菜鸟都会铭记和感谢的!
    得分到是次要,此问题来自实际需求,解决了相信对大家都有会有所助益!
    不论什么情况,菜鸟在此都愿将最终的结果无保留地与大家共析!!!
    问题尚未解决,同志仍须努力!
      

  5.   

    trybird:
       问题解决之后,把方案放出来大家共享一下如何,我是不是有点自私呀。哈哈
      

  6.   

    参见例子:

     private
       Sel : Boolean ;//判断是否处于选择状态
       BookMark : TBookMark ;//记录先前的位置

    procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var SelNo:integer ;//记录当前位置
    begin
     if ( Button = mbLeft ) then
      if sel = false then//非选择状态,记录当前位置
       begin
        BookMark := Table1.GetBook ;
        Sel := true ;
        exit ;
       end
     else //选择状态
      if Shift = [ssShift] then
      begin
    //遍历所有从先前位置开始到当前位置之间的记录并标记
       SelNo := DBGrid1.DataSource.DataSet.RecNo ;
       DBGrid1.DataSource.DataSet.DisableControls ;
       DBGrid1.DataSource.DataSet.GotoBook(BookMark);
       DBGrid1.SelectedRows.CurrentRowSelected := true ;   if SelNo<DBGrid1.DataSource.DataSet.RecNo then
         while SelNo<DBGrid1.DataSource.DataSet.RecNo do
          begin
           DBGrid1.SelectedRows.CurrentRowSelected := true ;
           DBGrid1.DataSource.DataSet.Prior ;
          end
        else
         while SelNo > DBGrid1.DataSource.DataSet.RecNo do
          begin
           DBGrid1.SelectedRows.CurrentRowSelected := true ;
           DBGrid1.DataSource.DataSet.Next ;
          end;
        DBGrid1.DataSource.DataSet.EnableControls ;
        Sel := false ;
      end ;
    end;
    虽然效果不十分理想,但足以完成要求。