Example E1101
Visible to All Users

XAF WinForms - How to use a custom Lookup Property Editor control for reference properties

Note
The description of this example is currently under construction and may not match the code in the example. We are currently working to provide you with up-to-date content.

Scenario

This example demonstrates a simple drop-down editor for reference properties. The editor provides the Open, Add and Clear buttons.

Custom Lookup

Implementation Details

  1. The Editors.Win module implements a reusable LookupPropertyEditorEx class. This is an XAF Property Editor that can be used for reference properties instead of the standard LookupPropertyEditor in WinForms XAF applications.
  2. The LookUpEditEx and RepositoryItemLookUpEditEx classes implement a control for this Property Editor. This control is inherited from the LookUpEdit class and extends it with additional features required for the Property Editor.

Additional Information

  1. From this example, you need use only one assembly (the WinSolution from the example is just a demo application, and it has no relation to the solution): Editors.Win.dll.
    Since this is a regular XAF module, you should add this module to your application to be able to use its features. In case of standard modules, you add them from the Toolbox via the Application or Module designer. Since we deal with a custom module, you should add this into the Toolbox manually. For additional information, refer to the following article: To add a tool to the toolbox.
    Alternatively, you can take the source code and include it in your solution.
  2. The LookupPropertyEditorEx is set as default for all lookup properties in the application.
    If you want to change this, then invoke the Model Editor for the Windows Forms application project or module, and change the EditorType property of the DetailViewItems | PropertyEditors | LookupProperty node. Or change the PropertyEditorType property for a class member, List View column or Detail View item nodes individually.

Files to Review (XPO)

Files to Review (EF Core)

Documentation

Does this example address your development requirements/objectives?

(you will be redirected to DevExpress.com to submit your response)

Example Code

