我创建了一个自定义表单,其中包含一个从TempDB表中显示数据的网格。网格用于根据选择的行打印报告,用户可以通过网格中的字段指定每行的报告数量。
但是,当数量值更改时,网格会丢失行选择。有没有办法在更改网格字段中的值时保留网格选择?
答案 0 :(得分:0)
您可以添加额外的列(例如Selected
)并隐藏标准选择复选框(ShowRowLabels = No
)
答案 1 :(得分:0)
网格丢失行选择的原因很可能是您的自定义代码。例如,如果您拨打YourFormDataSource.executeQuery()
,则会失去选择。
解决方案是在调用清除标记记录的操作之前修改代码以保留标记的记录。你可以这样做:
Array markedRecords;
// This stores the marked records in an array
markedRecords = SalesTable_ds.recordsMarked();
// The behavior of this clears the marked records
SalesTable_ds.executeQuery();
// This sets the marked records back
SalesTable_ds.markRecords(markedRecords);
您应该知道,标记的记录基本上是网格当前顺序的行号。因此,如果用户对列进行排序,则会更改原始查询。因此,当您致电executeQuery()
时,它会使用原始query
对其进行排序,并根据该行标记行。
您应该确定代码中清除选择的内容,并查看此方法是否可以解决这些问题,或者您是否需要执行其他自定义来跟踪已标记的记录...或者是否可以防止它们被取消标记第一名。
您可以看到排序查询的用户如何通过以下方式更改运行时查询:
// Sort the grid manually before calling this code
info(strFmt("%1", SalesTable_ds.queryRun().toString()));
SalesTable_ds.executeQuery();
info(strFmt("%1", SalesTable_ds.queryRun().toString()));
输出结果如下:
查询对象236eb5a0:SELECT FIRSTFAST * FROM SalesTable(SalesTable)ORDER BY SalesTable.CustAccount ASC
查询对象236ebe98:使用INDEX SalesIdx选择FIRSTFAST * FROM SalesTable(SalesTable)
如果您的query
或记录正在发生变化,请使用以下辅助方法。这更可靠,很可能是您想要使用的:
SalesTable salesTableLocal;
RecordLinkList rll = new RecordLinkList();
for (salesTableLocal = SalesTable_ds.getFirst(true); salesTableLocal; salesTableLocal = SalesTable_ds.getNext())
{
rll.ins(salesTableLocal);
}
SalesTable_ds.executeQuery();
while (rll.next(salesTableLocal))
{
SalesTable_ds.markRecord(salesTableLocal, 1);
}