At the moment when the control receives the focus the text gets selected. if the AllowShowFocusCues property is set to true and the DropDownStyle is set to DropDownList the focus cues should be painted similarly as in RadDropDownList this.radMultiColumnComboBox1.AllowShowFocusCues = true; this.radMultiColumnComboBox1.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDownList;
Workaround: 1. Position the RadMultiColumnComboBox control and instead of setting the Dock property to Fill, anchor the it on all four sides. Alternatively: 2. Set the Dock property to Fill, but also set a MinimumSize of the column defining a height
To reproduce:
this.radMultiColumnComboBox1.DataSource = this.customersBindingSource;
this.radMultiColumnComboBox1.DisplayMember = "CustomerID";
this.radMultiColumnComboBox1.AutoFilter = true;
FilterDescriptor filter = new FilterDescriptor();
filter.PropertyName = this.radMultiColumnComboBox1.DisplayMember;
filter.Operator = FilterOperator.Contains;
this.radMultiColumnComboBox1.EditorControl.MasterTemplate.FilterDescriptors.Add(filter);
1. Click the dropdown button, verify that all items list on drop down
2. Type into the textbox so only one item is left( e.g. "BERGS" )
3. While the drop-down is still opened, click the arrow button.
4. Focus another control on the form and then when the user clicks the arrow button, only one item is still shown in the drop down.
Workaround:
private void radMultiColumnComboBox1_DropDownClosed(object sender, RadPopupClosedEventArgs args)
{
this.radMultiColumnComboBox1.EditorControl.MasterTemplate.Refresh();
}
To reproduce:
- Add a GridViewMultiComboBoxColumn to a grid with wide columns.
- Call the following code in the CellEditorInitialized event handler
editor.EditorControl.LoadElementTree();
editor.AutoSizeDropDownHeight = true;
editor.AutoSizeDropDownColumnMode = BestFitColumnMode.AllCells;
editor.BestFitColumns(true, true);
- The drop down still has a horizontal scrollbar.
Workaround:
editor.EditorControl.BestFitColumns(BestFitColumnMode.AllCells);
int desiredWidth = 0;
foreach (GridViewColumn column in editor.EditorControl.TableElement.ViewElement.RowLayout.RenderColumns)
{
desiredWidth += column.Width + editor.EditorControl.TableElement.CellSpacing;
desiredWidth -= editor.EditorControl.TableElement.CellSpacing;
}
editor.DropDownWidth = desiredWidth + 20;//20 in case the vertical scroll appears.
To reproduce: please refer to the attached sample project which result is illustrated in the attached gif file. The DropDownClosed is expected to be fired when the drop down is already closed. Hence, showing a message box shouldn't keep the drop down opened. The problem is reproducible with RadDropDownList as well. Note that this problem is not applicable for MS ComboBox. Workaround: this.radMultiColumnComboBox1.MultiColumnComboBoxElement.DropDownAnimationEnabled = false;
Currently, in RadMultiColumnComboBox, if you AutoFilter by all columns and you type a value that resides in the ID column, while the DisplayMember is the Name, pressing the Enter after typing the ID will return the Name in the textbox part which may be confusing to the user. Such a case may be solved by introducing another textbox in the drop-down part just for filtering purposes.
Currently RadMultiColumnComboBox uses exact comparison and it is not possible to change this behavior.
1. Create a project with RadGridView 2. Add a GridViewMultiComboBoxColumn 3. Attach to CellEditorInitialized event and try to handle PopupOpened event to change the popup size.
To reproduce: please refer to the attached sample project and refer to the screenshot. You will notice that initially, the arrow is a few pixels up. If you disable and then enable the RadMultiColumnComboBox again you will notice the difference.
Workaround:
private void radToggleButton1_ToggleStateChanged(object sender, Telerik.WinControls.UI.StateChangedEventArgs args)
{
ImagePrimitive img = this.radMultiColumnComboBox1.MultiColumnComboBoxElement.ArrowButton.FindDescendant<ImagePrimitive>();
img.Margin = new Padding(0);
if (args.ToggleState == Telerik.WinControls.Enumerations.ToggleState.On)
{
this.radMultiColumnComboBox1.Enabled = true;
this.radMultiColumnComboBox1.MultiColumnComboBoxElement.ArrowButton.Padding = new Padding(0);
}
else
{
this.radMultiColumnComboBox1.Enabled = false;
}
}
To reproduce: please refer to the attached sample project and try to enter some numeric value or clear the existing one. Then open the popup.
Workaround: use the custom filtering that RadGridView offers http://docs.telerik.com/devtools/winforms/gridview/filtering/custom-filtering
this.radMultiColumnComboBox1.AutoFilter = true;
FilterDescriptor filter = new FilterDescriptor();
filter.PropertyName = this.radMultiColumnComboBox1.DisplayMember;
filter.Operator = FilterOperator.Contains;
this.radMultiColumnComboBox1.EditorControl.MasterTemplate.FilterDescriptors.Add(filter);
this.radMultiColumnComboBox1.EditorControl.EnableCustomFiltering = true;
this.radMultiColumnComboBox1.EditorControl.CustomFiltering += EditorControl_CustomFiltering;
string search = string.Empty;
private void EditorControl_CustomFiltering(object sender, Telerik.WinControls.UI.GridViewCustomFilteringEventArgs e)
{
search = this.radMultiColumnComboBox1.MultiColumnComboBoxElement.EditorElement.Text;
if (search != string.Empty)
{
e.Handled = true;
e.Visible = e.Row.Cells[this.radMultiColumnComboBox1.DisplayMember].Value.ToString().Contains(search);
}
else
{
e.Handled = false;
}
}
To reproduce:
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Description");
dt.Rows.Add(new object[] { "0", "Low" });
dt.Rows.Add(new object[] { "1", "Medium" });
dt.Rows.Add(new object[] { "2", "High" });
radMultiColumnComboBox1.DisplayMember = "ID";
radMultiColumnComboBox1.ValueMember = "ID";
radMultiColumnComboBox1.DataSource = dt;
radMultiColumnComboBox1.SelectedValue = "1";
this.radMultiColumnComboBox1.SelectedValueChanged+=radMultiColumnComboBox1_SelectedValueChanged;
private void radMultiColumnComboBox1_SelectedValueChanged(object sender, EventArgs e)
{
Console.WriteLine(this.radMultiColumnComboBox1.SelectedValue);
}
If you type 2 in the editable part, the SelectedValue is not changed as in the previous version.
Workaround:
public class MyRadMultiColumnComboBox : RadMultiColumnComboBox
{
public override string ThemeClassName
{
get
{
return typeof(RadMultiColumnComboBox).FullName;
}
}
protected override RadMultiColumnComboBoxElement CreateMultiColumnComboBoxElement()
{
return new MyRadMultiColumnComboBoxElement();
}
}
public class MyRadMultiColumnComboBoxElement : RadMultiColumnComboBoxElement
{
protected override Type ThemeEffectiveType
{
get
{
return typeof(RadMultiColumnComboBoxElement);
}
}
protected override void SetActiveItem(string text)
{
int rowIndex = this.FindItemIndexExact(text);
if (rowIndex != -1)
{
this.EditorControl.CurrentRow = this.EditorControl.Rows[rowIndex];
this.textBox.SelectionStart = this.textBox.Text.Length;
}
}
}
To reproduce:
Type "Th" into the multi-column combo box in the attached project. Then press and hold the Backspace key until "Th" is deleted. Then release Backspace key. There remain only the filtered options in the dropdown.
If I press and release the backspace key 1x for each typed letter, then the dropdown repopulates as expected.
Workaround:
private void radMultiColumnComboBox1_TextChanged(object sender, EventArgs e)
{
this.radMultiColumnComboBox1.MultiColumnComboBoxElement.ApplyFilter();
}
Use attached project to reproduce. Workarond: radMultiColumnComboBox1.AutoSize = false; radMultiColumnComboBox1.MinimumSize = new Size(0, 22);
To reproduce, add RadMultiColumnCombobox on a form and use the following code:
public Form1()
{
InitializeComponent();
Random r = new Random();
DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Bool", typeof(bool));
table.Columns.Add("DateColumn", typeof(DateTime));
for (int i = 0; i < 10; i++)
{
table.Rows.Add(i, "Row " + i, r.Next(10) > 5 ? true : false, DateTime.Now.AddHours(i));
}
radMultiColumnComboBox1.DataSource = table;
radMultiColumnComboBox1.DisplayMember = "Name";
radMultiColumnComboBox1.AutoFilter = true;
radMultiColumnComboBox1.DisplayMember = "Name";
FilterDescriptor filter = new FilterDescriptor();
filter.PropertyName = radMultiColumnComboBox1.DisplayMember;
filter.Operator = FilterOperator.Contains;
radMultiColumnComboBox1.EditorControl.MasterTemplate.FilterDescriptors.Add(filter);
}
Once the form loads up, select the text in the editable area and enter any number from 0 to 9. It is important the width of the MCCB is smaller than the width the columns take.
FIX. RadMultiColumnComboBox - AutoFilter does not work in unbound mode
To reproduce drop RadMultiColumnComboBox on a form and use the code below:
public Form1()
{
InitializeComponent();
ThemeResolutionService.AllowAnimations = false;
RadMultiColumnComboBoxElement multiColumnComboElement = this.combo1.MultiColumnComboBoxElement;
multiColumnComboElement.DropDownSizingMode = SizingMode.UpDownAndRightBottom;
multiColumnComboElement.EditorControl.MasterTemplate.AutoGenerateColumns = false;
multiColumnComboElement.EditorControl.AutoGenerateColumns = false;
GridViewTextBoxColumn column1 = new GridViewTextBoxColumn("Item");
column1.HeaderText = "Item";
multiColumnComboElement.Columns.Add(column1);
GridViewTextBoxColumn column2 = new GridViewTextBoxColumn("Description");
column2.HeaderText = "Description";
multiColumnComboElement.Columns.Add(column2);
combo1.DisplayMember = "Description";
combo1.ValueMember = "Item";
this.combo1.AutoSizeDropDownToBestFit = true;
this.combo1.DataSource = GetData();
FilterDescriptor filter = new FilterDescriptor();
filter.PropertyName = this.combo1.DisplayMember;
filter.Operator = FilterOperator.StartsWith;
this.combo1.EditorControl.MasterTemplate.FilterDescriptors.Add(filter);
this.combo1.AutoFilter = true;
this.combo1.MultiColumnComboBoxElement.AutoCompleteMode = AutoCompleteMode.Suggest;
this.combo1.DropDownStyle = RadDropDownStyle.DropDown;
this.combo1.SelectedItem = null;
}
private List<CustomItem> GetData()
{
List<CustomItem> items = new List<CustomItem>();
for (int i = 0; i < 20; i++)
{
CustomItem item = new CustomItem(i, String.Format("This is item number: {0}", i.ToString()));
items.Add(item);
}
return items;
}
}
[Serializable]
public class CustomItem
{
public int Item { get; set; }
public string Description { get; set; }
public CustomItem(int pItem, string pDescription)
{
this.Item = pItem;
this.Description = pDescription;
}
}
Workaround:
1. Enable the animations
ThemeResolutionService.AllowAnimations = true;
or
2. Increase the popup size by one pixel when opening:
void multiColumnComboElement_PopupOpening(object sender, CancelEventArgs e)
{
RadMultiColumnComboBoxElement multiColumnComboElement = (RadMultiColumnComboBoxElement)sender;
multiColumnComboElement.MultiColumnPopupForm.Size = new Size(multiColumnComboElement.MultiColumnPopupForm.Size.Width + 1, multiColumnComboElement.MultiColumnPopupForm.Size.Height);
}
or
3. Turn off the control clipping
((RadHostItem)((MultiColumnComboPopupForm)multiColumnComboElement.MultiColumnPopupForm).SizingGripDockLayout.Children[1]).ClipControl = false;
How to reproduce: check the attached project and video
Workaround: create a custom RadMultiColumnComboBoxElement
Public Class MyRadMultiColumnComboBox
Inherits RadMultiColumnComboBox
Public Overrides Property ThemeClassName As String
Get
Return GetType(RadMultiColumnComboBox).FullName
End Get
Set(value As String)
MyBase.ThemeClassName = value
End Set
End Property
Protected Overrides Function CreateMultiColumnComboBoxElement() As RadMultiColumnComboBoxElement
Return New MyRadMultiColumnComboBoxEleemnt()
End Function
End Class
Class MyRadMultiColumnComboBoxEleemnt
Inherits RadMultiColumnComboBoxElement
Protected Overrides ReadOnly Property ThemeEffectiveType() As Type
Get
Return GetType(RadMultiColumnComboBoxElement)
End Get
End Property
Protected Overrides Sub SetActiveItem(item As String)
Dim rowIndex As Integer = Me.FindItemIndexExact(Text)
If rowIndex <> -1 Then
Me.textBox.SelectionStart = Me.textBox.Text.Length
End If
End Sub
End Class
Currently it is not possible to select multiple rows in RadMultiColumnComboBox.
Workaround: create a custom RadMultiColumnComboBox control with a custom element. You can also check the attached project.
public class MyRadMultiColumnComboBox : RadMultiColumnComboBox
{
public override string ThemeClassName
{
get
{
return typeof(RadMultiColumnComboBox).FullName;
}
}
protected override RadMultiColumnComboBoxElement CreateMultiColumnComboBoxElement()
{
return new MyRadMultiColumnComboBoxElement();
}
}
public class MyRadMultiColumnComboBoxElement : RadMultiColumnComboBoxElement
{
protected override Type ThemeEffectiveType
{
get
{
return typeof(RadMultiColumnComboBoxElement);
}
}
protected override void ProcessKeyDown(object sender, KeyEventArgs e)
{
base.ProcessKeyDown(sender, e);
if (this.IsPopupOpen && (e.KeyCode == Keys.PageDown || e.KeyCode == Keys.PageUp))
{
this.EditorControl.GridBehavior.ProcessKey(e);
}
}
}
When you enable the popup sizing functionality, the last user defined size by the sizing grip should be kept.