假设在屏幕SO301000上我有一个PXSelector:
namespace PX.Objects.SO
{
public class SOOrderExt : PXCacheExtension<PX.Objects.SO.SOOrder>
{
#region UsrOrderByContact
[PXDBInt]
[PXDefault(typeof(Contact),PersistingCheck=PXPersistingCheck.Nothing)]
[PXUIField(DisplayName="Ordered By")]
[PXSelector(
typeof(Search<Contact.contactID,
Where<Contact.bAccountID, Equal<Current<SOOrder.customerID>>,
And<Contact.contactType, Equal<ContactTypesAttribute.person>>>>),
new Type[]
{
typeof(Contact.lastName),
typeof(Contact.firstName),
typeof(Contact.phone1)
},
SubstituteKey = typeof(Contact.displayName)
)]
public virtual int? UsrOrderByContact { get; set; }
public abstract class usrOrderByContact : IBqlField { }
#endregion
}
}
和ASPX:
<px:PXSelector runat="server" ID="CstPXSelector15" DataField="UsrOrderByContact" AllowAddNew="True" AllowEdit="True" AutoAdjustColumns="True" />
这将显示基于销售订单中当前客户的联系人列表。
我想添加一个新的联系人,所以我单击选择器旁边的铅笔图标,然后在屏幕CR302000上获得一个新窗口。
如何将当前SOOrder.CustomerID的值传递到CR302000屏幕上的Contact.BAccountID字段?
答案 0 :(得分:0)
AllowEdit
功能(铅笔)是一种配置选项,不涉及编程。因此,您无法使其做一些本来就不是开箱即用的行为。
因此,您必须放下AllowEdit
并将其替换为普通的操作按钮。您可以设置按钮样式以仅显示铅笔图标。在事件处理程序中,您可以在重定向用户之前填充图的字段:
[PXButton(ImageKey = PX.Web.UI.Sprite.Main.RecordEdit]
public virtual IEnumerable EditContact(PXAdapter adapter)
{
bool createNewContact = [... false to open existing, true to create a new one...];
ContactMaint graph = PXGraph.CreateInstance<ContactMaint>();
if (createNewContact)
{
// Create new contact and initialize fields before redirecting
var newContact = (Contact)graph.Contact.Cache.CreateInstance();
newContact.BAccountID = [... SOOrder.CustomerID...];
graph.Contact.Current = newContact;
}
else
{
// If already selected, you want to redirect to the
// existing contact instead of creating a new one
graph.Contact.Current = graph.Contact.Search<Contact.contactID>([... current.ContactID ...]);
}
PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.NewWindow);
return adapter.Get();
}