DBGridEH
在DBGrid中直接控制字段只能输入数字
在DbGrid的OnKeyPress事件中写代码if DbGrid.SelectedIndex=1 //(假如你要控制的字段在DbGrid中的Index=1,也就是对字段绑定的列进行控制就可以了)if not (key in ['0'..'9',#46,#8,#13 ]) begin Key #0; Showmessage('类型错误,必须为数字!'); end;
如何限制dbgrid单元格中字符的长度
在TDbGrid控件中,keypress事件中with myDbGrid do if col=1 then begin if length(trim(Cells[col,row]))>10 then key0; end;其实,就是连接数据源,也是相同的道理,程序控制,加个for循环,截取前10位,楼上的方法也行
DBGridEh列宽自动适应内容的简单方法 http://blog.csdn.net/gaoyunpeng/article/details/1684454?utm_source=jiancool
最近遇到了一个问题,就是使用DBGridEh的时候,查询出的信息总是不能很完美的显示(完美……)
主要现象就是 DBGridEh属性中提供的选项有
AutoFitColWidths
这个属性设置成true的话,整个表格会根据你的程序窗口大小来分配每个列的宽度,从而不会出现横向滚动条,看似很漂亮,不过我要的可不是这个……
如果设置成false,整个表格难看到让人想吃掉显示器!(夸张了)表格的列宽是按照数据库中字段的大小来分配的,也就是说,如果你有一个255长度的字段,可是里面没有那么多信息,只有几个字节,这种情况很常见吧,结果显示出来,一个宽宽的列里面,只有那么可怜的几个字
于是我的要求就来了,希望可以让列宽自动适应内容
方法一:
DBGEMainList是DBGridEh组件,mOffset是自定义变量,这里赋值是5
DBGEMainList.Columns[I].Width := Max(DBGEMainList.Columns[I].Field.Tag, DBGEMainList.Canvas.TextWidth(DBGEMainList.Columns[I].Title.Caption)) + mOffset;
看起来还不错,列宽可以适应标题了,可是当内容的长度超过标题,列宽没能增加,郁闷,失败了
方法二:
发现DBGridEh属性中有个OptionsEh,里面有个dghDblClickOptimizeColWidth,设置成true
帅哦,和Excel一样了,双击列间的交接处,这个列就可以自动调整大小去适应内容啦
看起来距离我的目标很近了~~
于是想到是不是可以用方法来触发双击表头连接处的事件,结果……没找到
于是想到是不是可以在DBGridEh源码里面看看人家原来咋实现的,我照搬就是,结果……没找到
谁让咱菜呢~
无意中,在DBGEMainList.Columns[I].后面点击了Ctrl+空格(代码提示快捷键),在出现的方法列表里面看到OptimizeWidth这个方法,看起来和那个双击啥的很像哈,窃喜~
循环调用一下,每个列都来这么一下子:
for i:=0 to DBGEMainList.Columns.Count-1 do
begin
DBGEMainList.Columns[i].OptimizeWidth;
end;
看看效果~啊哈,成了~看来人家想的蛮周到的,知道恐怕有人会有这需求(想必有这需求的还不少),就给提供了这么一个方法
不知道是不是还能更简便,不过目前这样我已经很知足啦,哈哈,希望有同样需求的兄弟们可以看到我的这篇文章,解你的燃眉之急啊~~
Delphi 在dbgrideh中表格输入数据时有效性的检查
在数据库系统设计中经常要用到在表格中进行数据录入,如何判断在数据导入时的数据有效性呢?下面介绍几种常用的方法与大家交流。
方法一:Dbgrid是与Table,在Table的Column的OnSetText和OnValidate事件中处理。
1、在OnSetText中判断数据的合法性,如果不合法,在OnValidate处理,如果不合法则abort
2、抛出一个异常Raise,即可保证焦点不会丢失。
也可以在Table1.BeforePost里面处理,如果不符合要求,ShowMessage(""),然后Abort;
方法二:如果是Adoquery ,在Column的OnSetText和OnValidate事件中处理。
在OnValidate处理,如果不合法则abort。
procedure Tfrm_cginput.q_maind_dateValidate(Sender: TField);
begin
if Sender.FieldName='d_date' then
if (Sender.AsDateTime>_DEnddate) or (Sender.AsDateTime<_DStartdate) then
begin
showmessage('日期超出范围');
abort;
end;
end;
方法三:
可以用DBGrid1ColExit事件进行。
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
case DBGrid1.SelectedIndex of
0:if DBGrid1.DataSource.DataSet.Fields[0].value<>'我想要的值' then
于吗于吗。
1:
..
end;
end;
附加:
DBGridEH1.columns[i].OnUpdateData也可以
在DBGridEH1.columns[i].OnUpdateData;和在CDS.Fields[i].OnValidate进行校验的对比:
更新才触发,插入不触发; 插入,更新都触发;
使用第三方控件的事件实现; 使用delphi自带控件实现;
界面层上进行控制; 数据层进行控制;
控制数据能不能改的问题; 检查改了的数据是否合法的问题;
综上比较:行校验,是对数据的合法新进行判断,应该使用 CDS.Fields[i].OnValidate;
像权限控制,需要密码验证才能改数据的,应该使用DBGridEH1.columns[i].OnUpdateData
计算字段,肯定是在cds.fields[i].OnChage事件了。
浙公网安备 33010602011771号