XPO/Editors.Win/LookupPropertyEditorEx.cs
C#
using System; using System.Collections; using DevExpress.ExpressApp; using DevExpress.ExpressApp.Model; using DevExpress.ExpressApp.Editors; using DevExpress.XtraEditors.Controls; using DevExpress.ExpressApp.Win.Editors; using DevExpress.XtraEditors.Repository; using DevExpress.ExpressApp.Utils; namespace Editors.Win { [PropertyEditor(typeof(object), EditorAliases.LookupPropertyEditor, false)] public class LookupPropertyEditorEx : DXPropertyEditor, IComplexViewItem { private const string AddButtonTag = "AddButtonTag"; private const string MinusButtonTag = "MinusButtonTag"; private const string OpenButtonTag = "OpenButtonTag"; private LookupEditorHelper helperCore; private View lookupObjectView; public LookupPropertyEditorEx(Type objectType, IModelMemberViewItem item) : base(objectType, item) { } void IComplexViewItem.Setup(IObjectSpace objectSpace, XafApplication application) { if(this.helperCore == null) { this.helperCore = new LookupEditorHelper(application, objectSpace, MemberInfo.MemberTypeInfo, Model); } this.helperCore.SetObjectSpace(objectSpace); this.helperCore.ObjectSpace.Reloaded += ObjectSpace_Reloaded; } protected override void Dispose(bool disposing) { try { if(disposing) { if(this.helperCore != null && this.helperCore.ObjectSpace != null) { this.helperCore.ObjectSpace.Reloaded -= ObjectSpace_Reloaded; this.helperCore = null; } lookupObjectView = null; } } finally { base.Dispose(disposing); } } protected override object CreateControlCore() { return new LookUpEditEx(); } protected override RepositoryItem CreateRepositoryItem() { return new RepositoryItemLookUpEditEx(); } protected override void SetupRepositoryItem(RepositoryItem item) { base.SetupRepositoryItem(item); RepositoryItemLookUpEditEx properties = (RepositoryItemLookUpEditEx)item; properties.Init(DisplayFormat, helperCore); properties.Enter += properties_Enter; properties.ButtonClick += properties_ButtonClick; properties.EditValueChanged += properties_EditValueChanged; properties.Closed += properties_Closed; properties.Disposed += properties_Disposed; EditorButton openButton = new EditorButton(ButtonPredefines.Ellipsis); openButton.Tag = OpenButtonTag; openButton.Enabled = AllowEdit.ResultValue; openButton.ToolTip = CaptionHelper.GetLocalizedText("Controls/LookupPropertyEditorEx", "OpenButtonToolTip"); properties.Buttons.Add(openButton); EditorButton addButton = new EditorButton(ButtonPredefines.Plus); addButton.Tag = AddButtonTag; addButton.Enabled = AllowEdit.ResultValue; addButton.ToolTip = CaptionHelper.GetLocalizedText("Controls/LookupPropertyEditorEx", "AddButtonToolTip"); properties.Buttons.Add(addButton); EditorButton minusButton = new EditorButton(ButtonPredefines.Minus); minusButton.Tag = MinusButtonTag; minusButton.Enabled = AllowEdit.ResultValue; minusButton.ToolTip = CaptionHelper.GetLocalizedText("Controls/LookupPropertyEditorEx", "MinusButtonToolTip"); properties.Buttons.Add(minusButton); } private void properties_Disposed(object sender, EventArgs e) { RepositoryItemLookUpEditEx properties = (RepositoryItemLookUpEditEx)sender; properties.Enter -= properties_Enter; properties.ButtonClick -= properties_ButtonClick; properties.EditValueChanged -= properties_EditValueChanged; properties.Disposed -= properties_Disposed; properties.Closed -= properties_Closed; } private void properties_EditValueChanged(object sender, EventArgs e) { LookUpEditEx lookup = (LookUpEditEx)sender; UpdateButtons(lookup); } private void properties_Closed(object sender, ClosedEventArgs e) { LookUpEditEx lookup = (LookUpEditEx)sender; UpdateButtons(lookup); } private void properties_Enter(object sender, EventArgs e) { LookUpEditEx lookup = (LookUpEditEx)sender; InitializeDataSource(lookup); UpdateButtons(lookup); } private void UpdateButtons(LookUpEditEx lookup) { if (!lookup.IsPopupOpen) { bool enabled = (lookup.EditValue != null) && (lookup.EditValue != DBNull.Value); lookup.Properties.Buttons[1].Enabled = enabled; lookup.Properties.Buttons[3].Enabled = enabled; } } protected virtual void InitializeDataSource(LookUpEditEx lookup) { if(lookup != null && lookup.Properties != null && lookup.Properties.Helper != null) { lookup.InitializeDataSource(); } } private void ObjectSpace_Reloaded(object sender, EventArgs e) { InitializeDataSource(Control); } private void properties_ButtonClick(object sender, ButtonPressedEventArgs e) { LookUpEditEx lookup = (LookUpEditEx)sender; string tag = Convert.ToString(e.Button.Tag); if(tag == OpenButtonTag) { OpenCurrentObject(lookup); } if(tag == MinusButtonTag) { ClearCurrentObject(lookup); } if(tag == AddButtonTag) { AddNewObject(lookup); } } protected virtual void OpenCurrentObject(LookUpEditEx lookup) { IObjectSpace openObjectViewObjectSpace = lookup.Properties.Helper.Application.CreateObjectSpace(lookup.Properties.Helper.LookupObjectTypeInfo.Type); object targetObject = openObjectViewObjectSpace.GetObject(lookup.EditValue); if(targetObject != null) { EventHandler committedEventHandler = (s, e) => { if(lookupObjectView != null) { lookup.EditValue = lookup.Properties.Helper.ObjectSpace.GetObject(lookupObjectView.CurrentObject); } }; EventHandler disposedEventHandler = null; disposedEventHandler = (s, e) => { IObjectSpace os = (IObjectSpace)s; os.Disposed -= disposedEventHandler; os.Committed -= committedEventHandler; }; openObjectViewObjectSpace.Committed += committedEventHandler; openObjectViewObjectSpace.Disposed += disposedEventHandler; lookupObjectView = lookup.Properties.Helper.Application.CreateDetailView(openObjectViewObjectSpace, targetObject, true); lookup.Properties.Helper.Application.ShowViewStrategy.ShowViewInPopupWindow(lookupObjectView); } } protected virtual void ClearCurrentObject(LookUpEditEx lookup) { lookup.EditValue = null; DevExpress.ExpressApp.Win.Core.BindingHelper.EndCurrentEdit(lookup); } protected virtual void AddNewObject(LookUpEditEx lookup) { IObjectSpace newObjectViewObjectSpace = lookup.Properties.Helper.Application.CreateObjectSpace(lookup.Properties.Helper.LookupObjectTypeInfo.Type); object newObject = newObjectViewObjectSpace.CreateObject(lookup.Properties.Helper.LookupObjectTypeInfo.Type); lookupObjectView = lookup.Properties.Helper.Application.CreateDetailView(newObjectViewObjectSpace, newObject, true); EventHandler committedEventHandler = (s, e) => { lookup.EditValue = lookup.Properties.Helper.ObjectSpace.GetObject(lookupObjectView.CurrentObject); if(lookup.Properties.DataSource != null) { ((IList)lookup.Properties.DataSource).Add(lookup.EditValue); } }; EventHandler disposedEventHandler = null; disposedEventHandler = (s, e) => { IObjectSpace os = (IObjectSpace)s; os.Disposed -= disposedEventHandler; os.Committed -= committedEventHandler; }; newObjectViewObjectSpace.Committed += committedEventHandler; newObjectViewObjectSpace.Disposed += disposedEventHandler; lookup.Properties.Helper.Application.ShowViewStrategy.ShowViewInPopupWindow(lookupObjectView); } public LookupEditorHelper Helper { get { return helperCore; } } public new LookUpEditEx Control { get { return (LookUpEditEx)base.Control; } } } }
XPO/Editors.Win/LookUpEditEx.cs
C#
using System; using System.ComponentModel; using DevExpress.ExpressApp.Win.Core; using DevExpress.ExpressApp.Localization; namespace Editors.Win { [ToolboxItem(false)] public class LookUpEditEx : DevExpress.XtraEditors.LookUpEdit, IGridInplaceEdit { private object gridEditingObject; static LookUpEditEx() { RepositoryItemLookUpEditEx.Register(); } public LookUpEditEx() { base.DataBindings.CollectionChanged += DataBindings_CollectionChanged; } protected override void Dispose(bool disposing) { if(disposing) { base.DataBindings.CollectionChanged -= DataBindings_CollectionChanged; } base.Dispose(disposing); } public override string EditorTypeName { get { return RepositoryItemLookUpEditEx.EditorName; } } public new RepositoryItemLookUpEditEx Properties { get { return (RepositoryItemLookUpEditEx)base.Properties; } } public override object EditValue { get { return base.EditValue; } set { if(value != DBNull.Value && value != null) { if(!Properties.Helper.LookupObjectType.IsInstanceOfType(value)) { if(Properties.ThrowExceptionOnInvalidLookUpEditValueType) { throw new InvalidCastException(SystemExceptionLocalizer.GetExceptionMessage(ExceptionId.UnableToCast, value.GetType(), Properties.Helper.LookupObjectType)); } else { base.EditValue = null; return; } } } base.EditValue = value; } } public object FindEditingObject() { return BindingHelper.FindEditingObject(this); } private void OnEditingObjectChanged() { InitializeDataSource(); if(FindEditingObject() == null && EditValue != null) { EditValue = null; } } public void InitializeDataSource() { if(Properties != null && Properties.Helper != null) { Properties.DataSource = Properties.Helper.CreateCollectionSource(FindEditingObject()).List; } } private void DataBindings_CollectionChanged(object sender, CollectionChangeEventArgs e) { OnEditingObjectChanged(); } public new void UpdateDisplayText() { base.UpdateDisplayText(); base.Refresh(); } #region IGridInplaceEdit Members System.Windows.Forms.ControlBindingsCollection IGridInplaceEdit.DataBindings { get { return base.DataBindings; } } object IGridInplaceEdit.GridEditingObject { get { return gridEditingObject; } set { if(gridEditingObject != value) { gridEditingObject = value; OnEditingObjectChanged(); } } } #endregion } }
XPO/Editors.Win/RepositoryItemLookUpEditEx.cs
C#
using System; using DevExpress.Utils; using DevExpress.Accessibility; using DevExpress.ExpressApp.Utils; using DevExpress.ExpressApp.Editors; using DevExpress.XtraEditors.Drawing; using DevExpress.ExpressApp.Win.Core; using DevExpress.XtraEditors.ViewInfo; using DevExpress.XtraEditors.Controls; using DevExpress.XtraEditors.Repository; using DevExpress.XtraEditors.Registrator; namespace Editors.Win { public class RepositoryItemLookUpEditEx : DevExpress.XtraEditors.Repository.RepositoryItemLookUpEdit, ILookupEditRepositoryItem { internal const string EditorName = "LookUpEditEx"; private LookupEditorHelper helper; static RepositoryItemLookUpEditEx() { Register(); } public RepositoryItemLookUpEditEx() { } public static void Register() { if(!EditorRegistrationInfo.Default.Editors.Contains(EditorName)) { EditorRegistrationInfo.Default.Editors.Add(new EditorClassInfo(EditorName, typeof(LookUpEditEx), typeof(RepositoryItemLookUpEditEx), typeof(LookUpEditViewInfo), new ButtonEditPainter(), true, EditImageIndexes.LookUpEdit, typeof(PopupEditAccessible))); } } public override string EditorTypeName { get { return EditorName; } } public new LookUpEditEx OwnerEdit { get { return (LookUpEditEx)base.OwnerEdit; } } public LookupEditorHelper Helper { get { return helper; } } public void Init(string displayFormat, LookupEditorHelper helper) { this.helper = helper; BeginUpdate(); DisplayFormat.FormatString = displayFormat; DisplayFormat.FormatType = FormatType.Custom; EditFormat.FormatString = displayFormat; EditFormat.FormatType = FormatType.Custom; TextEditStyle = TextEditStyles.Standard; ExportMode = ExportMode.DisplayText; DisplayMember = ((ILookupEditRepositoryItem)this).DisplayMember; ValueMember = null; ShowHeader = false; DropDownRows = helper.SmallCollectionItemCount; SearchMode = SearchMode.AutoFilter; NullText = CaptionHelper.NullValueText; AllowNullInput = DefaultBoolean.True; EndUpdate(); } public override string GetDisplayText(FormatInfo format, object editValue) { string result = base.GetDisplayText(format, editValue); if(string.IsNullOrEmpty(result) && editValue != null && helper != null) { result = helper.GetDisplayText(editValue, NullText, format.FormatString); } return result; } public override void Assign(RepositoryItem item) { RepositoryItemLookUpEditEx source = (RepositoryItemLookUpEditEx)item; try { base.Assign(source); } catch { } helper = source.helper; ThrowExceptionOnInvalidLookUpEditValueType = source.ThrowExceptionOnInvalidLookUpEditValueType; } #region ILookupEditRepositoryItem Members Type ILookupEditRepositoryItem.LookupObjectType { get { return helper.LookupObjectType; } } string ILookupEditRepositoryItem.DisplayMember { get { return helper.DisplayMember != null ? helper.DisplayMember.Name : string.Empty; } } #endregion } }
EFCore/Editors.Win/LookupPropertyEditorEx.cs
C#
using System; using System.Collections; using DevExpress.ExpressApp; using DevExpress.ExpressApp.Model; using DevExpress.ExpressApp.Editors; using DevExpress.XtraEditors.Controls; using DevExpress.ExpressApp.Win.Editors; using DevExpress.XtraEditors.Repository; using DevExpress.ExpressApp.Utils; namespace Editors.Win { [PropertyEditor(typeof(object), EditorAliases.LookupPropertyEditor, false)] public class LookupPropertyEditorEx : DXPropertyEditor, IComplexViewItem { private const string AddButtonTag = "AddButtonTag"; private const string MinusButtonTag = "MinusButtonTag"; private const string OpenButtonTag = "OpenButtonTag"; private LookupEditorHelper helperCore; private DevExpress.ExpressApp.View lookupObjectView; public LookupPropertyEditorEx(Type objectType, IModelMemberViewItem item) : base(objectType, item) { } void IComplexViewItem.Setup(IObjectSpace objectSpace, XafApplication application) { if(this.helperCore == null) { this.helperCore = new LookupEditorHelper(application, objectSpace, MemberInfo.MemberTypeInfo, Model); } this.helperCore.SetObjectSpace(objectSpace); this.helperCore.ObjectSpace.Reloaded += ObjectSpace_Reloaded; } protected override void Dispose(bool disposing) { try { if(disposing) { if(this.helperCore != null && this.helperCore.ObjectSpace != null) { this.helperCore.ObjectSpace.Reloaded -= ObjectSpace_Reloaded; this.helperCore = null; } lookupObjectView = null; } } finally { base.Dispose(disposing); } } protected override object CreateControlCore() { return new LookUpEditEx(); } protected override RepositoryItem CreateRepositoryItem() { return new RepositoryItemLookUpEditEx(); } protected override void SetupRepositoryItem(RepositoryItem item) { base.SetupRepositoryItem(item); RepositoryItemLookUpEditEx properties = (RepositoryItemLookUpEditEx)item; properties.Init(DisplayFormat, helperCore); properties.Enter += properties_Enter; properties.ButtonClick += properties_ButtonClick; properties.EditValueChanged += properties_EditValueChanged; properties.Closed += properties_Closed; properties.Disposed += properties_Disposed; EditorButton openButton = new EditorButton(ButtonPredefines.Ellipsis); openButton.Tag = OpenButtonTag; openButton.Enabled = AllowEdit.ResultValue; openButton.ToolTip = CaptionHelper.GetLocalizedText("Controls/LookupPropertyEditorEx", "OpenButtonToolTip"); properties.Buttons.Add(openButton); EditorButton addButton = new EditorButton(ButtonPredefines.Plus); addButton.Tag = AddButtonTag; addButton.Enabled = AllowEdit.ResultValue; addButton.ToolTip = CaptionHelper.GetLocalizedText("Controls/LookupPropertyEditorEx", "AddButtonToolTip"); properties.Buttons.Add(addButton); EditorButton minusButton = new EditorButton(ButtonPredefines.Minus); minusButton.Tag = MinusButtonTag; minusButton.Enabled = AllowEdit.ResultValue; minusButton.ToolTip = CaptionHelper.GetLocalizedText("Controls/LookupPropertyEditorEx", "MinusButtonToolTip"); properties.Buttons.Add(minusButton); } private void properties_Disposed(object sender, EventArgs e) { RepositoryItemLookUpEditEx properties = (RepositoryItemLookUpEditEx)sender; properties.Enter -= properties_Enter; properties.ButtonClick -= properties_ButtonClick; properties.EditValueChanged -= properties_EditValueChanged; properties.Disposed -= properties_Disposed; properties.Closed -= properties_Closed; } private void properties_EditValueChanged(object sender, EventArgs e) { LookUpEditEx lookup = (LookUpEditEx)sender; UpdateButtons(lookup); } private void properties_Closed(object sender, ClosedEventArgs e) { LookUpEditEx lookup = (LookUpEditEx)sender; UpdateButtons(lookup); } private void properties_Enter(object sender, EventArgs e) { LookUpEditEx lookup = (LookUpEditEx)sender; InitializeDataSource(lookup); UpdateButtons(lookup); } private void UpdateButtons(LookUpEditEx lookup) { if (!lookup.IsPopupOpen) { bool enabled = (lookup.EditValue != null) && (lookup.EditValue != DBNull.Value); lookup.Properties.Buttons[1].Enabled = enabled; lookup.Properties.Buttons[3].Enabled = enabled; } } protected virtual void InitializeDataSource(LookUpEditEx lookup) { if(lookup != null && lookup.Properties != null && lookup.Properties.Helper != null) { lookup.InitializeDataSource(); } } private void ObjectSpace_Reloaded(object sender, EventArgs e) { InitializeDataSource(Control); } private void properties_ButtonClick(object sender, ButtonPressedEventArgs e) { LookUpEditEx lookup = (LookUpEditEx)sender; string tag = Convert.ToString(e.Button.Tag); if(tag == OpenButtonTag) { OpenCurrentObject(lookup); } if(tag == MinusButtonTag) { ClearCurrentObject(lookup); } if(tag == AddButtonTag) { AddNewObject(lookup); } } protected virtual void OpenCurrentObject(LookUpEditEx lookup) { IObjectSpace openObjectViewObjectSpace = lookup.Properties.Helper.Application.CreateObjectSpace(lookup.Properties.Helper.LookupObjectTypeInfo.Type); object targetObject = openObjectViewObjectSpace.GetObject(lookup.EditValue); if(targetObject != null) { EventHandler committedEventHandler = (s, e) => { if(lookupObjectView != null) { lookup.EditValue = lookup.Properties.Helper.ObjectSpace.GetObject(lookupObjectView.CurrentObject); } }; EventHandler disposedEventHandler = null; disposedEventHandler = (s, e) => { IObjectSpace os = (IObjectSpace)s; os.Disposed -= disposedEventHandler; os.Committed -= committedEventHandler; }; openObjectViewObjectSpace.Committed += committedEventHandler; openObjectViewObjectSpace.Disposed += disposedEventHandler; lookupObjectView = lookup.Properties.Helper.Application.CreateDetailView(openObjectViewObjectSpace, targetObject, true); lookup.Properties.Helper.Application.ShowViewStrategy.ShowViewInPopupWindow(lookupObjectView); } } protected virtual void ClearCurrentObject(LookUpEditEx lookup) { lookup.EditValue = null; DevExpress.ExpressApp.Win.Core.BindingHelper.EndCurrentEdit(lookup); } protected virtual void AddNewObject(LookUpEditEx lookup) { IObjectSpace newObjectViewObjectSpace = lookup.Properties.Helper.Application.CreateObjectSpace(lookup.Properties.Helper.LookupObjectTypeInfo.Type); object newObject = newObjectViewObjectSpace.CreateObject(lookup.Properties.Helper.LookupObjectTypeInfo.Type); lookupObjectView = lookup.Properties.Helper.Application.CreateDetailView(newObjectViewObjectSpace, newObject, true); EventHandler committedEventHandler = (s, e) => { lookup.EditValue = lookup.Properties.Helper.ObjectSpace.GetObject(lookupObjectView.CurrentObject); if(lookup.Properties.DataSource != null) { ((IList)lookup.Properties.DataSource).Add(lookup.EditValue); } }; EventHandler disposedEventHandler = null; disposedEventHandler = (s, e) => { IObjectSpace os = (IObjectSpace)s; os.Disposed -= disposedEventHandler; os.Committed -= committedEventHandler; }; newObjectViewObjectSpace.Committed += committedEventHandler; newObjectViewObjectSpace.Disposed += disposedEventHandler; lookup.Properties.Helper.Application.ShowViewStrategy.ShowViewInPopupWindow(lookupObjectView); } public LookupEditorHelper Helper { get { return helperCore; } } public new LookUpEditEx Control { get { return (LookUpEditEx)base.Control; } } } }
EFCore/Editors.Win/LookUpEditEx.cs
C#
using System; using System.ComponentModel; using DevExpress.ExpressApp.Win.Core; using DevExpress.ExpressApp.Localization; namespace Editors.Win { [ToolboxItem(false)] public class LookUpEditEx : DevExpress.XtraEditors.LookUpEdit, IGridInplaceEdit { private object gridEditingObject; static LookUpEditEx() { RepositoryItemLookUpEditEx.Register(); } public LookUpEditEx() { base.DataBindings.CollectionChanged += DataBindings_CollectionChanged; } protected override void Dispose(bool disposing) { if(disposing) { base.DataBindings.CollectionChanged -= DataBindings_CollectionChanged; } base.Dispose(disposing); } public override string EditorTypeName { get { return RepositoryItemLookUpEditEx.EditorName; } } public new RepositoryItemLookUpEditEx Properties { get { return (RepositoryItemLookUpEditEx)base.Properties; } } public override object EditValue { get { return base.EditValue; } set { if(value != DBNull.Value && value != null) { if(!Properties.Helper.LookupObjectType.IsInstanceOfType(value)) { if(Properties.ThrowExceptionOnInvalidLookUpEditValueType) { throw new InvalidCastException(SystemExceptionLocalizer.GetExceptionMessage(ExceptionId.UnableToCast, value.GetType(), Properties.Helper.LookupObjectType)); } else { base.EditValue = null; return; } } } base.EditValue = value; } } public object FindEditingObject() { return BindingHelper.FindEditingObject(this); } private void OnEditingObjectChanged() { InitializeDataSource(); if(FindEditingObject() == null && EditValue != null) { EditValue = null; } } public void InitializeDataSource() { if(Properties != null && Properties.Helper != null) { Properties.DataSource = Properties.Helper.CreateCollectionSource(FindEditingObject()).List; } } private void DataBindings_CollectionChanged(object sender, CollectionChangeEventArgs e) { OnEditingObjectChanged(); } public new void UpdateDisplayText() { base.UpdateDisplayText(); base.Refresh(); } #region IGridInplaceEdit Members System.Windows.Forms.ControlBindingsCollection IGridInplaceEdit.DataBindings { get { return base.DataBindings; } } object IGridInplaceEdit.GridEditingObject { get { return gridEditingObject; } set { if(gridEditingObject != value) { gridEditingObject = value; OnEditingObjectChanged(); } } } #endregion } }
EFCore/Editors.Win/RepositoryItemLookUpEditEx.cs
C#
using System; using DevExpress.Utils; using DevExpress.Accessibility; using DevExpress.ExpressApp.Utils; using DevExpress.ExpressApp.Editors; using DevExpress.XtraEditors.Drawing; using DevExpress.ExpressApp.Win.Core; using DevExpress.XtraEditors.ViewInfo; using DevExpress.XtraEditors.Controls; using DevExpress.XtraEditors.Repository; using DevExpress.XtraEditors.Registrator; namespace Editors.Win { public class RepositoryItemLookUpEditEx : DevExpress.XtraEditors.Repository.RepositoryItemLookUpEdit, ILookupEditRepositoryItem { internal const string EditorName = "LookUpEditEx"; private LookupEditorHelper helper; static RepositoryItemLookUpEditEx() { Register(); } public RepositoryItemLookUpEditEx() { } public static void Register() { if(!EditorRegistrationInfo.Default.Editors.Contains(EditorName)) { EditorRegistrationInfo.Default.Editors.Add(new EditorClassInfo(EditorName, typeof(LookUpEditEx), typeof(RepositoryItemLookUpEditEx), typeof(LookUpEditViewInfo), new ButtonEditPainter(), true, EditImageIndexes.LookUpEdit, typeof(PopupEditAccessible))); } } public override string EditorTypeName { get { return EditorName; } } public new LookUpEditEx OwnerEdit { get { return (LookUpEditEx)base.OwnerEdit; } } public LookupEditorHelper Helper { get { return helper; } } public void Init(string displayFormat, LookupEditorHelper helper) { this.helper = helper; BeginUpdate(); DisplayFormat.FormatString = displayFormat; DisplayFormat.FormatType = FormatType.Custom; EditFormat.FormatString = displayFormat; EditFormat.FormatType = FormatType.Custom; TextEditStyle = TextEditStyles.Standard; ExportMode = ExportMode.DisplayText; DisplayMember = ((ILookupEditRepositoryItem)this).DisplayMember; ValueMember = null; ShowHeader = false; DropDownRows = helper.SmallCollectionItemCount; SearchMode = SearchMode.AutoFilter; NullText = CaptionHelper.NullValueText; AllowNullInput = DefaultBoolean.True; EndUpdate(); } public override string GetDisplayText(FormatInfo format, object editValue) { string result = base.GetDisplayText(format, editValue); if(string.IsNullOrEmpty(result) && editValue != null && helper != null) { result = helper.GetDisplayText(editValue, NullText, format.FormatString); } return result; } public override void Assign(RepositoryItem item) { RepositoryItemLookUpEditEx source = (RepositoryItemLookUpEditEx)item; try { base.Assign(source); } catch { } helper = source.helper; ThrowExceptionOnInvalidLookUpEditValueType = source.ThrowExceptionOnInvalidLookUpEditValueType; } #region ILookupEditRepositoryItem Members Type ILookupEditRepositoryItem.LookupObjectType { get { return helper.LookupObjectType; } } string ILookupEditRepositoryItem.DisplayMember { get { return helper.DisplayMember != null ? helper.DisplayMember.Name : string.Empty; } } #endregion } }

Disclaimer: The information provided on DevExpress.com and affiliated web properties (including the DevExpress Support Center) is provided "as is" without warranty of any kind. Developer Express Inc disclaims all warranties, either express or implied, including the warranties of merchantability and fitness for a particular purpose. Please refer to the DevExpress.com Website Terms of Use for more information in this regard.

Confidential Information: Developer Express Inc does not wish to receive, will not act to procure, nor will it solicit, confidential or proprietary materials and information from you through the DevExpress Support Center or its web properties. Any and all materials or information divulged during chats, email communications, online discussions, Support Center tickets, or made available to Developer Express Inc in any manner will be deemed NOT to be confidential by Developer Express Inc. Please refer to the DevExpress.com Website Terms of Use for more information in this regard.