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,这样可以在控件最左边的指示列上显示序号。
----------------------------------------------------------------------------
预先在 DBGrid 加一dao列,Title为 “duID”。然后:zhi在事件中添加dao“DBGridDisplayDrawColumnCell”参考我的内容自回己改吧!我也是答看别人的,实现了!
图
procedaore TForm1.DBGridDisplayDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if (DataSource.DataSet.RecNo <> 0) then
if ( UpperCase(Column.Title.Caption) = 'ID' ) then
DBGridDisplay.Canvas.TextOut(Rect.Left + 4, Rect.Top + 2, IntToStr(DataSource.DataSet.RecNo));
end;