To reproduce: follow the steps introduced in http://www.telerik.com/help/winforms/dataentry-how-to-change-editor-to-drop-down-list.html. However, try to use the RadCheckedDropDownList instead. Use the following code snippet:
private BindingList<Model> editorDS = new BindingList<Model>();
RadCheckedDropDownList checkedDDL;
BindingSource bs;
public Form1()
{
InitializeComponent();
this.radDataEntry1.ItemInitialized += radDataEntry1_ItemInitialized;
radDataEntry1.EditorInitializing += radDataEntry1_EditorInitializing;
radDataEntry1.BindingCreating += radDataEntry1_BindingCreating;
radDataEntry1.BindingCreated += radDataEntry1_BindingCreated;
for (int i = 0; i < 15; i++)
{
editorDS.Add(new Model(i,"Item " + i));
}
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Title", typeof(string));
dt.Columns.Add("Models", typeof(BindingList<Model>));
BindingList<Model> models;
for (int i = 0; i < 5; i++)
{
models = new BindingList<Model>();
for (int j = 0; j < 2; j++)
{
models.Add(editorDS[i + j]);
}
dt.Rows.Add(i, "Item" + i, models);
}
bs = new BindingSource();
bs.DataSource = dt;
this.radBindingNavigator1.BindingSource = bs;
this.radDataEntry1.DataSource = bs;
}
void radDataEntry1_EditorInitializing(object sender, Telerik.WinControls.UI.EditorInitializingEventArgs e)
{
if (e.Property.Name == "Models")
{
checkedDDL = new RadCheckedDropDownList();
checkedDDL.DisplayMember = "Name";
checkedDDL.ValueMember = "Id";
checkedDDL.DataSource = editorDS;
checkedDDL.Parent = this;
checkedDDL.BindingContext = new System.Windows.Forms.BindingContext();
e.Editor = checkedDDL;
}
}
void radDataEntry1_BindingCreating(object sender, Telerik.WinControls.UI.BindingCreatingEventArgs e)
{
if (e.DataMember == "Models")
{
e.PropertyName = "Text";
}
}
void radDataEntry1_BindingCreated(object sender, BindingCreatedEventArgs e)
{
if (e.DataMember == "Models")
{
e.Binding.FormattingEnabled = !true;
e.Binding.Parse += Binding_Parse;
e.Binding.Format += Binding_Format;
}
}
private void Binding_Format(object sender, ConvertEventArgs e)
{
BindingList<Model> models = e.Value as BindingList<Model>;
if (models != null)
{
checkedDDL.CheckedItems.Clear();
StringBuilder sb = new StringBuilder();
foreach (Model m in models)
{
sb.Append(m.Name + ";");
}
e.Value = sb.ToString();
}
}
private void Binding_Parse(object sender, ConvertEventArgs e)
{
BindingList<Model> m = checkedDDL.DataSource as BindingList<Model>;
string[] tokens;
if (e.Value != null && m != null)
{
BindingList<Model> newValue = new BindingList<Model>();
tokens = e.Value.ToString().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string token in tokens)
{
if (m.Any(item => item.Name == token))
{
Model foundModel = m.ToList().Find(item => item.Name == token);
newValue.Add(new Model(foundModel.Id,foundModel.Name));
}
}
e.Value = newValue;
}
}
private void radDataEntry1_ItemInitialized(object sender, ItemInitializedEventArgs e)
{
if (e.Panel.Controls[1].Text == "Models")
{
e.Panel.Size = new Size(350, 25);
}
}
class Model : INotifyPropertyChanged
{
private int id;
private string name;
public Model(int id, string name)
{
this.Id = id;
this.Name = name;
}
public int Id
{
get
{
return this.id;
}
set
{
this.id = value;
this.OnPropertyChanged("Id");
}
}
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
this.OnPropertyChanged("Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
The provided gif file illustrates better the obtained behavior.
Workaround: subscribe to the RadCheckedDropDownList.Validated event and call the RadCheckedDropDownList.DataBindings[0].WriteValue method. Thus, the Parse event will be fired and you can convert the input data to the appropriate format.