When I click upload for Excel, Common Settings dialog appear -> Columns dialog appear-> and when I click final Ok it shows me that "the operation has completed" , but no rows are importing. Excel file is correct, it correctly detects mapping.
Grid : Allow upload = true
Graph :
public class KALCADisposalEntry : PXGraph<KALCADisposalEntry, KALCADisposal>
{
public PXSelect<KALCADisposal> LCADisposals;
[PXImport(typeof(KALCADisposal))]
public PXSelectJoin<KALCADisposalDetail,
LeftJoin<KAAsset, On<KAAsset.assetID, Equal<KALCADisposalDetail.assetID>>,
LeftJoin<KAAssetLocationHistory, On<KAAsset.assetID, Equal<KAAssetLocationHistory.assetID>,
And<KAAsset.locationRevID, Equal<KAAssetLocationHistory.revisionID>>>>>,
Where<KALCADisposalDetail.lCADisposalID, Equal<Current<KALCADisposal.lCADisposalID>>>> LCADisposalDetails;
Where KALCADisposal is a primary graph view.
KALCADisposalDetail DAC:
namespace KA
{
using System;
using PX.Data;
using PX.Objects.GL;
using DAC;
using DAC.Shared;
[System.SerializableAttribute()]
public class KALCADisposalDetail : PX.Data.IBqlTable
{
#region LCADisposalID
public abstract class lCADisposalID : PX.Data.IBqlField
{
}
protected int? _LCADisposalID;
[PXDBInt()]
[PXDBDefault(typeof(KALCADisposal.lCADisposalID))]
[PXParent(typeof(Select<KALCADisposal,
Where<KALCADisposal.lCADisposalID, Equal<Current<KALCADisposalDetail.lCADisposalID>>>>))]
public virtual int? LCADisposalID
{
get
{
return this._LCADisposalID;
}
set
{
this._LCADisposalID = value;
}
}
#endregion
#region LCADisposalDetailID
public abstract class lCADisposalDetailID : PX.Data.IBqlField
{
}
protected int? _LCADisposalDetailID;
[PXDBIdentity()]
//[PXUIField(Enabled = false)]
public virtual int? LCADisposalDetailID
{
get
{
return this._LCADisposalDetailID;
}
set
{
this._LCADisposalDetailID = value;
}
}
#endregion
#region AssetID
public abstract class assetID : PX.Data.IBqlField
{
}
protected int? _AssetID;
[PXDBInt(IsKey = true)]
[PXUIField(DisplayName = "Asset ID")]
[KAAssetSelector(typeof(Search<KAAsset.assetID,
Where<KAAsset.status, NotEqual<KAAssetStatus.hold>,
And<KAAsset.status, NotEqual<KAAssetStatus.open>,
And<KAAsset.status, NotEqual<KAAssetStatus.disposed>>>>>))]
public virtual int? AssetID
{
get
{
return this._AssetID;
}
set
{
this._AssetID = value;
}
}
#endregion
#region tstamp
public abstract class Tstamp : PX.Data.IBqlField
{
}
protected byte[] _tstamp;
[PXDBTimestamp()]
public virtual byte[] tstamp
{
get
{
return this._tstamp;
}
set
{
this._tstamp = value;
}
}
#endregion
#region CreatedByID
public abstract class createdByID : PX.Data.IBqlField
{
}
protected Guid? _CreatedByID;
[PXDBCreatedByID()]
public virtual Guid? CreatedByID
{
get
{
return this._CreatedByID;
}
set
{
this._CreatedByID = value;
}
}
#endregion
#region CreatedByScreenID
public abstract class createdByScreenID : PX.Data.IBqlField
{
}
protected string _CreatedByScreenID;
[PXDBCreatedByScreenID()]
public virtual string CreatedByScreenID
{
get
{
return this._CreatedByScreenID;
}
set
{
this._CreatedByScreenID = value;
}
}
#endregion
#region CreatedDateTime
public abstract class createdDateTime : PX.Data.IBqlField
{
}
protected DateTime? _CreatedDateTime;
[PXDBCreatedDateTime()]
public virtual DateTime? CreatedDateTime
{
get
{
return this._CreatedDateTime;
}
set
{
this._CreatedDateTime = value;
}
}
#endregion
#region LastModifiedByID
public abstract class lastModifiedByID : PX.Data.IBqlField
{
}
protected Guid? _LastModifiedByID;
[PXDBLastModifiedByID()]
public virtual Guid? LastModifiedByID
{
get
{
return this._LastModifiedByID;
}
set
{
this._LastModifiedByID = value;
}
}
#endregion
#region LastModifiedByScreenID
public abstract class lastModifiedByScreenID : PX.Data.IBqlField
{
}
protected string _LastModifiedByScreenID;
[PXDBLastModifiedByScreenID()]
public virtual string LastModifiedByScreenID
{
get
{
return this._LastModifiedByScreenID;
}
set
{
this._LastModifiedByScreenID = value;
}
}
#endregion
#region LastModifiedDateTime
public abstract class lastModifiedDateTime : PX.Data.IBqlField
{
}
protected DateTime? _LastModifiedDateTime;
[PXDBLastModifiedDateTime()]
public virtual DateTime? LastModifiedDateTime
{
get
{
return this._LastModifiedDateTime;
}
set
{
this._LastModifiedDateTime = value;
}
}
#endregion
#region NoteID
public abstract class noteID : PX.Data.IBqlField
{
}
protected Guid? _NoteID;
[PXNote()]
public virtual Guid? NoteID
{
get
{
return this._NoteID;
}
set
{
this._NoteID = value;
}
}
#endregion
}
}
KAAssetSelector :
public class KAAssetSelectorAttribute : PXSelectorAttribute
{
public KAAssetSelectorAttribute() :
base(typeof(Search<KAAsset.assetID>))
{
SubstituteKey = typeof(KAAsset.assetCD);
}
public KAAssetSelectorAttribute(Type search) : base(search)
{
SubstituteKey = typeof(KAAsset.assetCD);
}
}
aspx :
<%# Page Language="C#" MasterPageFile="~/MasterPages/FormTab.master" AutoEventWireup="true"
ValidateRequest="false" CodeFile="KA303000.aspx.cs" Inherits="Page_KA301000" Title="Untitled Page" %>
<%# MasterType VirtualPath="~/MasterPages/FormTab.master" %>
<asp:Content ID="cont1" ContentPlaceHolderID="phDS" runat="Server">
<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%" TypeName="KA.KALCADisposalEntry" PrimaryView="LCADisposals">
</px:PXDataSource>
</asp:Content>
<asp:Content ID="cont2" ContentPlaceHolderID="phF" runat="Server">
<px:PXFormView ID="form" runat="server" DataSourceID="ds" Style="z-index: 100" Width="100%" DataMember="LCADisposals" TabIndex="5100">
<Template>
<px:PXLayoutRule ID="PXLayoutRule1" runat="server" StartColumn="True" LabelsWidth="S" ControlSize="S" />
<px:PXSelector ID="edLCADisposalCD" runat="server" DataField="LCADisposalCD">
</px:PXSelector>
<px:PXDropDown ID="edStatus" runat="server" DataField="Status">
</px:PXDropDown>
<px:PXCheckBox ID="edHold" Size="S" runat="server" AlreadyLocalized="False" DataField="Hold" Text="Hold" CommitChanges="true">
</px:PXCheckBox>
<px:PXLayoutRule runat="server" ControlSize="S" LabelsWidth="S" StartColumn="True">
</px:PXLayoutRule>
<px:PXTextEdit ID="edDisposalReason" runat="server" AlreadyLocalized="False" DataField="DisposalReason" DefaultLocale="" Size="L">
</px:PXTextEdit>
</Template>
</px:PXFormView>
</asp:Content>
<asp:Content ID="cont3" ContentPlaceHolderID="phG" runat="Server">
<px:PXTab ID="tab" runat="server" Width="100%" Height="150px" DataSourceID="ds" DataMember="LCADisposalDetails">
<Items>
<px:PXTabItem Text="Details">
<Template>
<px:PXGrid ID="PXGrid1" AdjustPageSize="Auto" runat="server" DataSourceID="ds" TabIndex="-14036" Width="100%" Height="300px" SyncPosition="True" SkinID="DetailsInTab" KeepPosition="True" TemporaryFilterCaption="Filter Applied">
<Levels>
<px:PXGridLevel DataKeyNames="LCADisposalDetailID" DataMember="LCADisposalDetails">
<RowTemplate>
<px:PXSelector ID="edAssetID" runat="server" DataField="AssetID" CommitChanges="True" AutoRefresh="True" AllowEdit="true">
</px:PXSelector>
<px:PXTextEdit ID="edKAAsset__Description" runat="server" AlreadyLocalized="False" DataField="KAAsset__Description" DefaultLocale="">
</px:PXTextEdit>
<px:PXDropDown ID="edKAAsset__Status" runat="server" DataField="KAAsset__Status">
</px:PXDropDown>
<px:PXDropDown ID="edKAAsset__Condition" runat="server" DataField="KAAsset__Condition">
</px:PXDropDown>
<px:PXSelector ID="edKAAsset__UOM" runat="server" DataField="KAAsset__UOM">
</px:PXSelector>
<px:PXNumberEdit ID="edKAAsset__Cost" runat="server" AlreadyLocalized="False" DataField="KAAsset__Cost" DefaultLocale="">
</px:PXNumberEdit>
<px:PXSelector ID="edKAAssetLocationHistory__BuildingID" runat="server" DataField="KAAssetLocationHistory__BuildingID">
</px:PXSelector>
<px:PXTextEdit ID="edKAAssetLocationHistory__Floor" runat="server" AlreadyLocalized="False" DataField="KAAssetLocationHistory__Floor" DefaultLocale="">
</px:PXTextEdit>
<px:PXTextEdit ID="edKAAssetLocationHistory__Room" runat="server" AlreadyLocalized="False" DataField="KAAssetLocationHistory__Room" DefaultLocale="">
</px:PXTextEdit>
<px:PXSelector ID="edKAAssetLocationHistory__EmployeeID" runat="server" DataField="KAAssetLocationHistory__EmployeeID">
</px:PXSelector>
<px:PXSelector ID="edKAAssetLocationHistory__Department" runat="server" DataField="KAAssetLocationHistory__Department">
</px:PXSelector>
<px:PXSegmentMask ID="edKAAssetLocationHistory__SiteID" runat="server" DataField="KAAssetLocationHistory__SiteID">
</px:PXSegmentMask>
</RowTemplate>
<Columns>
<px:PXGridColumn DataField="AssetID" CommitChanges="True">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAsset__Description" Width="200px">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAsset__Cost" TextAlign="Right" Width="100px">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAsset__UOM">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAssetLocationHistory__BranchID">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAssetLocationHistory__BuildingID">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAssetLocationHistory__Floor">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAssetLocationHistory__Room">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAssetLocationHistory__EmployeeID" Width="120px">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAssetLocationHistory__Department">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAssetLocationHistory__SiteID" Width="120px">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAsset__Status">
</px:PXGridColumn>
<px:PXGridColumn DataField="KAAsset__Condition">
</px:PXGridColumn>
</Columns>
</px:PXGridLevel>
</Levels>
<Mode AllowUpload="True" />
</px:PXGrid>
</Template>
</px:PXTabItem>
</Items>
<AutoSize Container="Window" Enabled="True" MinHeight="150" />
</px:PXTab>
</asp:Content>
As you can see <Mode AllowUpload="True" /> is inside in <px:PXGrid> tag
Page screen after uploaded excel :
As you can see it light's up pagination left arrow on the grid , but no rows are imported.
What am I missing?
After I removed selector(KAAssetSelector) from AssetID , problem fixed.
I think it's a bug
Related
Problem #1
I have a Form with a split panel with a tree view on the left side and a grid on the right side.
The tree view is displaying itemClassCD. When I select an item in the tree, the current selection is always the same itemClassCd (the first entry), or null. The code view from the Tree is as follows "Tree.Current.ItemClassCD".
Form with Tree and Grid
Problem#2
The second issue is related to the display of the tree nodes.
They are showing a "+" sign and they will keep opening if I press the sign.
Node Issue
**This is what I have tried.
**
<%# Page Language="C#" MasterPageFile="~/MasterPages/FormDetail.master" AutoEventWireup="true" ValidateRequest="false" CodeFile="SG302010.aspx.cs" Inherits="Page_SG302010" Title="Untitled Page" %>
<%# MasterType VirtualPath="~/MasterPages/FormDetail.master" %>
<asp:Content ID="cont1" ContentPlaceHolderID="phDS" Runat="Server">
<script language="javascript" type="text/javascript">
function showTreeChanged(owner, args)
{
var visible = owner.getValue();
if (window['px_alls'] && px_alls["sp1"]) px_alls["sp1"].setDisabledPanel(visible ? 0 : 1);
}
function showTreeChk(e)
{
if (!loaded)
{
var px = __px_alls(this);
var TreeView = px_alls["chkShowTree"];
setTimeout(function ()
{
if (window['px_alls'] && px_alls["chkShowTree"] && px_alls["sp1"])
{
TreeView = px_alls["chkShowTree"];
px_alls["sp1"].setDisabledPanel(TreeView.getValue() ? 0 : 1);
}
loaded = true;
}, 1);
}
}
function showTreeLoad(e)
{
if (window['__px_alls'])
{
var pxs = __px_alls(this);
if (pxs)
{
setTimeout(function ()
{
var frm = pxs["form"];
if (frm) frm.events.addEventHandler("afterRepaint", showTreeChk);
}, 100);
}
}
}
var loaded = false;
window.addEventListener("load", showTreeLoad);
</script>
<px:PXDataSource EnableAttributes="True" ID="ds" Width="100%" runat="server" PrimaryView="Filter"
TypeName="ISGoalSetting.SGForecastEntry" Visible="True" PageLoadBehavior="PopulateSavedValues">
<CallbackCommands>
<px:PXDSCallbackCommand Name="Save" CommitChanges="True" RepaintControls="All" RepaintControlsIDs="grid" />
<px:PXDSCallbackCommand Name="distribute" Visible="False" CommitChanges="True" DependOnGrid="grid"
RepaintControls="Bound" />
<px:PXDSCallbackCommand Name="distributeOK" Visible="False" CommitChanges="True"
DependOnGrid="grid" />
<px:PXDSCallbackCommand CommitChanges="True" Visible="False" Name="preload" DependOnGrid="grid" />
<px:PXDSCallbackCommand CommitChanges="True" Name="showPreload" />
<px:PXDSCallbackCommand CommitChanges="True" Name="wNext" />
<px:PXDSCallbackCommand CommitChanges="True" Name="showManage" />
<px:PXDSCallbackCommand Name="manageOK" Visible="False" CommitChanges="True"/>
</CallbackCommands>
<DataTrees>
<px:PXTreeDataMember TreeView="Tree" TreeKeys="ItemClassID" ></px:PXTreeDataMember>
</DataTrees>
</px:PXDataSource>
</asp:Content>
<asp:Content ID="cont2" ContentPlaceHolderID="phF" Runat="Server">
<px:PXFormView ID="form" runat="server" Width="100%" DataMember="Filter" Caption="Forecast Filter"
LinkIndicator="True" BPEventsIndicator="True" DataSourceID="ds">
<Template>
<px:PXLayoutRule runat="server" ID="CstPXLayoutRule1" StartColumn="True" LabelsWidth="SM"
ControlSize="M" ></px:PXLayoutRule>
<px:PXSelector CommitChanges="True" ID="edBranchID" runat="server" DataField="BranchID"
DataSourceID="ds" ></px:PXSelector>
<px:PXSelector CommitChanges="True" ID="edFinYear" runat="server" DataField="FinYear"
DataSourceID="ds" AutoRefresh="True" ></px:PXSelector>
<px:PXCheckBox CommitChanges="True" ID="chkShowTree" runat="server" DataField="ShowTree">
<ClientEvents ValueChanged="showTreeChanged" />
</px:PXCheckBox>
</Template>
<CallbackCommands>
<Save PostData="Page" RepaintControls="All" RepaintControlsIDs="grid, tree" ></Save>
</CallbackCommands>
</px:PXFormView>
</asp:Content>
<asp:Content ID="cont3" ContentPlaceHolderID="phG" Runat="Server">
<px:PXSplitContainer runat="server" ID="sp1" SplitterPosition="220" CollapseDirection="Panel1"
Panel1MinSize="1" DisabledPanel="Panel1">
<AutoSize Enabled="true" Container="Window" />
<Template1>
<px:PXTreeView ID="tree" runat="server" PopulateOnDemand="True" ExpandDepth="1" DataSourceID="ds"
ShowRootNode="false" SelectFirstNode="true" >
<AutoCallBack Target="grid" Command="Refresh" />
<Images>
<ParentImages Normal="tree#Folder" Selected="tree#FolderS" />
<LeafImages Normal="tree#Folder" Selected="tree#FolderS" />
</Images>
<DataBindings>
<px:PXTreeItemBinding DataMember="Tree" TextField="ItemClassCD" ValueField="ItemClassID" ></px:PXTreeItemBinding>
</DataBindings>
<AutoSize Enabled="True" />
</px:PXTreeView>
</Template1>
<Template2>
<px:PXGrid ID="grid" runat="server" DataSourceID="ds" Width="100%" Height="150px" SkinID="Details" Caption="Forecast Details"
SyncPosition="True">
<AutoCallBack Command="Refresh" Target="form" ActiveBehavior="True">
<Behavior RepaintControlsIDs="ds" BlockPage="True" CommitChanges="True" ></Behavior>
</AutoCallBack>
<Levels>
<px:PXGridLevel DataMember="ForecastArticles">
<Columns>
<px:PXGridColumn DataField="BranchID" Width="140" ></px:PXGridColumn>
<px:PXGridColumn DataField="GoalType" Width="140" ></px:PXGridColumn>
<px:PXGridColumn DataField="ItemClass" Width="120" ></px:PXGridColumn>
<px:PXGridColumn DataField="Month" Width="90" ></px:PXGridColumn>
<px:PXGridColumn DataField="Goal" Width="100" ></px:PXGridColumn></Columns>
</px:PXGridLevel>
</Levels>
<AutoSize Container="Window" Enabled="True" MinHeight="150" ></AutoSize>
<ActionBar >
</ActionBar>
<Mode AllowUpload="True" /></px:PXGrid>
</Template2>
</px:PXSplitContainer>
</asp:Content>
public class SGForecastEntry : PXGraph<SGForecastEntry>
{
#region Actions
public PXSave<SGForecastFilter> Save;
public PXCancel<SGForecastFilter> Cancel;
public PXDelete<SGForecastFilter> Delete;
public PXAction<SGForecastFilter> First;
public PXAction<SGForecastFilter> Prev;
public PXAction<SGForecastFilter> Next;
public PXAction<SGForecastFilter> WNext;
public PXAction<SGForecastFilter> Last;
public PXAction<SGForecastFilter> ShowPreload;
public PXAction<SGForecastFilter> Preload;
public PXAction<SGForecastFilter> Distribute;
public PXAction<SGForecastFilter> DistributeOK;
public PXAction<SGForecastFilter> ShowManage;
public PXAction<SGForecastFilter> ManageOK;
#endregion
#region Selects
public PXFilter<SGForecastFilter> Filter;
public SelectFrom<INItemClass>.OrderBy<INItemClass.itemClassCD.Asc>.View Tree;
public SelectFrom<INItemClass>.
Where<INItemClass.itemClassID.IsEqual<INItemClass.itemClassID.FromCurrent>>.View CurrentNode;
/*Everything*/
[PXImport(typeof(ISSGForecast))]
public SelectFrom<ISSGForecast>.
OrderBy<Asc<ISSGForecast.itemClass>>.View ForecastArticles;
#endregion
protected bool suppressIDs;
public override IEnumerable ExecuteSelect(string viewName, object[] parameters, object[] searches, string[] sortcolumns, bool[] descendings, PXFilterRow[] filters, ref int startRow, int maximumRows, ref int totalRows)
{
IEnumerable ret = base.ExecuteSelect(viewName, parameters, searches, sortcolumns, descendings, filters, ref startRow, maximumRows, ref totalRows);
suppressIDs = viewName == nameof(ForecastArticles);
CurrentSelected.ClassCD = Tree.Current?.ItemClassCD;
return ret;
}
private SelectedClass CurrentSelected
{
get
{
PXCache cache = this.Caches[typeof(SelectedClass)];
if (cache.Current == null)
{
cache.Insert();
cache.IsDirty = false;
}
return (SelectedClass)cache.Current;
}
}
[Serializable]
[PXHidden]
public partial class SGForecastFilter : IBqlTable
{
#region BranchID
public abstract class branchID : PX.Data.BQL.BqlInt.Field<branchID> { }
[Branch(Required = true)]
public virtual int? BranchID { get; set; }
#endregion
#region FinYear
public abstract class finYear : PX.Data.BQL.BqlString.Field<finYear> { }
[PXUIField(DisplayName = "Financial Year", Required = true)]
[PXDBString(4)]
[GenericFinYearSelector(typeof(Search3<FinYear.year, OrderBy<Desc<FinYear.year>>>),null)]
public virtual String FinYear { get; set; }
#endregion
#region ShowTree
public abstract class showTree : PX.Data.BQL.BqlBool.Field<showTree> { }
[PXBool]
[PXUnboundDefault(true)]
[PXUIField(DisplayName = "Tree View")]
public virtual Boolean? ShowTree { get; set; }
#endregion
#region ItemClass
[PXDBString(10, IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "Item Class", Visibility = PXUIVisibility.SelectorVisible)]
[PXSelector(typeof(Search<INItemClass.itemClassCD>))]
public virtual string ItemClass { get; set; }
public abstract class itemClass : PX.Data.BQL.BqlString.Field<itemClass> { }
#endregion
public short? Precision;
}
[Serializable]
[PXHidden]
public partial class SelectedClass : IBqlTable
{
#region ItemClass
[PXInt]
[PXSelector(typeof(Search<INItemClass.itemClassID>))]
public virtual int? ItemClass { get; set; }
public abstract class itemClass : PX.Data.BQL.BqlInt.Field<itemClass> { }
#endregion
#region ClassCD
[PXString]
[PXSelector(typeof(Search<INItemClass.itemClassCD>))]
public virtual string ClassCD { get; set; }
public abstract class classCD : PX.Data.BQL.BqlString.Field<classCD> { }
#endregion
}
}
everybody. I' m a acumatica version 4. 10.
I' m asking you today about a problem. I had this error trying to create a new page for the website.
I added a project for this section, which includes all the files as shown below
The error occurred when i tried to access the new page that just created
My new page
<%# Page Language="C#" MasterPageFile="~/MasterPages/FormDetail.master" AutoEventWireup="true" ValidateRequest="false" CodeFile="PO510000.aspx.cs" Inherits="Page_PO510000" Title="Untitled Page" %>
<%# MasterType VirtualPath="~/MasterPages/FormDetail.master" %>
<asp:Content ID="cont1" ContentPlaceHolderID="phDS" Runat="Server">
<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%" PrimaryView="CodeGiftRecords" TypeName="SunfixInquiry.POCodeGiftMaint">
<CallbackCommands>
<px:PXDSCallbackCommand Name="Save" CommitChanges="True" />
<px:PXDSCallbackCommand Name="Insert" CommitChanges="True" Visible="false" />
<px:PXDSCallbackCommand Name="Delete" CommitChanges="True" Visible="false" />
<px:PXDSCallbackCommand Name="First" CommitChanges="True" Visible="false" />
<px:PXDSCallbackCommand Name="Previous" CommitChanges="True" Visible="false" />
<px:PXDSCallbackCommand Name="Next" CommitChanges="True" Visible="false" />
<px:PXDSCallbackCommand Name="Last" CommitChanges="True" Visible="false" />
</CallbackCommands>
</px:PXDataSource>
</asp:Content>
<asp:Content ID="cont2" ContentPlaceHolderID="phF" Runat="Server">
<px:PXFormView ID="form" runat="server" DataSourceID="ds" Style="z-index: 100"
Width="100%">
<Template>
<px:PXLayoutRule runat="server" StartRow="True"/>
</Template>
</px:PXFormView>
</asp:Content>
<asp:Content ID="cont3" ContentPlaceHolderID="phG" Runat="Server">
<px:PXGrid ID="grid" runat="server" DataSourceID="ds" Style="z-index: 100"
Width="100%" Height="150px" SkinID="Details" TabIndex="2200">
<Levels>
<px:PXGridLevel DataKeyNames="CodeGift" DataMember="CodeGiftRecords">
<RowTemplate>
<px:PXCheckBox ID="edDisable" runat="server" CommitChanges="True" DataField="Disable" Text="Disable">
</px:PXCheckBox>
</RowTemplate>
<Columns>
<px:PXGridColumn DataField="CodeGift">
</px:PXGridColumn>
<px:PXGridColumn DataField="Name">
</px:PXGridColumn>
<px:PXGridColumn DataField="Disable" TextAlign="Center" Type="CheckBox" DataType="Boolean">
</px:PXGridColumn>
</Columns>
</px:PXGridLevel>
</Levels>
<AutoSize Container="Window" Enabled="True" MinHeight="150" />
<ActionBar ActionsText="False">
</ActionBar>
<Mode AllowUpload="True" />
</px:PXGrid>
</asp:Content>
My DAC
<Graph ClassName="POCodeGift" Source="#CDATA" IsNew="True" FileType="NewDac">
<CDATA name="Source"><![CDATA[using System;
using PX.Data;
namespace SunfixInquiry
{
[Serializable]
public class POCodeGift: IBqlTable
{
#region CodeGift
[PXDBString(10, IsKey = true, InputMask = "")]
[PXUIField(DisplayName = "Code Gift")]
public string CodeGift { get; set; }
public class codeGift : IBqlField{}
#endregion
#region Name
[PXDBString(IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "Name")]
public string Name { get; set; }
public class name : IBqlField{}
#endregion
#region Disable
[PXDBBool()]
[PXUIField(DisplayName = "Disable")]
public bool? Disable { get; set; }
public class disable : IBqlField{}
#endregion
#region CreatedByID
[PXDBCreatedByID()]
public Guid? CreatedByID { get; set; }
public class createdByID : IBqlField{}
#endregion
#region CreatedByScreenID
[PXDBCreatedByScreenID()]
public string CreatedByScreenID { get; set; }
public class createdByScreenID : IBqlField{}
#endregion
#region CreatedDateTime
[PXDBCreatedDateTime]
[PXUIField(DisplayName = "Created Date Time")]
public DateTime? CreatedDateTime { get; set; }
public class createdDateTime : IBqlField{}
#endregion
#region LastModifiedByID
[PXDBLastModifiedByID()]
public Guid? LastModifiedByID { get; set; }
public class lastModifiedByID : IBqlField{}
#endregion
#region LastModifiedByScreenID
[PXDBLastModifiedByScreenID()]
public string LastModifiedByScreenID { get; set; }
public class lastModifiedByScreenID : IBqlField{}
#endregion
#region LastModifiedDateTime
[PXDBLastModifiedDateTime()]
[PXUIField(DisplayName = "Last Modified Date Time")]
public DateTime? LastModifiedDateTime { get; set; }
public class lastModifiedDateTime : IBqlField{}
#endregion
#region Tstamp
[PXDBTimestamp()]
[PXUIField(DisplayName = "Tstamp")]
public byte[] Tstamp { get; set; }
public class tstamp : IBqlField{}
#endregion
}
}]]></CDATA>
</Graph>
My Graph
<Graph ClassName="POCodeGiftMaint" Source="#CDATA" IsNew="True" FileType="NewGraph">
<CDATA name="Source"><![CDATA[using System;
using PX.Data;
namespace SunfixInquiry
{
[PXCustomization]
public class POCodeGiftMaint: PXGraph<POCodeGiftMaint,POCodeGift>
{
[PXImport(typeof(POCodeGift))]
public PXSelect<POCodeGift> CodeGiftRecords;
#region Event Handlers
#endregion
}
}]]></CDATA>
</Graph>
Please tell me what i' m missing, many thanks
The ASPX markup states that CodeGiftRecords is thePrimaryView and the DataMember of the grid. Does your BLC have CodeGiftRecords specified, or is it named something else? The ASPX also shows a FormView tag without a DataMember. Is this page handling Master/Detail information, or did you intend to use a ListView instead?
I have a companion table / DAC to Inventory Items:
[Serializable]
public class InventoryItemCompanion : IBqlTable
{
[PXDBInt(IsKey = true)]
[PXParent(typeof(Select<InventoryItem,
Where<InventoryItem.inventoryID, Equal<Current<InventoryItemCompanion.inventoryID>>>>))]
[PXDBDefault(typeof(InventoryItem.inventoryID))]
public virtual int? InventoryID { get; set; }
public abstract class inventoryID : IBqlField { }
[PXDBInt]
[PXUIField(DisplayName = "Custom Data")]
public virtual int? CustomData { get; set; }
public abstract class customData : IBqlField { }
}
I then have a custom Process screen that will operate on these custom records with a Filter and derived class adding a Selection field. In the Process screen I Join in the Inventory Item records to display relevant information in the process grid.
[Serializable]
public class InventoryItemCompanionProcess : InventoryItemCompanion
{
[PXBool]
[PXUIField(DisplayName = "Select")]
public virtual bool? Selected { get; set; }
public abstract class selected : IBqlField { }
}
[Serializable]
public class TestFilter : IBqlTable
{
[PXDBInt]
[PXUIField(DisplayName = "Item Class")]
[PXDimensionSelector(INItemClass.Dimension,
typeof(Search<INItemClass.itemClassID>),
typeof(INItemClass.itemClassCD),
DescriptionField = typeof(INItemClass.descr))]
public virtual int? ItemClassID { get; set; }
public abstract class itemClassID : IBqlField { }
}
public class TestProcess : PXGraph<TestProcess>
{
public PXCancel<TestFilter> Cancel;
public PXFilter<TestFilter> Filter;
public PXFilteredProcessingJoin<
InventoryItemCompanionProcess, TestFilter,
InnerJoin<InventoryItem,
On<InventoryItem.inventoryID, Equal<InventoryItemCompanionProcess.inventoryID>>>,
Where<InventoryItem.itemClassID, Equal<Current<TestFilter.itemClassID>>,
Or<Current<TestFilter.itemClassID>, IsNull>>,
OrderBy<Asc<InventoryItem.inventoryCD>>
> Records;
public TestProcess()
{
Records.SetSelected<InventoryItemCompanionProcess.selected>();
Records.SetProcessDelegate(Process);
}
public static void Process(List<InventoryItemCompanionProcess> Records)
{
foreach(var rec in Records)
{
// Perform custom processing function
}
}
}
And the ASPX page:
<%# Page Language="C#" MasterPageFile="~/MasterPages/FormDetail.master" AutoEventWireup="true" ValidateRequest="false" CodeFile="XX501000.aspx.cs" Inherits="Page_XX501000" Title="Untitled Page" %>
<%# MasterType VirtualPath="~/MasterPages/FormDetail.master" %>
<asp:Content ID="cont1" ContentPlaceHolderID="phDS" Runat="Server">
<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%" PrimaryView="Filter" TypeName="TestProcessing.TestProcess">
</px:PXDataSource>
</asp:Content>
<asp:Content ID="cont2" ContentPlaceHolderID="phF" Runat="Server">
<px:PXFormView ID="form" runat="server" DataSourceID="ds" Style="z-index: 100" Width="100%" DataMember="Filter" TabIndex="100">
<Template>
<px:PXLayoutRule runat="server" StartRow="True"/>
<px:PXSegmentMask ID="edItemClassID" runat="server" DataField="ItemClassID" />
</Template>
</px:PXFormView>
</asp:Content>
<asp:Content ID="cont3" ContentPlaceHolderID="phG" Runat="Server">
<px:PXGrid ID="grid" runat="server" DataSourceID="ds" Style="z-index: 100" Width="100%" Height="150px" SkinID="Details" TabIndex="900">
<Levels>
<px:PXGridLevel DataMember="Records">
<RowTemplate>
<px:PXCheckBox ID="edSelected" runat="server" AlreadyLocalized="False" DataField="Selected" Text="Select" />
<px:PXNumberEdit ID="edCustomData" runat="server" AlreadyLocalized="False" DataField="CustomData" />
<px:PXSegmentMask ID="edInventoryItem__InventoryCD" runat="server" DataField="InventoryItem__InventoryCD" />
<px:PXTextEdit ID="edInventoryItem__Descr" runat="server" AlreadyLocalized="False" DataField="InventoryItem__Descr" />
<px:PXSegmentMask ID="edInventoryItem__ItemClassID" runat="server" DataField="InventoryItem__ItemClassID" />
</RowTemplate>
<Columns>
<px:PXGridColumn AllowCheckAll="True" DataField="Selected" TextAlign="Center" Type="CheckBox" Width="60px" />
<px:PXGridColumn DataField="CustomData" TextAlign="Right" />
<px:PXGridColumn DataField="InventoryItem__InventoryCD" />
<px:PXGridColumn DataField="InventoryItem__Descr" Width="200px" />
<px:PXGridColumn DataField="InventoryItem__ItemClassID" Width="120px" />
</Columns>
</px:PXGridLevel>
</Levels>
<AutoSize Container="Window" Enabled="True" MinHeight="150" />
</px:PXGrid>
</asp:Content>
The Process does run on the desired records but after doing so the fields within the Grid from the Joined Inventory Item table are blanked.
I need the Item information to still display in case of errors in the processing requiring user attention.
Consider changing InventoryItemCompanion (or the derived class) into a PXProjection, mapping each field to the specific DAC Field intended. Optionally try marking displayed fields like Descr with IsKey=true, such as:
[PXProjection(typeof(
Select2<InventoryItemCompanion,
InnerJoin<InventoryItem, On<InventoryItemCompanion.inventoryID,
Equal<InventoryItem.inventoryID>>>>),
new Type[] { typeof(InventoryItemCompanion) }, Persistent = true)]
public class InventoryItemCompanion : PX.Data.IBqlTable
{
[PXDBInt(IsKey = true,
BqlField=typeof(InventoryItemCompanion.inventoryID))]
[PXParent(typeof(Select<InventoryItem,
Where<InventoryItem.inventoryID,
Equal<Current<InventoryItemCompanion.inventoryID>>>>))]
[PXDBDefault(typeof(InventoryItem.inventoryID))]
public virtual int? InventoryID { get; set; }
public abstract class inventoryID : IBqlField { }
[PXDBString(256, IsKey = true,
BqlField=typeof(InventoryItem.descr))]
[PXUIField(DisplayName="Description", Enabled=false))]
public virtual String Descr{ get; set;
public abstract class descr: IBqlField { }
}
The View would then be PXFilteredProcessing instead of PXFilteredProcessingJoin and the ASPX markup would assign DataField = "Descr" directly instead of InventoryItem__Descr, as example.
I am trying to add a detail grid tied to the selected sales category on the Sales Category screen (IN204060)
Created a DAC that holds the grid data:
public class INCategoryFilesCTC : IBqlTable
{
#region CategoryID
[PXDBInt(IsKey = true)]
[PXUIField(DisplayName = "Category ID")]
public virtual int? CategoryID { get; set; }
public abstract class categoryID : IBqlField { }
#endregion
#region Type
[PXDBString(1, IsFixed = true, IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "Type")]
public virtual string Type { get; set; }
public abstract class type : IBqlField { }
#endregion
#region NoteID
[PXNote()]
[PXUIField(DisplayName = "Price Source")]
public virtual Guid? NoteID { get; set; }
public abstract class noteID : IBqlField { }
#endregion
#region Uploaded
[PXDBDate()]
[PXUIField(DisplayName = "Uploaded")]
public virtual DateTime? Uploaded { get; set; }
public abstract class uploaded : IBqlField { }
#endregion
#region FileName
[PXDBString(50, IsFixed = true, IsUnicode = true, InputMask = "")]
[PXUIField(DisplayName = "File Name")]
public virtual string FileName { get; set; }
public abstract class fileName : IBqlField { }
#endregion
}
Then added a data view delegate select (was having issues with Current<> due to the non standard selects for the rest of the graph data)
public PXSelect<INCategoryFilesCTC> CategoryFiles;
protected virtual IEnumerable categoryFiles()
{
var cache = Base.Caches[typeof(INCategoryFilesCTC)];
cache.AllowInsert = true;
cache.AllowUpdate = true;
cache.AllowDelete = true;
var select = PXSelect<INCategoryFilesCTC,
Where<INCategoryFilesCTC.categoryID,
Equal<Required<INCategoryFilesCTC.categoryID>>>>.Select(Base,Base.Folders.Current.CategoryID).FirstTableItems;
foreach (INCategoryFilesCTC item in select)
{
cache.SetStatus(item,PXEntryStatus.Held);
}
return cache.Cached;
}
The grid lives inside of 1/2 of a split container, and inside a tab. Search for ID="WebFiles" ( is the half it lives in, figured I wouldn't drown you guys with aspx code, if you want the rest let me know)
<Template2>
<px:PXFormView ID="form" runat="server" DataSourceID="ds" DataMember="CurrentCategory"
Caption="Category Info" Width="100%">
<Template>
<px:PXLayoutRule ID="PXLayoutRule1" runat="server" StartColumn="True" LabelsWidth="S" ControlSize="SM" />
<px:PXTextEdit ID="edDescription" runat="server" DataField="Description" CommitChanges="True" />
<px:PXLayoutRule ID="PXLayoutRule2" runat="server" StartColumn="True" LabelsWidth="S" ControlSize="SM" />
<px:PXTreeSelector ID="edParentID" runat="server" DataField="ParentID" ShowRootNode="False"
TreeDataMember="ParentFolders" TreeDataSourceID="ds" AutoRefresh="True" ExpandDepth="1"
SyncPosition="True" DataMember="ParentFolders" AutoRepaint="True" CommitChanges="True" KeepPosition="True">
<DataBindings>
<px:PXTreeItemBinding DataMember="ParentFolders" TextField="Description" ValueField="CategoryID" />
</DataBindings>
</px:PXTreeSelector>
<px:PXLayoutRule ID="PXLayoutRule3" runat="server" StartColumn="True" LabelsWidth="S" ControlSize="SM" />
</Template>
</px:PXFormView>
<px:PXTab runat="server" >
<Items>
<px:PXTabItem Text="Category Members">
<Template>
<px:PXGrid ID="gridMembers" runat="server" ActionsPosition="Top" Width="100%"
SkinID="Details" CaptionVisible="true" SyncPosition="True"
AutoRepaint="True" AdjustPageSize="Auto">
<AutoSize Enabled="True" Container="Parent"/>
<Mode InitNewRow="True"></Mode>
<Levels>
<px:PXGridLevel DataMember="Members">
<Columns>
<px:PXGridColumn AllowCheckAll="True" AllowNull="False" DataField="CategorySelected" TextAlign="Center"
Type="CheckBox" Width="26px" />
<px:PXGridColumn DataField="InventoryID" CommitChanges="true" Width="140px" LinkCommand="viewDetails"/>
<px:PXGridColumn DataField="InventoryItem__Descr" Width="200px"/>
<px:PXGridColumn DataField="InventoryItem__ItemClassID" Width="140px"/>
<px:PXGridColumn AllowNull="False" DataField="InventoryItem__ItemStatus" RenderEditorText="True" Width="100px"/>
</Columns>
</px:PXGridLevel>
</Levels>
<ActionBar>
<Actions>
<Search Enabled="False" />
<EditRecord Enabled="False" />
<NoteShow Enabled="False" />
<FilterShow Enabled="False" />
<FilterSet Enabled="False" />
<ExportExcel Enabled="False" />
</Actions>
<CustomItems>
<px:PXToolBarButton Tooltip="Copy Selected Inventory Items" DisplayStyle="Image">
<AutoCallBack Command="Copy" Enabled="True" Target="ds" />
<Images Normal="main#Copy" />
</px:PXToolBarButton>
<px:PXToolBarButton Tooltip="Cut Selected Inventory Items" DisplayStyle="Image">
<AutoCallBack Command="Cut" Enabled="True" Target="ds" />
<Images Normal="main#Cut" />
</px:PXToolBarButton>
<px:PXToolBarButton Tooltip="Paste Inventory Items from Buffer" DisplayStyle="Image">
<AutoCallBack Command="Paste" Enabled="True" Target="ds" />
<Images Normal="main#Paste" />
</px:PXToolBarButton>
<px:PXToolBarButton>
<AutoCallBack Command="AddItemsbyClass" Target="ds" />
</px:PXToolBarButton>
<px:PXToolBarButton Text="Inventory Details" Key="cmdviewDetails" Visible="False">
<AutoCallBack Command="viewDetails" Target="ds" />
</px:PXToolBarButton>
</CustomItems>
</ActionBar>
</px:PXGrid>
</Template>
</px:PXTabItem>
<px:PXTabItem Text="Website Media">
<template>
<px:PXFormView ID="WebForm" runat="server" DataSourceID="ds" DataMember="CurrentCategory">
<Template>
<px:PxTextEdit ID="txtVideoURL" runat="server" DataField="CTCVideoURL" />
<px:PxTextEdit ID="txtCategoryDesc" runat="server" DataField="CTCCategoryDesc" />
</Template>
</px:PXFormView>
<px:PXGrid ID="WebFiles" runat="server" FilesIndicator="True" Height="300px" Width="100%" DataSourceID="ds">
<Levels>
<px:PXGridLevel DataMember="CategoryFiles" DataKeyNames="CategoryID">
<Columns>
<px:PXGridColumn DataField="CategoryID" />
<px:PXGridColumn DataField="Type" />
<px:PXGridColumn DataField="Filename" />
<px:PXGridColumn DataField="Uploaded"/>
</Columns>
</px:PXGridLevel>
</Levels>
<ActionBar>
<Actions>
<Delete Enabled="True" />
<AddNew Enabled="True" />
</Actions></ActionBar>
</px:PXGrid>
</template>
</px:PXTabItem>
</Items>
</px:PXTab>
</Template2>
When I select a tree element, if there are records that would show up in my custom table (tree element categoryID = grid record categoryID) I get the following error:
Error: an invalid argument has been specified
Parameter name selectParent
Absolutely nothing comes up in trace, and nothing comes up during debugging, so I am at a bit of a loss.
A few things:
The error goes away when I comment out my custom PXGrid, and I can use the screen normally even with the tabs and groups i have added
The error does not go away if i comment out the PXParent and PXDBDefault attributes on the grids CategoryID DAC Field
If there is no detail record for the selected tree choice, there is no error. If I make a record and save it, the error appears (with the inserted record now showing in the grid, and a saved detail record in the database table)
This lends me to believe something is happening on the select of the detail records. Any advice?
Thanks
-Kyle
OK, this turned out to be more basic than I thought.. whoops. If you want to skip reading it turned out to be due to a simple key issue on the detail records
First off, I removed the data view delegate, the "Current" Sales category ID was coming through fine
public PXSelect<INCategoryFilesCTC,
Where<INCategoryFilesCTC.categoryID,
Equal<Current<INCategory.categoryID>>>> CategoryFiles;
Second off, added the correct PXParent and PXDBdefault attributes for the master-detail link (on field CategoryID)
#region CategoryID
[PXDBInt(IsKey=true)]
[PXParent(typeof(Select<INCategory, Where<INCategory.categoryID, Equal<Current<INCategory.categoryID>>>>))]
[PXDBDefault(typeof(INCategory.categoryID))]
public virtual int? CategoryID { get; set; }
public abstract class categoryID : IBqlField { }
#endregion
But lastly I added a Row# style column that used attribute [PXLineNbr]
#region CatFileKey
[PXDBInt(IsKey=true)]
[PXLineNbr(typeof(INCTC001INCategory.ctcPrevFileNumber))]
public virtual int? CatFileKey { get; set; }
public abstract class carFileKey : IBqlField { }
#endregion
And having this second key fixed my problem immediately
So all in all an error that I thought was due to some difficult customization was really because of some extremely basic thing ha ha.. hopefully this post prevents people from forgetting the same thing
I have unbound field and assigning file id to it, I even tried assign URL also but that is not working, please have a look at below design and code, please let me know where am doing a mistake.
<px:PXFormView runat="server" ID="frmImage2" DataSourceID="ds" DataMember="IconImage" SkinID="Preview">
<Template>
<px:PXLayoutRule ID="PXLayoutRule18" runat="server" StartColumn="true" />
<px:PXImageUploader runat="server" DataField="UsrKWJMThumbnailURL" AllowUpload="false" DataMember="IconImage" SuppressLabel="True" ID="imgViewImage12" Height="150px" Width="150px" />
</Template>
</px:PXFormView>
public PXSelect<AMProdItem> IconImage;
public virtual void iconImage()
{
foreach (AMProdItem item in Base.ProdItemRecords.Select())
{
AMProdItemExt extItems = item.GetExtension<AMProdItemExt>();
if (extItems != null)
{
if (extItems.UsrKWJMSerialNbr != null)
{
InfoSmartSearch.InfoINItemLotSerialImage infoItemLotSerialImg = PXSelectReadonly<InfoSmartSearch.InfoINItemLotSerialImage, Where<InfoSmartSearch.InfoINItemLotSerialImage.lotSerialNbr, Equal<Required<InfoSmartSearch.InfoINItemLotSerialImage.lotSerialNbr>>>>.Select(Base, extItems.UsrKWJMSerialNbr);
if (infoItemLotSerialImg != null)
{
if (!string.IsNullOrEmpty(infoItemLotSerialImg.UsrIconImageUrl))
{
NoteDoc noteDoc = PXSelectReadonly<NoteDoc, Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>>>.Select(Base, infoItemLotSerialImg.NoteID);
if (noteDoc != null)
{
UploadFile uploadFile = PXSelectReadonly<UploadFile, Where<UploadFile.fileID, Equal<Required<UploadFile.fileID>>>>.Select(Base, noteDoc.FileID);
if (uploadFile != null)
{
extItems.UsrKWJMThumbnailURL =
ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString());
}
}
}
}
}
else
{
InventoryItem invItems = PXSelectReadonly<InventoryItem, Where<InventoryItem.inventoryID, Equal<Required<InventoryItem.inventoryID>>>>.Select(Base, item.InventoryID);
if (invItems != null)
{
if (!string.IsNullOrEmpty(invItems.ImageUrl))
{
NoteDoc noteDoc = PXSelectReadonly<NoteDoc, Where<NoteDoc.noteID, Equal<Required<NoteDoc.noteID>>>>.Select(Base, invItems.NoteID);
if (noteDoc != null)
{
UploadFile uploadFile = PXSelectReadonly<UploadFile, Where<UploadFile.fileID, Equal<Required<UploadFile.fileID>>>>.Select(Base, noteDoc.FileID);
if (uploadFile != null)
{
extItems.UsrKWJMThumbnailURL =
ControlHelper.GetAttachedFileUrl(null, uploadFile.FileID.ToString());
}
}
}
}
}
}
}
}
I suggest you use PXImageView control instead of PXImageUploader.
<px:PXImageView runat="server" ID="edImage" DataField="UsrKWJMThumbnailURL" />
Also test with an absolute URL first like this one:
https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png
I tested this method and can vouch for it:
Here's the complete code of my test project:
using System;
using PX.Data;
namespace PXImageTest
{
public class TestImage : PXGraph<TestImage>
{
public PXFilter<MasterTable> MasterView;
public void MasterTable_ImageUrl_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
{
e.ReturnValue = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
}
[Serializable]
public class MasterTable : IBqlTable
{
public abstract class imageUrl : IBqlField { }
[PXUIField(DisplayName = "Image")]
[PXDBString(255, IsUnicode = true)]
public virtual String ImageUrl { get; set; }
}
}
}
ASPX:
<%# Page Language="C#" MasterPageFile="~/MasterPages/FormView.master" AutoEventWireup="true" ValidateRequest="false" CodeFile="ZZ999999.aspx.cs" Inherits="Page_ZZ999999" Title="Untitled Page" %>
<%# MasterType VirtualPath="~/MasterPages/FormView.master" %>
<asp:Content ID="cont1" ContentPlaceHolderID="phDS" Runat="Server">
<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%"
TypeName="PXImageTest.TestImage"
PrimaryView="MasterView">
<CallbackCommands>
</CallbackCommands>
</px:PXDataSource>
</asp:Content>
<asp:Content ID="cont2" ContentPlaceHolderID="phF" Runat="Server">
<px:PXFormView ID="form" runat="server" DataSourceID="ds" DataMember="MasterView" Width="100%" AllowAutoHide="false">
<Template>
<px:PXLayoutRule runat="server" StartRow="True" ID="PXLayoutRule1" />
<px:PXImageView runat="server" DataField="ImageUrl" ID="edImage" Style='left:9px;top:9px;Position:absolute;' />
</Template>
<AutoSize Container="Window" Enabled="True" MinHeight="200" ></AutoSize>
</px:PXFormView>
</asp:Content>