诗仙·1957 发表于 2024-5-28 08:07:35

js中如何给页面的表格数据松绑定更新?

Forguncy.ListView - 活字格V10帮助文档 (grapecity.com.cn)

假如页面有个表格1,数据有3列,其中有3列,3行,此时另有一个表格数据需要根据某列的值对应去更新对应的行值,
例如第一行id 1   数据 2   数据 3
另有的表格数据,也有id列,去更新第2列 数据2   为数据a2 这个js怎么写,能否写个范例?

Shawn.Liu 发表于 2024-5-28 08:07:36

大佬,这边将最新的JS拷贝到工程中测试,排除了下面两处错误,一个是循环表格所有列信息时,在获取列名ColumnName时;第二个是listview的V大写;可以修改后测试一下,如果还有问题可以在浏览器F12中定位到报错点排查

Shawn.Liu 发表于 2024-5-28 11:53:29

大佬,单通过您的这个描述,我们不能很好的分析具体的问题,方便上传一下截图这边更好的理解一下;

更新表格的值可以使用ListView的setValue或者setText函数,请教下您目前主要是卡在获取待更新数据所在的行索引是吗还是其他问题?

诗仙·1957 发表于 2024-5-28 12:00:22

Shawn.Liu 发表于 2024-5-28 11:53
大佬,单通过您的这个描述,我们不能很好的分析具体的问题,方便上传一下截图这边更好的理解一下;

更新 ...

你说的没有错,这个行索引问题,要通过关键字定位不容易,例如列名叫通道,这种定位列的位置,然后行索引加列的编号去更新数据,

诗仙·1957 发表于 2024-5-28 12:01:37

本帖最后由 诗仙·1957 于 2024-5-28 13:05 编辑

诗仙·1957 发表于 2024-5-28 12:00
你说的没有错,这个行索引问题,要通过关键字定位不容易,例如列名叫通道,这种定位列的位置,然后行索引 ...



调用另一个方法已经把数据弄到表中了,现在这个

// 构建JSON对象
                  var channelObject = {
                        通道号: id < 10 ? "D0" + id : "D" + id,
                        通道名称: name,
                  };

这个数据要根据通道号来更新对通道名称列名的对应行值这样写执行不成功,

诗仙·1957 发表于 2024-5-28 15:40:43

本帖最后由 诗仙·1957 于 2024-5-28 16:05 编辑

Shawn.Liu 发表于 2024-5-28 11:53
大佬,单通过您的这个描述,我们不能很好的分析具体的问题,方便上传一下截图这边更好的理解一下;

更新 ...
我又重新整理了一下思路,



if (gengxinbiao != null) {
                  // 构建JSON对象
                  var channelObject = {
                        通道号: id < 10 ? "D0" + id : "D" + id,
                        通道名称: name,
                  };
                  // 获取表格对象,这里假设表格名为"表格1"
                  var listView = Forguncy.Page.getListView(gengxinbiao);
                  // 目标列名
                  var columnNameCode = "通道号";
                  var columnNameName = "通道名称";
                  // 获取所有列的信息
                  var columnInfos = listView.getMergedColumnInfos();
                  // 获取"通道号"和"通道名称"的列索引
                  var channelCodeColumnIndex = -1;
                  var channelNameColumnIndex = -1;
                  for (var i = 0; i < columnInfos.length; i++) {
                        if (columnInfos.ColumnName === columnNameCode) {
                            channelCodeColumnIndex = i;
                        } else if (columnInfos.ColumnName === columnNameName) {
                            channelNameColumnIndex = i;
                        }
                        // 如果找到两个列,可以提前退出循环
                        if (channelCodeColumnIndex !== -1 && channelNameColumnIndex !== -1) {
                            break;
                        }
                  }                  
                  // 检查是否找到目标列
                  if (channelCodeColumnIndex == -1 || channelNameColumnIndex == -1) {
                        console.error("无法找到 '" + columnNameCode + "' 或 '" + columnNameName + "' 列。");
                  } else {
                        //获取表格的总行数
                        var rowCount = listView.getRowCount();
                        // 遍历表格,查找目标列的行索引
                        var rowIndex = -1;//行索引设置为-1
                        for (var i = 0; i < rowCount; i++) {
                            var rowData = listview.getValue(i,columnNameCode);//根据行索引及列索引获取单元格的值
                            if (rowData === channelObject) {
                              rowIndex = i;//设置正在循环的行索引
                              showCBInfo("找到目标行", rowIndex);
                              showOPInfo(JSON.stringify(channelObject, null, " "));//输出显示当前要更新的json对象
                              //更新该行的"通道名称"列
                              listView.setValue(rowIndex, channelNameColumnIndex, channelObject);
                              showCBInfo(columnNameName+"已更新至行:", rowIndex);
                              break;
                            }
                        }
                  }

                }
