To reproduce: void Form1_Load(object sender, EventArgs e) { this.radMultiColumnComboBox2.AutoSizeDropDownToBestFit = true; RadMultiColumnComboBoxElement multiColumnComboElement2 = this.radMultiColumnComboBox2.MultiColumnComboBoxElement; multiColumnComboElement2.EditorControl.MasterTemplate.AutoGenerateColumns = true; DataTable dt = GetDataTable(); this.radMultiColumnComboBox2.DataSource = dt; FilterDescriptor descriptor3 = new FilterDescriptor("Station", FilterOperator.Contains, null); this.radMultiColumnComboBox2.EditorControl.FilterDescriptors.Add(descriptor3); FilterDescriptor descriptor4 = new FilterDescriptor("StationName", FilterOperator.Contains, null); this.radMultiColumnComboBox2.EditorControl.FilterDescriptors.Add(descriptor4); this.radMultiColumnComboBox2.EditorControl.FilterDescriptors.LogicalOperator = FilterLogicalOperator.Or; radMultiColumnComboBox2.AutoFilter = true; } private DataTable GetDataTable() { DataTable dt = new DataTable(); dt.Columns.Add("Station"); //, typeof(Int32)); dt.Columns.Add("StationName"); System.Data.DataRow row1 = dt.NewRow(); System.Data.DataRow row2 = dt.NewRow(); System.Data.DataRow row3 = dt.NewRow(); System.Data.DataRow row4 = dt.NewRow(); System.Data.DataRow row5 = dt.NewRow(); System.Data.DataRow row6 = dt.NewRow(); System.Data.DataRow row7 = dt.NewRow(); System.Data.DataRow row8 = dt.NewRow(); System.Data.DataRow row9 = dt.NewRow(); System.Data.DataRow row10 = dt.NewRow(); row1["Station"] = "285"; row1["StationName"] = "Bob"; row2["Station"] = "274"; row2["StationName"] = "Mary"; row3["Station"] = "222"; row3["StationName"] = "Joan"; row4["Station"] = "289"; row4["StationName"] = "William"; row5["Station"] = "385"; row5["StationName"] = "Bob"; row6["Station"] = "374"; row6["StationName"] = "Mary"; row7["Station"] = "331"; row7["StationName"] = "Jane"; row8["Station"] = "389"; row8["StationName"] = "William"; row9["Station"] = "281"; row9["StationName"] = "Bob"; row10["Station"] = "273"; row10["StationName"] = "Mary"; dt.Rows.Add(row1); dt.Rows.Add(row2); dt.Rows.Add(row3); dt.Rows.Add(row4); dt.Rows.Add(row5); dt.Rows.Add(row6); dt.Rows.Add(row7); dt.Rows.Add(row8); dt.Rows.Add(row9); dt.Rows.Add(row10); return dt; } Start the application and type 2738 (273 is the last row), then press the up arrow twice, exception should occur. Workaround: public class MyRadMultiColumnComboBox : RadMultiColumnComboBox { protected override RadMultiColumnComboBoxElement CreateMultiColumnComboBoxElement() { return new MyRadMultiColumnComboBoxElement(); } } public class MyRadMultiColumnComboBoxElement : RadMultiColumnComboBoxElement { protected override void ProcessKeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Up) { GridViewRowInfo row = this.GetCurrentRow(true); if (row != null) { int index = row.Index; if (index == -1) { if (this.Rows.Count > 0) { this.EditorControl.CurrentRow = this.Rows[0]; } return; } } } base.ProcessKeyDown(sender, e); } protected override Type ThemeEffectiveType { get { return typeof(RadMultiColumnComboBoxElement); } } }
I tried upgrading to Q1 2013 and am having a problem with speed. In the past some of these big multi-combos were slow but we were able to speed it up by not using size to fit. Now the speed is horrible, especially for the large table. It looks like nothing is happening for quite a while when I click on the drop down button. WORKAROUND: You can call the LoadElementTree method for every combobox in the end of your Load event handler
To reproduce: - add a RadMultiColumnCombo and bind it to fill with data. Use the following code: this.radMultiColumnComboBox1.EditorControl.SelectionChanged+=EditorControl_SelectionChanged; private void EditorControl_SelectionChanged(object sender, EventArgs e) { radMultiColumnComboBox1.SelectedIndex = -1; } After selecting a new row from the drop down grid, NullReferenceException is thrown.
FIX. RadMultiColumnComboBox. Setting the FormatString to a numeric column to some currency format and changing the column position results in displaying an invalid currency symbol.
To reproduce: Create a ListView or GridView cell element. For example: public class FilterGroupByCell : DetailListViewDataCellElement { private RadMultiColumnComboBoxElement multiColumnComboBox = new RadMultiColumnComboBoxElement(); public FilterGroupByCell(DetailListViewVisualItem owner, ListViewDetailColumn column) : base(owner, column) { } protected override void CreateChildElements() { base.CreateChildElements(); this.multiColumnComboBox.AutoSizeDropDownToBestFit = true; multiColumnComboBox.DropDownSizingMode = SizingMode.UpDownAndRightBottom; multiColumnComboBox.EditorControl.MasterTemplate.AutoGenerateColumns = false; GridViewTextBoxColumn column = new GridViewTextBoxColumn("CustomerID"); column.HeaderText = "Customer ID"; multiColumnComboBox.Columns.Add(column); column = new GridViewTextBoxColumn("ContactName"); column.HeaderText = "Contact Name"; multiColumnComboBox.Columns.Add(column); column = new GridViewTextBoxColumn("ContactTitle"); column.HeaderText = "Contact Title"; multiColumnComboBox.Columns.Add(column); column = new GridViewTextBoxColumn("Country"); column.HeaderText = "Country"; multiColumnComboBox.Columns.Add(column); column = new GridViewTextBoxColumn("Phone"); column.HeaderText = "Phone"; multiColumnComboBox.Columns.Add(column); this.Children.Add(multiColumnComboBox); } public override void Synchronize() { base.Synchronize(); this.Text = ""; if (base.Row == null) { return; } this.CurrentFilter = (MFilter)base.Row.DataBoundItem; if (CurrentFilter.CustomListRecordId == "1") multiColumnComboBox.Visibility = Telerik.WinControls.ElementVisibility.Collapsed; DataTable table1 = new DataTable("test"); table1.Columns.Add("CustomerID"); table1.Columns.Add("ContactName"); table1.Columns.Add("ContactTitle"); table1.Columns.Add("Country"); table1.Columns.Add("Phone"); table1.Rows.Add(1, "Ivan Petrov", "2", "2", "2"); table1.Rows.Add(2, "Stefan Muler", "2", "2", "2"); table1.Rows.Add(3, "Alexandro Ricco", "2", "2", "2"); multiColumnComboBox.DataSource = table1; multiColumnComboBox.DisplayMember = "ContactName"; } public MFilter CurrentFilter { get; set; } } Workaround: Create a custom RadMultiColumnComboBoxElement: public class MyRadMultiColumnComboBoxElement : RadMultiColumnComboBoxElement { protected override void OnParentChanged(Telerik.WinControls.RadElement previousParent) { if (this.IsPopupOpen) { this.ClosePopup(RadPopupCloseReason.CloseCalled); } if (this.Parent != null && this.Parent.ElementTree != null && this.Parent.ElementTree.Control is RadGridView) { base.OnParentChanged(previousParent); } } protected override Type ThemeEffectiveType { get { return typeof(RadMultiColumnComboBoxElement); } } } In order to be able to set a DataSource you need to create a new BindingContext prior setting setting the DataSource: DataTable table1 = new DataTable("test"); table1.Columns.Add("CustomerID"); table1.Columns.Add("ContactName"); table1.Columns.Add("ContactTitle"); table1.Columns.Add("Country"); table1.Columns.Add("Phone"); table1.Rows.Add(1, "Ivan Petrov", "2", "2", "2"); table1.Rows.Add(2, "Stefan Muler", "2", "2", "2"); table1.Rows.Add(3, "Alexandro Ricco", "2", "2", "2"); multiColumnComboBox.EditorControl.BindingContext = new System.Windows.Forms.BindingContext(); multiColumnComboBox.DataSource = table1; multiColumnComboBox.DisplayMember = "ContactName";
workaround this.radMultiColumnComboBox1.ResetText();
To reproduce: - Create a custom cell class and try to add an RadMultiColumnComboBoxElement to its children. Workaround: public class MyMCCBElement : RadMultiColumnComboBoxElement { protected override void OnParentChanged(Telerik.WinControls.RadElement previousParent) { if (this.Parent.ElementTree != null) { base.OnParentChanged(previousParent); } } protected override Type ThemeEffectiveType { get { return typeof(RadMultiColumnComboBoxElement); } } }
To reproduce: 1.Add a RadMultiColumnComboBox and populate it with data. 2.Set the EditorControl.AllowSearchRow and the AutoSizeDropDownToBestFit properties to true . 3.When you open the drop down and try to use the search row (e.g. clicking over the arrow buttons), the drop down is closed. Workaround: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.ProductsTableAdapter.Fill(Me.NwindDataSet.Products) Me.RadMultiColumnComboBox1.DataSource = Me.ProductsBindingSource Me.RadMultiColumnComboBox1.EditorControl.AllowSearchRow = True Me.RadMultiColumnComboBox1.AutoSizeDropDownToBestFit = True AddHandler Me.RadMultiColumnComboBox1.DropDownClosing, AddressOf RadMultiColumnComboBox1_DropDownClosing AddHandler Me.RadMultiColumnComboBox1.EditorControl.MouseDown, AddressOf EditorControl_MouseDown End Sub Private Sub RadMultiColumnComboBox1_DropDownClosing(sender As Object, args As Telerik.WinControls.UI.RadPopupClosingEventArgs) args.Cancel = shouldCancel shouldCancel = False End Sub Dim shouldCancel As Boolean = False Private Sub EditorControl_MouseDown(sender As Object, e As MouseEventArgs) Dim searchElement = Me.RadMultiColumnComboBox1.EditorControl.ElementTree.GetElementAtPoint(e.Location) If searchElement IsNot Nothing Then Dim parent = searchElement.Parent If parent IsNot Nothing AndAlso (TypeOf parent Is GridSearchRowElement Or TypeOf parent Is GridSearchCellElement) Then shouldCancel = True End If End If End Sub
To reproduce: Add a RadMultiColumnComboBox with two rows. Open the dropdown, you will see no scrollbars, open it again and scrollbars will be visible. Workaround: Use the following custom class: public class MCCB : RadMultiColumnComboBox { protected override RadMultiColumnComboBoxElement CreateMultiColumnComboBoxElement() { return new MCCBElement(); } } public class MCCBElement : RadMultiColumnComboBoxElement { protected override Size GetPopupSize(RadPopupControlBase popup, bool measure) { Size baseSize = base.GetPopupSize(popup, measure); RadScrollBarElement hScrollBarElement = this.EditorControl.TableElement.HScrollBar; baseSize.Height += (int)hScrollBarElement.ControlBoundingRectangle.Size.Height; return baseSize; } protected override Type ThemeEffectiveType { get { return typeof(RadMultiColumnComboBoxElement); } } }
To reproduce: private void Form1_Load(object sender, EventArgs e) { this.categoriesTableAdapter.Fill(this.nwindDataSet.Categories); this.radMultiColumnComboBox1.DataSource = this.categoriesBindingSource; this.radMultiColumnComboBox1.DisplayMember = "CategoryName"; this.radMultiColumnComboBox1.ValueMember = "CategoryID"; this.radMultiColumnComboBox1.EditorControl.EnableFiltering = true; this.radMultiColumnComboBox1.EditorControl.ShowHeaderCellButtons = true; } Workaround: public Form1() { InitializeComponent(); this.radMultiColumnComboBox1.MultiColumnComboBoxElement.PopupClosing += MultiColumnComboBoxElement_PopupClosing; this.radMultiColumnComboBox1.EditorControl.FilterPopupInitialized += EditorControl_FilterPopupInitialized; } private void EditorControl_FilterPopupInitialized(object sender, FilterPopupInitializedEventArgs e) { RadListFilterPopup filterPopup = e.FilterPopup as RadListFilterPopup; if (filterPopup != null) { filterPopup.PopupOpened -= filterPopup_PopupOpened; filterPopup.PopupOpened += filterPopup_PopupOpened; filterPopup.PopupClosed -= filterPopup_PopupClosed; filterPopup.PopupClosed += filterPopup_PopupClosed; } } bool shouldCancel = false; private void filterPopup_PopupClosed(object sender, RadPopupClosedEventArgs args) { shouldCancel = false; } private void filterPopup_PopupOpened(object sender, EventArgs args) { shouldCancel = true; } private void MultiColumnComboBoxElement_PopupClosing(object sender, RadPopupClosingEventArgs args) { args.Cancel = shouldCancel; }
Workaround: Cancel CurrentRowChanging event if Text is empty: this.radMultiColumnComboBox1.EditorControl.CurrentRowChanging += EditorControl_CurrentRowChanging; void EditorControl_CurrentRowChanging(object sender, Telerik.WinControls.UI.CurrentRowChangingEventArgs e) { e.Cancel = string.IsNullOrEmpty(this.radMultiColumnComboBox1.Text) && this.radMultiColumnComboBox1.MultiColumnComboBoxElement.ArrowButton.IsPressed; }
To reproduce: void radMultiColumnComboBox1_SelectedValueChanged(object sender, EventArgs e) { MessageBox.Show("test"); }
To reproduce: - Add some items to the control and set the DropDownAnimationEnabled to false. - Programmatically select the third item - Start the application, open the drop down and scroll up with the mouse - you will notice that the grid is not scrolled up. Workaround: Set DropDownAnimationEnabled to true.
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 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(); }
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: - 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);
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.
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