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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DBGrid 是 Delphi 中常用的数据显示控件,如果需要将 DBGrid 中的数据导出到 Excel 文件中,也可以使用 OLE 技术来实现。下面是一个简单的示例代码: ```delphi var ExcelApp: Variant; // 声明 Excel 应用程序对象 Sheet: Variant; // 声明工作表对象 i, j: Integer; begin ExcelApp := CreateOleObject('Excel.Application'); // 创建 Excel 应用程序对象 ExcelApp.Workbooks.Add(1); // 添加一个工作簿 Sheet := ExcelApp.Workbooks[1].Worksheets[1]; // 获取第一个工作表 // 写入表头 for j := 0 to DBGrid1.Columns.Count - 1 do begin Sheet.Cells[1, j + 1].Value := DBGrid1.Columns[j].Title.Caption; end; // 写入数据 for i := 0 to DBGrid1.DataSource.DataSet.RecordCount - 1 do begin DBGrid1.DataSource.DataSet.RecNo := i + 1; for j := 0 to DBGrid1.Columns.Count - 1 do begin Sheet.Cells[i + 2, j + 1].Value := DBGrid1.Fields[j].AsString; end; end; ExcelApp.Workbooks[1].SaveAs('C:\Test.xlsx'); // 将工作簿另存为 Test.xlsx 文件 ExcelApp.Quit; // 关闭 Excel 应用程序 end; ``` 在这个示例中,我们首先通过 `CreateOleObject` 函数创建了一个 Excel 应用程序对象,并通过 `Add` 方法添加了一个工作簿。然后,我们通过 `Worksheets` 属性获取第一个工作表,并将 DBGrid 中的表头和数据写入 Excel 文件中。最后,我们通过 `SaveAs` 方法将工作簿另存为指定的文件,并通过 `Quit` 方法关闭 Excel 应用程序。 需要注意的是,在使用 DBGrid 导出数据时,我们需要先将当前记录移到第一条记录(`DBGrid1.DataSource.DataSet.RecNo := 1;`),然后再逐条读取数据写入 Excel 文件。此外,如果 DBGrid 显示的是一个 SQL 查询的结果集,需要先将该结果集转换为一个独立的数据集,否则可能会出现写入数据不完整的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值