坛主快来,我的问题没人回答,5555555(特急!!!!!)(100分)

  • 主题发起人 主题发起人 kinn_liu
  • 开始时间 开始时间
K

kinn_liu

Unregistered / Unconfirmed
GUEST, unregistred user!
有以下需求:
dbgrid中某列上需要绘制一个小图标;另一列需要一个值列表。
问题产生:
当我设置 DBGrid.Columns.State := csDefault,然后在ondrawdatacell事件中把
图标填上时,我的picklist怎么也不显示了,呵呵,好像dbgrid不管picklist的绘制了。

请问:怎样才能使两者兼得。
谢先。

 
换dbgrid,去delphiuser下载ExpressQuantumGrid.
或者去delphi大学(http://go2.163.com/~xuguohua/)下载,有详细例程.
 
如果你有魄力,用grid,自己独数据库,自己一点一点的画,btw,我就是这样做的
很累,不过一般情况下,dbgrid都不能很好的满足需要的.
 
to lczhuohuo
哎,我就是不想那样做,因为明明都可以实现,可是两个放在一起就不能了,呵呵

帮助文件中提到:
当state 为 csCustomized时,画picklist,(呵呵,不知这样理解对不对?)
为 csDefault时,触发ondrawdatacell
所以这两个不能同时用。

现在我是这样做的:
在DBGrid1 得 ClickCell事件中写如下脚本:
if uppercase(dbgrid1.SelectedField.FieldName) = 'DATA_TYPE' then
begin
for i := 0 to dbgrid1.Columns.Count - 1 do
begin
if uppercase(dbgrid1.Columns.Items.Field.fieldname) = 'DATA_TYPE' then
begin
column := dbgrid1.Columns.Items;
column.PickList.clear;
column.PickList.add('CHAR');
column.PickList.add('VARCHAR');
......
DBGrid1.Columns.State := csCustomized;//**********
end;
end;
end
end;

其中//*********标示的那句是改变datagrid的自画风格。
可是现在的问题时,改变自画风格后,datagrid不马上自画,而是在下次点击时(同一
字段)才将picklist画上去,555555555555555555

有没有大虾能告诉我使dbgrid的局部区域失效,从而强制自画的方法,谢谢了,
急急急!!!!!!!!!!!
 
用PICKLIST需要设置DBGrid1.Columns.State ???
 
to gcq:
不需要吗?
呵呵,试试便知。
你在IDE中设置好dbgrid的字段属性后,state的值就变成了csCustomized,这时dbgrid是
不会处罚ondrawdatacell的。
 
不好意思,没注意过!因为没有自己修改过!:)
 
InfoPower,怎么玩都可以。
 
to Chenlili:
对不起,,就是不想用第三方控件,因为升级维护会比较困难。

不知道,大家有什么招儿,能不用第三方的东东,自己做出来。
 
大虾们请快施援手,项目快到期了,就这点儿界面的东东搞不定
急死了,55555555555
 
调用 dbgrid1.repaint 看看
 
to doerbon:
不成,呵呵
 
如果你的要求实现不是那么死的话,我倒想到一个简单的办法实现——用popupmenu。
想必如何为popmenu加icon不必我说了,你只要把你想要的dbgrid的column的buttonstyle
设为cbsEllipsis,然后响应dbgrid的oneditbuttonclick事件如下:
begin
popupmenu1.Popup(mouse.CursorPos.x-80,mouse.CursorPos.y);
end;
如何在popupmenu选择作用后,改变dbgrid值,也不必我说了吧,具体popupmenu弹出位置
你自己再调一下应该差不多吧。
 
如果你的要求实现不是那么死的话,我倒想到一个简单的办法实现——用popupmenu。
想必如何为popmenu加icon不必我说了,你只要把你想要的dbgrid的column的buttonstyle
设为cbsEllipsis,然后响应dbgrid的oneditbuttonclick事件如下:
begin
popupmenu1.Popup(mouse.CursorPos.x-80,mouse.CursorPos.y);
end;
如何在popupmenu选择作用后,改变dbgrid值,也不必我说了吧,具体popupmenu弹出位置
你自己再调一下应该差不多吧。
 
这两个是不可以兼得的哦,如果你要画,就要画所有的Items。
因为源代码是这样的。
if ASSign(ONITEMDRAW) then
drawItems;

它的意思是说,检查用户的On... 函数,如果指针不为空,那么就执行自动画列表的函数。
。。。也就是自动帮你画,所以如果你写了这个函数,它就不帮你画了,所有都要自己做。

 
谢谢杀大龙和daiqingbo的提示,我看了一下VCL,想用以下方法解决这个问题:
定义一个TPopUpListBox,在dbgrid的doubleclick事件中判断列的属性,如果是要画的
列,则将这个画上,popuplistbox 比 popupmenu要好看一些,有滚动条什么的,呵呵。
不过我怎么在doubleclick事件中定位我的popuplistbox呀

daiqingbo提供的方法不是太好,因为需要和一个cell做到边框的对齐。

请大虾费心....
 
>>可是现在的问题时,改变自画风格后,datagrid不马上自画,而是在下次点击时(同一
>>字段)才将picklist画上去,555555555555555555
你的picklist是动态改变的吗?如果不是,何必写代码?直接设计写入更好,升级也方便。
至于tpopuplistbox并不是一个公开的类,而是在implemention部分的,不知道如何引用?
如果改代码,那升级维护恐怕也不简单。
至于第三方控件,都有源代码,用用没什么不好,这也是delphi吸引人之处。
 
to daiqingbo:
我的picklist不是自动改变的,不过,我需要在dbgrid中画小图标,如果我在design时
加picklist,dbgrid就不会触发ondrawdatacell事件,我就不能画小图标了。
 
用EHlib控件吧,包你满意!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
748
import
I
后退
顶部