DBGrid显示行号的几种方法

一、在structure视图中,把DataSet控件的加号点开,在里面的fields点右键add all fields,然后再右键new fields,这里添加一个数据表里没有的字段比如NO,这个NO字段设置为Integer,下面设置为calculated,确定,然后在这个NO字段的事件OnGetText里面添加这个代码:    
     int r=Sender->DataSet->RecNo;
     Text=(r==-1)?String(""):String(r);

若使用的是动态连接,就先设置为静态连接,然后add all fields,不然会出现“无效的授权说明”,添加好所有字段后再去掉连接字串,恢复动态连接就行了。另外在程序中别忘了调用CreateDataSet();否则程序运行中,操作DataSet的时候会报异常:Cannot perform this operation on a closed dataset。

二、在DBGrid的OnDrawColumnCell事件中绘制编号,现在DBGrid控件中创建表头为“序号”或者“NO”的列,然后绘制此列的值,以TDBGridEh控件为例:

void __fastcall TMainForm::DBGrid1DrawColumnCell(TObject* Sender,
    const TRect& Rect, int DataCol, TColumnEh* Column,
    Gridseh::TGridDrawState State)
{
    DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);

    // 遮挡第一列中的记录0,用真实的序号填充第一列
    int nIndex;

    if (Column->Index == 0) // 如果是第一列
    {
        TDBGridEh* dbgrd = (TDBGridEh*)Sender;
        if (State.Contains(Gridseh::gdFocused)) // 如果此行选中
        {
            // dbgrd->Canvas->Brush->Color = clBlue;
            // 使用Brush画刷的颜色掩盖该方格对应的矩形区域
            dbgrd->Canvas->FillRect(Rect);
            // 3D效果
            // TRect rct(Rect);
            // Frame3D(dbgrd->Canvas, rct, clWhite, (TColor)RGB(0x80, 0x80, 0x80),
            // 1);
            dbgrd->Canvas->Font->Color = clWhite;
        }
        else
        {
            dbgrd->Canvas->Brush->Color = clWhite;
            dbgrd->Canvas->FillRect(Rect);
            dbgrd->Canvas->Font->Color = clBlack;
        }
        nIndex = dbgrd->DataSource->DataSet->RecNo;
        String strIndex = IntToStr(nIndex);
        int txtWid = dbgrd->Canvas->TextWidth(strIndex);
        int left = RoundTo((Rect.Width() - txtWid) / 2.0, 0);
        left += Rect.left;
        if (-1 != nIndex) // 如果有记录
        {
            dbgrd->Canvas->TextOut(left, Rect.Top + 2, strIndex);
        }
    }

}


三、如果是TDBGridEh控件,则在对应的OptionsEh属性域中设置dghShowRecNo,这样可以在控件最左边的指示列上显示序号。

你可能感兴趣的:(c++,builder)