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事件了。



posted @ 2016-05-20 14:29  德芙70  阅读(182)  评论(0)    收藏  举报