CXGRID中修改获得焦点单元格的值。

ak0clj 2008-09-21 01:48:53
我想做一个这样的功能,通过鼠标选取几个单元格后,一起修改它们的值。
问题代码如下:
var
i,j:integer;
UpVal:Double;
InputVal:string;
begin
if (btv_DPSetting.DataController.GetSelectedCount>0) then
begin
InputVal:=InputBox('输入框','请输入上调幅度(必须是数字值):','0');

if (TryStrToFloat(InputVal,UpVal)) then
begin
btv_DPSetting.DataController.BeginUpdate;
for i :=0 to btv_DPSetting.Controller.SelectedRowCount-1 do
begin
for j :=0 to btv_DPSetting.ColumnCount-1 do
begin
if btv_DPSetting.Columns[j].Selected
And checkEdtType(btv_DPSetting.Columns[j].DataBinding.ValueType) then
begin

btv_DPSetting.DataController.Controller.SelectedRecords[i].Values[j]:=
btv_DPSetting.DataController.Controller.SelectedRecords[i].Values[j]+UpVal;
end;//if
end;//for
end;//for
btv_DPSetting.DataController.EndUpdate;
end;
end;//if
这个代码知道只能实现修改表面显示的值,在POST后无法保存到数据库中。
麻烦大家帮帮忙!
...全文
823 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
haochin 2010-07-23
  • 打赏
  • 举报
回复
给一个给你参考一下。我实现的是,在dbgrideh中,用鼠标拖动选取一列中的多行,然后点右键,将选中的行的这一列值全部复制成鼠标所在单元格的值。


procedure TEmp_F.MenuN2Click(Sender: TObject);
var
I : Integer;
S : string;
begin
S := qryEmp.FieldByName(dbgEmp.SelectedField.FieldName).AsString;
if dbgFirst <= dbgLast then
begin
for I := dbgFirst to dbgLast-1 do
begin
qryEmp.MoveBy(-1);
qryEmp.Edit;
qryEMP.FieldByName(dbgEmp.SelectedField.FieldName).AsString := S;
end;
end else
begin
for I := dbgFirst downto dbgLast+1 do
begin
qryEmp.MoveBy(1);
qryEmp.Edit;
qryEMP.FieldByName(dbgEmp.SelectedField.FieldName).AsString := S;
end;
end;

dbgFirst := 0;
dbgLast := 0;
end;

kye_jufei 2010-07-20
  • 打赏
  • 举报
回复
我來給一個正解:
1.首先要設定cxgridview的cellmutiselect的屬性為true;
2.核心代碼:

procedure TRES_CQ_JB_F.N1Click(Sender: TObject);
var
iLoop:Integer;
begin
inherited;
if _JuMaPao=3 then
begin
if IsZCJB=2 then
begin
CQ_JB_P_F:=TCQ_JB_P_F.Create(Self);
if CQ_JB_P_F.ShowModal=mrok then
begin
cxGrid2.BeginUpdate;
cxGrid2DBTableView1.BeginUpdate;
for iLoop:=0 to cxGrid2DBTableView1.DataController.GetSelectedCount -1 do
begin
cxGrid2DBTableView1.Controller.FocusedRow:=cxGrid2DBTableView1.Controller.SelectedRows[iLoop];
adoq_JB.Edit;
adoq_JB.FieldByName('JBRQ').AsString:=FormatDateTime('yyyy/mm/dd',DT);
adoq_JB.FieldByName('SJKSSJ').AsString:=FormatDateTime('hh:mm:ss',DtKSSJ);
adoq_JB.FieldByName('SJJSSJ').AsString:=FormatDateTime('hh:mm:ss',DtJSSJ);
adoq_JB.FieldByName('SJJBSS').AsString:=FormatDateTime('hh:mm:ss',FlGZSS);
adoq_JB.FieldByName('JBYY').AsString:=StrJBYY;
adoq_JB.FieldByName('JBDD').AsString:=StrID;
adoq_JB.FieldByName('STATUS').AsString:=StrJBLX;
adoq_JB.Post;
end;
cxGrid2DBTableView1.EndUpdate;
cxGrid2.EndUpdate;
end;
end;
end;
lb12467966 2010-07-20
  • 打赏
  • 举报
