分享

xgrid 问题集

 山不转水转转 2014-04-15
一、xgrid 修改保存问题.
adostoredproc + cxgrid
adostoredproc中使用的是查询,现在只想在CXGRID中修改,但不用保存.想请问是不是有类式的开关?

------解决方案--------------------
ClientDataSet可以实习只修改不提交到数据库,,,直接POST提交到内存,
二、怎么让cxgrid的某列输入只能是数字?
这一列的properties设置为spinedit.
三、cxgrid控制插入重复记录的问题
cxgrid插入值时不允许插入数据库中已经存在记录,请问如何控制
本人在其关联的数据集AdoDataSet的BeforPost事件中进行检测,如果有就对显示消息重复,
并进行AdoDataSetName.CancelUpdates,并Abort后面的操作,但会报内存不能读的错误,原因是
cxgrid表的post错误,说什么不能插入一条空记录,晕死,不知道各位是如何控制重复记录的?

因数据库不能更改,只能在外部检测,所以入数时必须检查。

------解决方案--------------------
判断一下是否有此记录
if Locate then showmessage('存在') else showmessage('不存在') 
------解决方案--------------------
Locate 之前别忘了Bookmark
三、delphi cxgrid 删除
程序运行的时候,按delete键可以吧数据删除,怎么屏蔽?
------解决方案--------------------
tableView的properties->OptionsData->Deleting设为False
四、请问cxgrid里一列设置了buttonedit,点击后如何能取得它所属的TcxGridDBTableView
需要用它所属的TcxGridDBTableView的DataController的方法。
procedure TForm1.grdtblvGrid1DBTableView1Column1PropertiesButtonClick(
  Sender: TObject; AButtonIndex: Integer);
begin
  
end;

------解决方案--------------------
看着用下边三个中的一个
View1.DataController.FocusedDataRowIndex;
  View1.DataController.FocusedRecordIndex;
  View1.DataController.FocusedRowIndex
五、Delphi二维码实现
在网上Down了一个Delphi二维码的源代码,可以正常生成二维码,但是现在有一个问题急切需要解决
1、在Memo中输入分别输入以下文本:第一个带换行
姓名:李洪
电话:13333333333

姓名:李洪电话:13333333333
生成的二维码也不相同,但是用手机识别二维码软件Quickmark确照出相同的结果
姓名:李洪电话:13333333333
2、“ACode生成工具”这个软件生成的二维码就可以正常换行。
3、我就想了解输入字符应该怎么样写才能有换行
4、chr(10)+chr(13)我已经试过了,不好使。

------解决方案--------------------
姓名:李洪
电话:13333333333

姓名:李洪电话:13333333333
生成的二维码也不相同,

不同就是因为多了一个回车换行

回车换行是 #13#10 就是你说的,Chr(10)+Chr(13),但是你的位置没对
不知道你换个位置是否正确了 
------解决方案--------------------
先自动把回车转为空格 
------解决方案--------------------
Delphi(Pascal) code
chr(10)+chr(13)//这个vb的吧

delphi里是#13就可以了呢

------解决方案--------------------
chr、ord是delphi的函数
六、
xgrid 数据显示格式
大家好!
  在cxgrid 中,如何在同一列显示数字和百分号。
  请见下图:
  
  如上图所示。数量栏位可以显示数字及百分号!

谢谢!

------解决方案--------------------
procedure TForm1.cxGrid1DBTableView1Column2GetDisplayText(
  Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord;
  var AText: String);//“数量”列取显示文本
begin
  if pos('率', cxGrid1DBTableView1.DataController.Values[ARecord.Index,0])>0 then//如果当前记录中的“项目”列中有“率”字
    AText:=Sender.EditValue+'%';//在当前列的值后面附加“%”符号

end;

------解决方案--------------------
建议楼主要后台处理更方便。从数据源中生成。
------解决方案--------------------
用SQL在后台生成你要的数据,必要时用CAST强制转换即可。
七、
cxgrid的boolean类型的列,绑定到数据表的bit类型字段,字段默认值为0,
cxgrid的boolean类型的列(复选框形式显示),绑定到数据表的isStop(bit类型)字段,该字段默认值为0,

执行语句
Delphi(Pascal) code
qry1.append;


cxgrid增加一行,但是,cxgrid的列的状态为选中状态。

我在qry1.append;语句后增加了一行 qry1.fieldbyname('isstop').asboolean:=false;  
但,新增行后,该列默认还是选中状态。
执行qry1.post语句后,该列的复选框还是选中状态,(这时候,查看数据表中新增的数据,发现isStop的值为0,该值为0,复选框应该为未选中状态啊)

只有重新qry1.close;qry1.open; 后,才能显示为未选中状态。


这是什么原因呢?如何解决?


------解决方案--------------------
qry1.requery(); 
------解决方案--------------------
'isstop'你的这个静态字段里面有个DEfaultExpression,这样的属性,你在这里设置其值为FALSE 
------解决方案--------------------
qry1.fieldbyname('isstop').DEfaultExpression.Value := false;

