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,这样可以在控件最左边的指示列上显示序号。