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.
Implementation Details
- 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 standardLookupPropertyEditor
in WinForms XAF applications. - The
LookUpEditEx
andRepositoryItemLookUpEditEx
classes implement a control for this Property Editor. This control is inherited from theLookUpEdit
class and extends it with additional features required for the Property Editor.
Additional Information
- 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. - 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
- Implement Custom Property Editors
- PropertyEditors.Lookup - How to provide alternative data representations for reference lookup properties (e.g., a simple drop-down box, a complex multi-column grid, or a tree view)
Does this example address your development requirements/objectives?
(you will be redirected to DevExpress.com to submit your response)
Example Code
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; }
}
}
}
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
}
}
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
}
}
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; }
}
}
}
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
}
}
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
}
}