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.
To reproduce: DataTable dt = new DataTable(); for (int i = 0; i < 10; i++) { dt.Columns.Add("Column " + i); } for (int i = 0; i < 1000; i++) { dt.Rows.Add(i); } this.radMultiColumnComboBox1.DataSource = dt; this.radMultiColumnComboBox1.DisplayMember = "Column 0"; this.radMultiColumnComboBox1.DropDownSizingMode = SizingMode.UpDown; this.radMultiColumnComboBox1.AutoSizeDropDownToBestFit = true; this.radMultiColumnComboBox1.EditorControl.LoadElementTree(); this.radMultiColumnComboBox1.MultiColumnComboBoxElement.DropDownAnimationEnabled = false; this.radMultiColumnComboBox1.MultiColumnComboBoxElement.ShowPopup(); The columns are autosized but the popup is not sized correctly.
When you set the DropDownHeight property to a big number that exceeds the screen's height, the applied values is SystemInformation.WorkingArea.Height - 100 . However, it should be only SystemInformation.WorkingArea.Height. These 100 pixels shouldn't be lost. NOTE: the same behavior is observed with DropDownWidth as well. Workaround: Public Class CustomMultiColumn Inherits RadMultiColumnComboBox Protected Overrides Function CreateMultiColumnComboBoxElement() As RadMultiColumnComboBoxElement Return New CustomRadMultiColumnComboBoxElement() End Function Public Overrides Property ThemeClassName As String Get Return GetType(RadMultiColumnComboBox).FullName End Get Set(value As String) MyBase.ThemeClassName = value End Set End Property End Class Public Class CustomRadMultiColumnComboBoxElement Inherits RadMultiColumnComboBoxElement Protected Overrides Function GetPopupSize(popup As RadPopupControlBase, measure As Boolean) As Drawing.Size Dim s As Size = MyBase.GetPopupSize(popup, measure) Return New Size(s.Width, Math.Min(SystemInformation.WorkingArea.Height, Me.DropDownHeight)) End Function Protected Overrides ReadOnly Property ThemeEffectiveType As Type Get Return GetType(RadMultiColumnComboBoxElement) End Get End Property End Class