我从下面的Ruslan帖子中获取了参考并实现了相同的工作并且按预期工作但有时,我遇到的问题是“在处理字段期间发生错误ItemRequiresTerms:已经有一个与此命令关联的打开的DataReader必须先关闭。 “
How to show images inside selector lookup?
一个库存项目可能有多个图像,我们只需要图标图像。下面是代码。
public void InventoryItemRowSelecting(PXCache sender, PXRowSelectingEventArgs e)
{
var row = e.Row as InventoryItem;
if (row != null)
{
if (!string.IsNullOrEmpty(row.ImageUrl))
{
foreach (NoteDoc noteDoc in PXSelectReadonly<NoteDoc, Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>>>.Select(Base, row.NoteID)) // here i got error
{
foreach (UploadFile uploadFile in PXSelectReadonly<UploadFile, Where<UploadFile.fileID, Equal<Required<UploadFile.fileID>>>>.Select(Base, noteDoc.FileID))
{
if (uploadFile.Name.Contains("icon"))
{
row.ImageUrl =
ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString());
break;
}
}
}
}
}
}
您需要使用单独的连接范围在BQL
事件处理程序中执行其他RowSelecting
语句。
更多细节可以在here找到。
您可以通过使用正确的Join来避免嵌套for循环,
public void InventoryItemRowSelecting(PXCache sender, PXRowSelectingEventArgs e)
{
var row = e.Row as InventoryItem;
if (row != null)
{
if (!string.IsNullOrEmpty(row.ImageUrl))
{
using (new PXConnectionScope())
{
UploadFile uploadFile = PXSelectReadonly2<UploadFile, InnerJoin<NoteDoc, On<NoteDoc.fileID, Equal<UploadFile.fileID>>>,
Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>,
And<UploadFile.name, Like<Required<UploadFile.name>>>>>.
Select(Base, row.NoteID, "%icon%");
row.ImageUrl = (uploadFile != null) ? ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString())
: null;
}
}
}
}
这里已经是一个公认的答案,但我想向您展示您在示例代码中使用的深度缩进结构的替代方法。
public void InventoryItemRowSelecting(PXCache sender, PXRowSelectingEventArgs e)
{
var row = e.Row as InventoryItem;
if (row == null)
return; // Don't proceed when row doesn't exist
if (string.IsNullOrEmpty(row.ImageUrl))
return; // Don't proceed when ImageUrl doesn't exist
foreach (NoteDoc noteDoc in PXSelectReadonly<NoteDoc, Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>>>.Select(Base, row.NoteID)) // here i got error
{
foreach (UploadFile uploadFile in PXSelectReadonly<UploadFile, Where<UploadFile.fileID, Equal<Required<UploadFile.fileID>>>>.Select(Base, noteDoc.FileID))
{
if (!uploadFile.Name.Contains("icon"))
continue; // Skip non-icon files
row.ImageUrl = ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString());
}
}
}
请注意如何使用更多代码页而不是将所有内容都推到右侧。这是您的原始示例,因此它没有接受答案中的修复,我只想向您展示将来可能考虑的替代模式。
当您将此应用于已接受的解决方案时,这也是一个巨大的变化:
public void InventoryItemRowSelecting(PXCache sender, PXRowSelectingEventArgs e)
{
var row = e.Row as InventoryItem;
if (row == null)
return; // Don't proceed when row doesn't exist
if (string.IsNullOrEmpty(row.ImageUrl))
return; // Don't proceed when ImageUrl doesn't exist
using (new PXConnectionScope())
{
UploadFile uploadFile = PXSelectReadonly2<UploadFile, InnerJoin<NoteDoc, On<NoteDoc.fileID, Equal<UploadFile.fileID>>>,
Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>,
And<UploadFile.name, Like<Required<UploadFile.name>>>>>.
Select(Base, row.NoteID, "%icon%");
if (uploadFile == null)
continue; // Skip non-icon files
row.ImageUrl = ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString());
}
}