记得有VALUE属性吧,上面这句代码你在窗体ONSHOW事件上加上 
------解决方案--------------------
Delphi(Pascal) code
qry1.fieldbyname('isstop').DefaultExpression := QuotedStr('False'); 
八、
如果表中某字段值为NULL,怎么把其值付值为0
设表A: 
ID     Nanme     K101     K102     K103 
1       a                 12       25           14 
2       b                 52       null       4 
..     ..               ..       ..             .. 
假设表中有N条记录,其中有某些条记录是NULL值,我想把为NULL的值,付值为0, 
在asp.net(c#)下,把表读到DataSet里怎么处理?请高手指教,谢谢!

------解决方案--------------------
在select 语句中处理,ORACLE中有一个方法,不清楚SQL有没有,就是如果字段为null(也可以是其他值),则返回一个你指定的值! 
SQL应该也一样能处理! 
------解决方案--------------------
对DataSet的所有行和列循环查找值为DBNull.Value的行列索引。 
找到后对其设置为0 
------解决方案--------------------
select isnull(字段名,0) from 表名; 

这个!! 
------解决方案--------------------
Select isnull(K102,0) From .... 
------解决方案--------------------
干嘛要读出来数据啊? 
直接SQL不就可以了么? 

update table set column = 0 where column is null 
------解决方案--------------------
还有什么条件都拼到WHERE里面 
执行SQL语句用ExcuteNonQuery 
具体ADO.NET的语法请自己Google 
------解决方案--------------------
if (ds2.Tables[0].Rows[j][i] == null) 
---》 
if (ds2.Tables[0].Rows[j][i] == DBNull.Value) 
或者 
if (ds2.Tables[0].Rows[j][i] is DBNull) 
九、

cxGrid导出到excel中,保留背景颜色,字体颜色等设置  

2011-02-07 21:31:04|  分类: 编程 |  标签:delphi  cxgrid   |字号 订阅

环境:Delphi 2010 , DevExpressVCL.v53
之前,要突出显示表格中的某个单元格,使用的是“onCustomDrawCell”事件,例如:

procedure TFrm_SettleDataOut.cxGrid1DBTableView1CustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  //当前列是11 且第24列的值=1,
  if (AViewInfo.Item.ID=11) and
     (AViewInfo.GridRecord.DisplayTexts[24]='1') then
  begin
    ACanvas.SetBrushColor(clRed);
  end;
end;

这样做,表格中的确是正确的突出显示了,但是使用
ExportGridToExcel(dlgSave1.filename,Self.cxGrid1,True,True,True);
导出的excel中,单元格没有突出显示。

想起来还有一种突出单元格的方法,是使用style。
    AYellowStyle: TcxStyle;  //定义一个窗体级变量

//定义该style
procedure TFrm_SettleDataOut.FormCreate(Sender: TObject);
begin
  //行颜色
 AYellowStyle := TcxStyle.Create(Self);
 AYellowStyle.Color := $0080FFFF;
 AYellowStyle.TextColor := clMaroon;
end;

//使用onGetContentStyle事件,按条件定义样式
procedure TFrm_SettleDataOut.cxGrid1DBTableView1StylesGetContentStyle(
  Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
  AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
begin
  //定义行的样式
  if (ARecord<>nil) and (ARecord.ValueCount>=24) and (ARecord.DisplayTexts[24]='1') then
    AStyle:=AYellowStyle;

  //单独定义单元格的样式   只定义第24列的样式
  if (AItem<>nil) and (AItem.ID=24) and (ARecord.DisplayTexts[24]='1') then
     AStyle:=AYellowStyle;
end;

使用style定义单元格的颜色,可以导出到excel中。
十、怎样使鼠标移动时,相应的单元里的文字变色?
解决:
var
FTrackItem: TcxCustomGridTableItem;
FTrackRec: TcxCustomGridRecord;
procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
if (AViewInfo.GridRecord = FTrackRec) and (AViewInfo.Item = FTrackItem) then
begin
ACanvas.Font.Color := clred; //红色字体
ACanvas.Font.Style := [fsUnderline];//带下划线
end;
end;
procedure TForm1.cxGrid1DBTableView1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
AHitTest: TcxCustomGridHitTest;
ATrackItem: TcxCustomGridTableItem;
ATrackRec: TcxCustomGridRecord;
begin
ATrackItem := FTrackItem;
ATrackRec := FTrackRec;
AHitTest := (Sender as TcxGridSite).GridView.ViewInfo.GetHitTest(X, Y);
if AHitTest is TcxGridRecordCellHitTest then
begin
FTrackItem := TcxGridRecordCellHitTest(AHitTest).Item;
FTrackRec := TcxGridRecordCellHitTest(AHitTest).GridRecord;
end
else
begin
FTrackItem := nil;
FTrackRec := nil;
end;
if (ATrackItem <> FTrackItem) or (ATrackRec <> FTrackRec) then
begin
// Invalidate old cell
if ATrackRec <> nil then
ATrackRec.Invalidate(ATrackItem);
// Invalidate new cell
if FTrackRec <> nil then
FTrackRec.Invalidate(FTrackItem);
end;
end;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多