起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 412|回复: 12

【结贴】DataGrid多选问题**

[复制链接]
发表于 2009-4-1 15:39:19 | 显示全部楼层 |阅读模式
我要实现的是,改变DataGrid选中的记录的值.
我的代码如下:
  for i:=0 to DataGrid1.Count-1 do
      begin
        if DataGrid1.Items.Selected then
        begin
          if DataSetBroker1.DataSet.Locate('Field_XX',1+DataGrid1.Items.Index,[]) then
          begin
             dsbReport.DataSet.Edit;
            dsbReport.DataSet.FieldByName('Field_XX).AsFloat := DataSetBroker1.DataSet.FieldByName('Field_XX).AsFloat-SysUtils.StrToFloat(Edit1.Text);
            dsbReport.DataSet.ApplyUpdates;
            DataGridEdit.Items.Selected := True;
            end;
          end;
      end;

因为DataGrid的记录不少,分成好几页。如果是在第一页多选,上面的代码能准确的修改记录;但是如果多选不在第一页的话运行上面代码时就会出现多选偏差,定位的记录不是选中的记录。
回复

使用道具 举报

发表于 2009-4-1 16:08:32 | 显示全部楼层
DataSetBroker1.DataSet.Locate('Field_XX',1+DataGrid1.Items.Index,[])
这个定位的原理是什么?我没看懂。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-1 16:11:33 | 显示全部楼层
Field_XX这个字段是个排序字段,从1开始。所以就利用这个字段跟DataGrid的Index来匹配,然后定位数据集的记录
回复 支持 反对

使用道具 举报

发表于 2009-4-1 16:16:08 | 显示全部楼层
你可以把逻辑反过来,让DataSetBroker1.DataSet.遍历,然后判断当前行是否被选择了。再去做操作,就可以省略Locate了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-2 15:13:23 | 显示全部楼层
我照楼上的方法做了一遍,但是还是翻页问题,DataGrid一页显示33条记录,DataGrid1.Items.Selected 这句当 i = 33,也就是到第34条记录的时候就报错。
回复 支持 反对

使用道具 举报

发表于 2009-4-2 15:17:53 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-2 16:22:41 | 显示全部楼层
勾选上edgoLoadAllRecords属性之后就不会因为翻页出现多选偏差了。但是又出现一个问题,修改完数据之后DataGrid就会变成无选中的状态,即使用代码来指定它选择行DataGrid1.Items.Selected := True也不好使,仍然是False。
回复 支持 反对

使用道具 举报

发表于 2009-4-2 16:53:35 | 显示全部楼层
那个帖子也说了,最好增加一个临时字段去做勾选。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-3 09:18:33 | 显示全部楼层
人家客户就不想要勾选,一个个勾选多麻烦啊,没有Ctrl或Shift选得快
回复 支持 反对

使用道具 举报

发表于 2009-4-3 09:40:48 | 显示全部楼层
var
   i:integer;
begin
for i:=0 to DataGrid1.Count-1 do
      begin
        if DataGrid1.Items.Selected then
        begin
        //  if DataSetBZSJJ1.Locate('fid',DataGrid1.Items.Values[0],[]) then
         // begin
         //   dialogs.ShowMessage(DataSetBZSJJ1.FieldByName('fid').AsString);
             dialogs.ShowMessage(objecthelper.ToString(DataGrid1.Items.Values[0]));
            //DataGridEdit.Items.Selected := True;
        //    end;
          end;
      end;
end;
你的问题应该是用网格数据源定位的问题。
如果不定位就不会出现偏差,取值可以从网格上直接取值。看我上面例子。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-22 21:27 , Processed in 0.040183 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表