I saw a question about how to extend [DevEx]’ ComboBoxEdit control to include spin down and up buttons in their forums. The buttons should cycle through available items. I thought I could easily create such a control and here it is in all its glory:
Note the two added spin buttons at the right side.
Now, let’s test it. Here is my test data:
Clicking on left spin button will set the first value:
Next click on the same button will move the selection forward:
and so on.
And here is the required code
using System;
using System.Collections.Generic;
using System.Text;
using DevExpress.XtraEditors.Repository;
using System.Drawing;
using DevExpress.XtraEditors.Registrator;
using DevExpress.XtraEditors;
using System.ComponentModel;
using DevExpress.XtraEditors.Controls;
using System.Collections;
namespace Righthand.Editors
{
public class RepositoryItemSpinComboEdit : RepositoryItemComboBox
{
static RepositoryItemSpinComboEdit() { }
public const string SpinComboEditName = "SpinComboEdit";
public override string EditorTypeName { get { return SpinComboEditName; } }
public override void CreateDefaultButton()
{
base.CreateDefaultButton();
Buttons.Clear();
Buttons.Add(new EditorButton(ButtonPredefines.Combo));
Buttons.Add(new EditorButton(ButtonPredefines.SpinLeft));
Buttons.Add(new EditorButton(ButtonPredefines.SpinRight));
}
public static void RegisterSpinComboEdit()
{
//Icon representing the editor within a container editor's Designer
Image img = null;
try
{
img = null; // your image;
}
catch
{
}
EditorRegistrationInfo.Default.Editors.Add(new EditorClassInfo(SpinComboEditName,
typeof(SpinComboEdit), typeof(RepositoryItemSpinComboEdit),
typeof(DevExpress.XtraEditors.ViewInfo.ComboBoxViewInfo),
new DevExpress.XtraEditors.Drawing.ButtonEditPainter(), true, img));
}
}
public class SpinComboEdit: ComboBoxEdit
{
static SpinComboEdit() { RepositoryItemSpinComboEdit.RegisterSpinComboEdit(); }
public SpinComboEdit()
{
Properties.ButtonClick += new ButtonPressedEventHandler(Properties_ButtonClick);
}
void Properties_ButtonClick(object sender, ButtonPressedEventArgs e)
{
if (e.Button.Index == 1)
MoveSelection(1);
else if (e.Button.Index == 2)
MoveSelection(-1);
}
private void MoveSelection(int index)
{
int? indexOfItem = null;
if (EditValue != null)
{
indexOfItem = Properties.Items.IndexOf(EditValue);
}
int newIndex = -1;
if (indexOfItem.HasValue)
newIndex = Math.Max(Math.Min(indexOfItem.Value+index, Properties.Items.Count - 1), 0);
else if (index > 0 && Properties.Items.Count > 0)
newIndex = 0;
EditValue = Properties.Items[newIndex];
}
public override string EditorTypeName
{
get { return RepositoryItemSpinComboEdit.SpinComboEditName; }
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public new RepositoryItemSpinComboEdit Properties
{
get { return base.Properties as RepositoryItemSpinComboEdit; }
}
}
}
Most of the code is required to derive my SpinComboEdit control out of [DevEx]’ provided ComboBoxEdit control (see 7.2 help file topic Editor Features/01.Editor Structure/Custom Editors – or previous version help file, just this link won’t work).
Points of interests are CreateDefaultButton() method where I create default buttons, SpinComboEdit() constructor where I attach to Properties.ButtonClick event and MoveSelection(int index) method where I actually move the selection forth and back. It should be pretty straightforward to understand.
I hope you’ll find this sample useful and take note that this code can and should be further improved as it was a quickly built with demo purposes in mind.