但还是运行有问题

诗仙·1957 发表于 2024-5-28 17:08:23

Shawn.Liu 发表于 2024-5-28 16:40
大佬,这边将最新的JS拷贝到工程中测试,排除了下面两处错误,一个是循环表格所有列信息时,在获取列名Colu ...

我又继续测试也找到了这个问题,确实是一个大小写导致的,现在成功了


现在给出海康获取通道的js调用代码
WebVideoCtrl.I_GetDigitalChannelInfo(szDeviceIdentify, {
      success: function (xmlDoc) {
            var oChannels = $(xmlDoc).find("InputProxyChannelStatus");
            showOPInfo( "开始获取数字通道及通道名称");
            $.each(oChannels, function (i) {
                var id = $(this).find("id").eq(0).text(),
                  name = $(this).find("name").eq(0).text(),
                  online = $(this).find("online").eq(0).text();
                if ("false" == online) {// 过滤禁用的数字通道
                  return true;
                }
                if ("" == name) {
                  name = "IPCamera " + (i < 9 ? "0" + (i + 1) : (i + 1));
                }

                if (gengxinbiao != null) {
                  // 构建JSON对象
                  var channelObject = {
                        通道号: id < 10 ? "D0" + id : "D" + id,
                        通道名称: name,
                  };
                  // 获取表格对象,这里假设表格名为"表格1"
                  var listView = Forguncy.Page.getListView(gengxinbiao);
                  // 目标列名
                  var columnNameCode = "通道号";
                  var columnNameName = "通道名称";
                  // 获取所有列的信息
                  var columnInfos = listView.getMergedColumnInfos();
                  // 获取"通道号"和"通道名称"的列索引
                  var channelCodeColumnIndex = -1;
                  var channelNameColumnIndex = -1;
                  for (var i = 0; i < columnInfos.length; i++) {
                        if (columnInfos.ColumnName === columnNameCode) {
                            channelCodeColumnIndex = i;
                        } else if (columnInfos.ColumnName === columnNameName) {
                            channelNameColumnIndex = i;
                        }
                        // 如果找到两个列,可以提前退出循环
                        if (channelCodeColumnIndex !== -1 && channelNameColumnIndex !== -1) {
                            break;
                        }
                  }                  
                  // 检查是否找到目标列
                  if (channelCodeColumnIndex == -1 || channelNameColumnIndex == -1) {
                        console.error("无法找到 '" + columnNameCode + "' 或 '" + columnNameName + "' 列。");
                  } else {
                        //获取表格的总行数
                        var rowCount = listView.getRowCount();
                        // 遍历表格,查找目标列的行索引
                        var rowIndex = -1;//行索引设置为-1
                        for (var i = 0; i < rowCount; i++) {
                            var rowData = listView.getValue(i,columnNameCode);//根据行索引及列索引获取单元格的值
                            if (rowData === channelObject) {
                              rowIndex = i;//设置正在循环的行索引
                              showOPInfo("找到目标行", rowIndex);
                              showOPInfo(JSON.stringify(channelObject, null, " "));//输出显示当前要更新的json对象
                              //更新该行的"通道名称"列
                              listView.setValue(rowIndex, channelNameColumnIndex, channelObject);
                              showOPInfo(columnNameName+"已更新至行:", rowIndex);
                              break;
                            }
                        }
                  }

                }
                if (gengxinbiao == null) {
                  // 获取表格对象
                  var listview = Forguncy.Page.getListView(biaogeming);
                  // 获取表格的行数
                  var count= listview.getRowCount();
                  // 从最后一行开始向前删除
                  for (var i = count - 1; i >= 0; i--) {
                        listview.deleteRow(i);
                  }
                  // 构建JSON对象
                  var channelObject = {
                        通道号: id,
                        通道名称: name,
                        标记状态: false,
                  };
                  // 添加数据到表格
                  listview.addNewRow(channelObject,true);
            }});
            showOPInfo(szDeviceIdentify + " 获取数字通道成功!");
      },
      error: function (oError) {
            showOPInfo(szDeviceIdentify + " 获取数字通道失败!", oError.errorCode, oError.errorMsg);
      }
    });

送给有缘人


Shawn.Liu 发表于 2024-5-28 17:19:54

{:5_114:}
页: [1]
查看完整版本: js中如何给页面的表格数据松绑定更新?