When you enable the popup sizing functionality, the last user defined size by the sizing grip should be kept.
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
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.
To reproduce: radMultiColumnComboBox.AutoFilter = True Dim filter As New Telerik.WinControls.Data.FilterDescriptor() filter.PropertyName = radMultiColumnComboBox.DisplayMember filter.Operator = Telerik.WinControls.Data.FilterOperator.StartsWith radMultiColumnComboBox.EditorControl.MasterTemplate.FilterDescriptors.Add(filter) radMultiColumnComboBox.MultiColumnComboBoxElement.AutoCompleteMode = AutoCompleteMode.SuggestAppend radMultiColumnComboBox.MultiColumnComboBoxElement.LimitToList = True - Select an item, copy the text and then try to paste it.
To reproduce: DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); for (int i = 0; i < 1; i++) { dt.Rows.Add(i, "Item" + i); } this.radMultiColumnComboBox1.DataSource = dt; this.radMultiColumnComboBox1.DisplayMember = "Name"; this.radMultiColumnComboBox1.ValueMember = "Id"; this.radMultiColumnComboBox1.AutoFilter = true; this.radMultiColumnComboBox1.SelectedIndex = -1; NOTE: If you add more than 1 items, the text won't be changed. Workaround: Public Class CustomRadMultiColumnComboBox 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 Sub CheckForCompleteMatchAndUpdateText() End Sub Protected Overrides ReadOnly Property ThemeEffectiveType() As Type Get Return GetType(RadMultiColumnComboBoxElement) End Get End Property End Class
To reproduce: public Form1() { InitializeComponent(); DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); for (int i = 0; i < 20; i++) { dt.Rows.Add(i, "Item" + i); } this.radMultiColumnComboBox1.DataSource = dt; this.radMultiColumnComboBox1.DisplayMember = "Name"; this.radMultiColumnComboBox1.ValueMember = "Id"; this.radMultiColumnComboBox1.SelectedValueChanged += radMultiColumnComboBox1_SelectedValueChanged; } private void radMultiColumnComboBox1_SelectedValueChanged(object sender, EventArgs e) { if (this.radMultiColumnComboBox1.SelectedIndex > -1) { MessageBox.Show("Test"); } } NOTE: If you use a RadMessageBox, after showing the message the first time, the popup can't be closed because InvalidOperationException is thrown. Workaround: show the message box in the RadMultiColumnComboBox.DropDownClosed event.
To reproduce: - Open the attached project. - Type a text so there are no results in the drop down. - Press Enter. - Click the arrow button. Workaround: private void RadMultiColumnComboBox1_DropDownOpened1(object sender, EventArgs e) { if (radMultiColumnComboBox1.Text == "") { radMultiColumnComboBox1.EditorControl.FilterDescriptors.Clear(); CompositeFilterDescriptor compositeFilter = new CompositeFilterDescriptor(); compositeFilter.FilterDescriptors.Add(new FilterDescriptor("Drug", FilterOperator.StartsWith, "")); compositeFilter.FilterDescriptors.Add(new FilterDescriptor("Name", FilterOperator.StartsWith, "")); compositeFilter.LogicalOperator = FilterLogicalOperator.Or; radMultiColumnComboBox1.EditorControl.FilterDescriptors.Add(compositeFilter); } }
To reproduce: - Start the attached project and type a value so one item remains in the drop down. - Press Enter - event is not fired. Workaround: Use the DropDownClosed event and check if the value is changed.
Steps to reproduce: 1. Select the radMultiColumnsComboBox1 at Design time 2. Press F4 for showing Properties 3. Open Columns editor (GridViewDataColumn Collection Editor) 4. Try to add a column Error Message: Cannot create an instance of the abstract class or interface 'Telerik.WinControls.UI.GridViewDataColumn' because it is an abstract class.
To reproduce: Repository commonRepository = new Repository(); public Form1() { InitializeComponent(); InitializeDropDown(); this.radMultiColumnComboBox1.DropDownMinSize = new Size(1100, 400); this.radMultiColumnComboBox1.EditorControl.ViewCellFormatting += EditorControl_ViewCellFormatting; } private void EditorControl_ViewCellFormatting(object sender, CellFormattingEventArgs e) { if (e.Row is GridViewDataRowInfo && e.CellElement is GridRowHeaderCellElement) { e.CellElement.Text = e.RowIndex.ToString(); } } public class Instrument { public string Isin { get; set; } public string Description { get; set; } public string AlphaCode { get; set; } public string MicMarketplaceCode { get; set; } public string WorpMarketPlaceDescription { get; set; } public string InstrumentType { get; set; } public string DerivateIsin { get; set; } public int Order { get; set; } } public class Repository { public BindingList<Instrument> GetInstruments() { Random rand = new Random(); BindingList<Instrument> list = new BindingList<Instrument>(); for (int i = 0; i < 80000; i++) { list.Add(new Instrument() { Isin = Guid.NewGuid().ToString(), Description = "Description" + i, AlphaCode = "Code" + i, MicMarketplaceCode = "MicCode" + i, WorpMarketPlaceDescription = "MPdescription" + i, InstrumentType = "Type" + i % 3, DerivateIsin = Guid.NewGuid().ToString(), Order = rand.Next(1, 100) }); } return list; } } public void InitializeDropDown() { var ui = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(() => { var result = commonRepository.GetInstruments(); return result; }).ContinueWith(res => { if (res.IsCompleted) { this.radMultiColumnComboBox1.DisplayMember = "Description"; this.radMultiColumnComboBox1.ValueMember = "Isin"; this.radMultiColumnComboBox1.AutoFilter = true; this.radMultiColumnComboBox1.DataSource = res.Result; CompositeFilterDescriptor compositeFilter = new CompositeFilterDescriptor(); FilterDescriptor code = new FilterDescriptor("Isin", FilterOperator.Contains, ""); FilterDescriptor description = new FilterDescriptor("Description", FilterOperator.Contains, ""); FilterDescriptor alphaCode = new FilterDescriptor("AlphaCode", FilterOperator.Contains, ""); FilterDescriptor micMarketplaceCode = new FilterDescriptor("MicMarketplaceCode", FilterOperator.Contains, ""); FilterDescriptor worpMarketPlaceDescription = new FilterDescriptor("WorpMarketPlaceDescription", FilterOperator.Contains, ""); FilterDescriptor instrumentType = new FilterDescriptor("InstrumentType", FilterOperator.Contains, ""); FilterDescriptor derivateIsin = new FilterDescriptor("DerivateIsin", FilterOperator.Contains, ""); compositeFilter.FilterDescriptors.Add(code); compositeFilter.FilterDescriptors.Add(description); compositeFilter.FilterDescriptors.Add(alphaCode); compositeFilter.FilterDescriptors.Add(micMarketplaceCode); compositeFilter.FilterDescriptors.Add(worpMarketPlaceDescription); compositeFilter.FilterDescriptors.Add(instrumentType); compositeFilter.FilterDescriptors.Add(derivateIsin); compositeFilter.LogicalOperator = FilterLogicalOperator.Or; this.radMultiColumnComboBox1.EditorControl.FilterDescriptors.Add(compositeFilter); this.radMultiColumnComboBox1.EditorControl.BestFitColumns(); for (int i = 0; i < this.radMultiColumnComboBox1.EditorControl.Columns.Count; i++) { var column = this.radMultiColumnComboBox1.EditorControl.Columns[i]; switch (column.Name) { case "Isin": column.HeaderText = "Header Isin"; column.Width = 120; break; case "Description": column.HeaderText = "Header Description"; break; case "AlphaCode": column.HeaderText = "Header AlphaCode"; break; case "MicMarketplaceCode": column.HeaderText = "Header MicMarketplaceCode"; break; case "WorpMarketPlaceDescription": column.HeaderText = "Header WorpMarketPlaceDescription"; break; case "InstrumentType": column.HeaderText = "Header InstrumentType"; break; case "DerivateIsin": column.HeaderText = "Header DerivateIsin"; break; case "Order": column.IsVisible = false; break; } } this.radMultiColumnComboBox1.SelectedItem = null; this.radMultiColumnComboBox1.Text = "Instrument"; this.radMultiColumnComboBox1.ForeColor = Color.Gray; this.radMultiColumnComboBox1.MultiColumnComboBoxElement.DropDownWidth = 550; } else { RadMessageBox.Show(res.Exception.Message); } }, ui); } Workaround: use custom filtering instead of CompositeFilterDescriptor: 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; private void EditorControl_CustomFiltering(object sender, GridViewCustomFilteringEventArgs e) { string searchText = this.radMultiColumnComboBox1.MultiColumnComboBoxElement.EditorElement.Text; if (searchText != string.Empty) { Instrument instrument = e.Row.DataBoundItem as Instrument; e.Handled = true; e.Visible = instrument.Isin.Contains(searchText) || instrument.Description.Contains(searchText) || instrument.AlphaCode.Contains(searchText) || instrument.MicMarketplaceCode.Contains(searchText) || instrument.WorpMarketPlaceDescription.Contains(searchText) || instrument.InstrumentType.Contains(searchText) || instrument.DerivateIsin.Contains(searchText); } }
To reproduce: - Add 200k rows and the call the BestFitColumns method like this (only the visual rows should be measured in this case): this.radMultiColumnComboBox.BestFitColumns(true, false); Workaround: Set the AutoSizeDropDownColumnMode before calling the method: this.radMultiColumnComboBox.MultiColumnComboBoxElement.AutoSizeDropDownColumnMode = BestFitColumnMode.DisplayedCells; this.radMultiColumnComboBox.BestFitColumns(true, false);
To reproduce: - Set the AutoFileter property to true. - Add filter descriptor; - Start the application and type something in the control - you just need to filter the values so more than one entry is available in the drop down. - Press Tab or click on other control. - You will notice that the selected value is set, but the text is not synchronized. Workaround: void radMultiColumnComboBox1_Validated(object sender, EventArgs e) { if (radMultiColumnComboBox1.SelectedValue != null) { string text = radMultiColumnComboBox1.EditorControl.CurrentRow.Cells[radMultiColumnComboBox1.DisplayMember].Value.ToString(); if (text != radMultiColumnComboBox1.Text) { radMultiColumnComboBox1.Text = text; } } }
To reproduce: - The attached video shows how you can reproduce the issue Note - you should type fast in the drop down and the size is invalid only the firs time. Workaround: RadMultiColumnComboBox1.MultiColumnComboBoxElement.DropDownAnimationEnabled = False
To reproduce: - Ty some text so the items in the drop down are filtered. - Directly press enter (this should select the first item in the drop down) - The selected value is updated however the text is not. Workaround: Private Sub cbo_SelectedValueChanged(sender As Object, e As EventArgs) Handles RadMultiColumnComboBox1.SelectedValueChanged, RadMultiColumnComboBox2.SelectedValueChanged, RadMultiColumnComboBox3.SelectedValueChanged Dim cbo As RadMultiColumnComboBox = sender If bLoading = False AndAlso cbo.Text <> CType(cbo.SelectedItem, Telerik.WinControls.UI.GridViewDataRowInfo).Cells(cbo.DisplayMember).Value Then cbo.Text = CType(cbo.SelectedItem, Telerik.WinControls.UI.GridViewDataRowInfo).Cells(cbo.DisplayMember).Value End If End Sub
To reproduce: - Bind the control and set the auto filter functionality. - Type a value and press the tab key or click ouside of the control. - Subscribe to the DropDownClosed event and observe that the SelectedValue and the text are different. Workaround: void radMultiColumnComboBox1_DropDownClosed(object sender, Telerik.WinControls.UI.RadPopupClosedEventArgs args) { this.radMultiColumnComboBox1.Text = this.radMultiColumnComboBox1.SelectedValue.ToString(); }
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: - Add columns to the control manually. - Bind the control. Make sure that the FieldNames are different from the column names. - Start the application and select a value. Retrieve he value upon button click. Workaround: Use equal names.
To reproduce: - Bind the control to a binding list. - Add and then remove items at runtime. Workaround: radMultiColumnComboBox1.EditorControl.BeginUpdate(); list.RemoveAt(0); radMultiColumnComboBox1.EditorControl.EndUpdate();