delphi中, TstringGrid中,单击单元格之后, 将会出现光标(如果里面有数据的话,数据将全选),然后可以填入数据,想问的是,如果不出现光标(里面有数据的话,不被选中), 直接写数据?
另外,我在 tstringgrid中加入了下拉框,有没有办法,只能从下拉框中读数据,而不能直接更改单元格的数据

解决方案 »

  1.   

    把该CELL改为只读,在你点击后,出现一个对话框,在对话框中写入,然后再写入CELL中.呵呵,跟你的下接框方式差不多,
      

  2.   

    这样不直观,因为不只一个下拉框,是继承了TStringGrid来实现的,就是不知道双击两下出现编辑状态(带光标的那种)是触发了什么事件。想直接把那事件去掉
      

  3.   

    单击两下,会出现光标(如果里面有数据的话,数据将全选,并重新设值(还是原来的值),能不能不让其重新设值,因为我用的是TNT控件,重新设值又变成了乱码
      

  4.   

    我在 tstringgrid中加入了下拉框,有没有办法,只能从下拉框中读数据,而不能直接更改单元格的数据 
    =============================================
    这个是可以做到的吧。
    你在combobox的onChange事件写代码不是可以吗?stringGrid.cell[stringGrid.col,stringGrid.row] := combobox.text;
      

  5.   


    你该问这个的.直接把该事件去掉?
    呵呵,我说的只读就是这意思.把这个事件去掉(点击不进入编辑状态).
    void __fastcall Tfm_ly_bill::sgSelectCell(TObject *Sender, int ACol,int ARow, bool &CanSelect)
    {
     if(sg->RowCount==ARow+1) {   CanSelect=false;  return;  } //最后一行不整行显示
     if((Tag==0||Tag==1)&&(ACol==5||ACol==8)) sg->Options=sg->Options<<goEditing<<goAlwaysShowEditor<<goTabs;
      else sg->Options=sg->Options>>goAlwaysShowEditor>>goEditing>>goTabs;
     sg->Refresh();
     //===========================
     TRect irect;
     for(int i=1;i<sg->ColCount;i++)
     {
       irect=sg->CellRect(i,ARow);
       if((Tag==0||Tag==1)&&(i==5||i==8)) sg->Canvas->Brush->Color=0x0012266B;
         else     sg->Canvas->Brush->Color=0x00C56A31;  // 0x00804000
       sg->Canvas->FillRect(irect);
       sg->Canvas->Font->Color=clWhite;
       sg->Canvas->TextRect(irect,irect.Left+1,irect.Top+1,sg->Cells[i][ARow]);
     }  //end for 
    }
      

  6.   

    汗...我转DELPHI噢.关键其实是
    sgSelectCell //假设STRINGGRID改名为sg ,那么就在该事件中
    ============
    begin  if (ACol=5) or (ACol=8) then          //假设你要把双击这个去掉,为5和8列,噢是每一行的五和八列,如果第一列去掉,要加一句话.
          sg.Options:=sg.Options < <goEditing < <goAlwaysShowEditor < <goTabs;   //就是去掉的.
      else 
          sg.Options:=sg.Options>>goAlwaysShowEditor>>goEditing>>goTabs;         //那么其他的列就是可以编辑的,除了5和8
     sg.Refresh; 
    end;
      

  7.   

    sg.Options < <goEditing < <goAlwaysShowEditor < <goTabs
    =======================================================
    这个在DELPHI中好像不是这么表示的,应该是包含[contain]吧....
    噢,要假设STRINGGRID定义为第一列为不可编辑列.
    不然要加上这句
    if sg.RowCount=0 then   //第一行显示,不能选择.
    begin
      CanSelect:=false;  
      return; 
    end;
      

  8.   

    谢谢你的回复,其实 canSelect 或者 goEditing, 都没什么,我想要的是这行只能选择,而不可以通过键盘输入,刚刚想到个办法,如果触发 keyPree 事件,把他给挡回去,不过 cell的数据不知道怎么变化,因为我用的是 Tnt控件,来解决 unicode问题,但是进入编辑状态时,就成了乱码。所以想只让他选择,而不可以输入,
      

  9.   

    加了 下拉框,仅仅是指加了一种形式, 并不是直接把 comboBox放到 grid中(即没有 comboBox).
    另外,你有办法放进去吗,每个单元格都要有的那种?我只是继承了 TStringGrid, 并把 EditStyle改了下,具体代码如下,网上的例子
    http://download.csdn.net/source/797966
      

  10.   

    我用的是 tnt控件, 一进入编辑状态, cel 的内容就重新刷了一次,同时上面的字符串(中文)就变成了乱码,
    我用的是 Delphi7, 英文环境