回复
我也遇到这个问题了,还没有人解答完整么?
ak0clj 2009-04-22
  • 打赏
  • 举报
回复
帖子开了好久啊
看来我已经好久好久没有上CSDN了。
SerachFuture 2008-09-28
  • 打赏
  • 举报
回复
定位你修改的数据后,用数据集提交数据
  • 打赏
  • 举报
回复
修改完了,给其他控件设置个焦点即可。

cx就这样,如果没有转移焦点,你的值是不会被保存的。
ak0clj 2008-09-28
  • 打赏
  • 举报
回复
看来这分又是送不出去了。
大家101快乐
ak0clj 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zxf_feng 的回复:]
其实利用cxGrid来进行数据修改与提交,与dbgrid差不多的,先将cxgrid处于edit状态,然后修改,
修改后再post,应该没有问题,我没有太清楚,你指的获取焦点是怎么回事。
[/Quote]
我想给客户提供这样的功能,他可以用鼠标选择需要需要修改的价格(就是单元格),然后统一调价。
获得焦点就是指,那些单元格被选中了。
iamduo 2008-09-23
  • 打赏
  • 举报
回复
我也是,利用DataController修改了一列的值后。
只要一个ADOQuery.First,cxGrid上的数据就全都恢复了。根本没有保存到数据库里。
zyblotuszyb 2008-09-23
  • 打赏
  • 举报
回复
恐怕得注意一下数据集的Locktype属性,另外字段不能是readonly啊
zyblotuszyb 2008-09-23
  • 打赏
  • 举报
回复
恐怕得注意一下数据集的Locktype属性,另外字段不能是readonly啊
阿三 2008-09-23
  • 打赏
  • 举报
回复
在代码中直接将修改的值赋给数据集的控件类似这样
OraQuery1.FieldByName('Order_number').AsString := OrderNumber;
然后再提交
ak0clj 2008-09-23
  • 打赏
  • 举报
回复
好像不是这样子的,我早就试过了,在修改前edit,修改完了就post。可是修改VALUES值就是无法保存到数据库中。
我的意思是我想通过代码去修改cxGrid中获得焦点的单元格的值。
阿三 2008-09-23
  • 打赏
  • 举报
回复
其实利用cxGrid来进行数据修改与提交,与dbgrid差不多的,先将cxgrid处于edit状态,然后修改,
修改后再post,应该没有问题,我没有太清楚,你指的获取焦点是怎么回事。
ak0clj 2008-09-23
  • 打赏
  • 举报
回复
难道没有人用过cxgrid吗?
ak0clj 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zyblotuszyb 的回复:]
恐怕得注意一下数据集的Locktype属性,另外字段不能是readonly啊
[/Quote]
不存在上述情况,谢谢你的提醒
ak0clj 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zxf_feng 的回复:]
在代码中直接将修改的值赋给数据集的控件类似这样
OraQuery1.FieldByName('Order_number').AsString := OrderNumber;
然后再提交
[/Quote]

这种办法是没有问题的
我是想修改那几个获取了焦点单元格(用户可以横向,竖向任意选择单元格)的值。
这样获取那些被获取了单元格就比较麻烦了,我想cxGrid一定有更好的解决办法的。
最近一直在看帮助,还是没有头绪,用过cxGrid的大虾们给点意见吧
mygodsos 2008-09-21
  • 打赏
  • 举报
回复
和dbgrid差不多的,要是单表修改前要数据表table.edit,修改完table.post,要是select出来的多表,你要设置那个query的可以同步修改的属性,具体我忘了。好像是i开头的

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