热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在DBGrid中可选中行而又可进入编辑状态

如何在DBGrid中选中行,而又让它可以进入编辑状态?也许你会问我这有什么用?呵呵,做数据库应用的兄弟们会深有感触,当用DBGrid显示的字段过多时,用户不得不拉动最下面的滚
   如何在DBGrid中选中行,而又让它可以进入编辑状态?
  也许你会问我这有什么用?呵呵,做数据库应用的兄弟们会深有感触,当用DBGrid显示的字段过多时,用户不得不拉动最下面的滚动条,去看最右边的东西,如果没有设置DBGrid->Options[dgRowSelect],那么,拉到最右边之后,很有可能看串行的;如果设置了DBGrid->Options[dgRowSelect],则在拉到最右边之后,不会看串行,但是鼠标点击其它行(不是当前选中行)时,DBGrid的视图一下子就会回到显示最左边的那一列,确实很麻烦,用户不得不一次又一次的拖运下面的滚动条。
  一同事因这个问题而苦恼,而我又在CSDN的文档库中看到了这篇文章:
  《DBGrid使用全书(五)》,链接:http://dev.csdn.net/article/51/51845.shtm,是Delphi版本的,核心代码如下:
  type
   TMyDBGrid=class(TDBGrid);
  //DBGrid1.Options->dgEditing=True
  //DBGrid1.Options->dgRowSelect=False
  procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
   DataCol: Integer; Column: TColumn; State: TGridDrawState);
  begin
   with TMyDBGrid(Sender) do
   begin
     if DataLink.ActiveRecord=Row-1 then
     begin
       Canvas.Font.Color:=clWhite;
       Canvas.Brush.Color:=$00800040;
     end
     else
     begin
       Canvas.Brush.Color:=Color;
       Canvas.Font.Color:=Font.Color;
     end;
     DefaultDrawColumnCell(Rect,DataCol,Column,State);
   end;
  end;
  他的解决办法是:曲线救国,取消DBGrid->Options[dgRowSelect],把当前选中行的背景绘制成蓝色,就象是被选中一样,想法确实很妙。我们公司使用C++Builder,我只好把这段代码改为C++Builder版本的,这时,我才发现这段代码的精妙之处。
  我发现DataLink属性是TCustomDBGrid中声明为protected的,而在DBGrid中并未声明它的可见性,因此,不能直接使用它;而Row属性则是在TCustomGrid中声明为protected的,在TCustomGrid的子类中也未声明它的可见性,那么,这段代码为何在Delphi中运行的很好?
  原因就在于:ObjectPascal的单元封装,在同一个单元中定义的类,互相之间是友员的关系,我们再来看这段代码的开头:
  type
   TMyDBGrid = class(TDBGrid);
  声明了一个TMyDBGrid类,那么,当前这个窗体类就和TMyDBGird类互为友元了,那么当然当前窗体类可以直接访问TMyDBGrid的私有属性Row和DataLink了,一切都明了了,那么用C++就好实现了,核心代码如下:
  void __fastcall TMainForm::LineSelEdit(TObject *Sender,const TRect &Rect, int DataCol, TColumn *Column,TGridDrawState State)
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=637&d=2724wn
  {
      class TMyGridBase : public TCustomGrid
      {
      public:
          __property Row;
      };
      class TMyGrid : public TCustomDBGrid
      {
      public:
          __property DataLink;
      };
      TMyGrid *MyGrid = (TMyGrid*)Sender;
      TMyGridBase *MyGridBase = (TMyGridBase*)Sender;
      TDBGrid *Grid = (TDBGrid*)Sender;
  
      if(MyGrid->DataLink->ActiveRecord == MyGridBase->Row-1) {
          Grid->Canvas->Font->Color = clWhite;
          Grid->Canvas->Brush->Color = TColor(0x00800040);
      } else {
          Grid->Canvas->Brush->Color = Grid->Color;
          Grid->Canvas->Font->Color = Grid->Font->Color;
      }
  
      Grid->DefaultDrawColumnCell(Rect,DataCol,Column,State);
  }
  我把它封装成一个函数,函数的参数与DBGrid的OnDrawDataCell的参数一样,使用它的方法就是取消设置DBGrid->Options[dgRowSelect],然后设置DBGrid->DefaultDrawing = false,然后在这个DBGrid的OnDrawDataCell事件中调用这个函数,如下:
  void __fastcall TMainForm::DBGridDrawColumnCell(TObject *Sender,
        const TRect &Rect, int DataCol, TColumn *Column,
        TGridDrawState State)
  {
      this->LineSelEdit(Sender,Rect,DataCol,Column,State);
  }
原文链接: http://www.ccrun.com/article.asp?i=637&d=2724wn

推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
author-avatar
mobiledu2502873611
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有