To reproduce: add a RadMaskedEditBox and use the following code: Sub New() InitializeComponent() Me.RadMaskedEditBox1.MaskType = Telerik.WinControls.UI.MaskType.Numeric Me.RadMaskedEditBox1.Mask = "N1" Dim item As Item = New Item(Nothing, "Item1") RadMaskedEditBox1.DataBindings.Add("Value", item, "StockTypeId", True, DataSourceUpdateMode.OnPropertyChanged) End Sub Public Class Item Private _stockId As Nullable(Of Integer) Public Sub New(value As Nullable(Of Integer), name As String) Me._stockId = value End Sub Public Property StockTypeId() As Nullable(Of Integer) Get Return _stockId End Get Set(ByVal value As Nullable(Of Integer)) _stockId = value Console.WriteLine(value) End Set End Property End Class The user is not allowed to enter a new numeric value. Wokraround: Public Class CustomNumericCharacterTextBoxProvider Inherits NumericCharacterTextBoxProvider Private owner As RadMaskedEditBoxElement Public Sub New(mask As String, culture As CultureInfo, numericType As NumericCharacterTextBoxProvider.RadNumericMaskFormatType, _ owner As RadMaskedEditBoxElement) MyBase.New(mask, culture, numericType, owner) Me.owner = owner End Sub Protected Overrides Function AllowAppendCharacters() As Boolean If owner.Text = "" AndAlso owner.Mask = "N1" Then Return True End If Return MyBase.AllowAppendCharacters() End Function End Class Public Class CustomMaskedEditBox Inherits RadMaskedEditBox Public Overrides Property ThemeClassName As String Get Return GetType(RadMaskedEditBox).FullName End Get Set(value As String) MyBase.ThemeClassName = value End Set End Property Public Sub New() MyBase.New() Me.MaskType = Telerik.WinControls.UI.MaskType.Numeric Me.Mask = "N1" Dim numericMaskProvider As NumericMaskTextBoxProvider = Me.MaskedEditBoxElement.Provider Dim fi As FieldInfo = GetType(NumericMaskTextBoxProvider).GetField("provider", BindingFlags.Instance Or BindingFlags.NonPublic) fi.SetValue(numericMaskProvider, _ New CustomNumericCharacterTextBoxProvider(numericMaskProvider.Mask, numericMaskProvider.Culture, _ NumericMaskTextBoxProvider.GetFormat(numericMaskProvider.Mask, numericMaskProvider.Culture), _ Me.MaskedEditBoxElement)) End Sub End Class
To reproduce: - Set the provider to FreeFormDateTimeProvider - Bind the control to a value. - Clear the date and tab out of the control. Workaround: Seth the value in the ParsingDateTime event handler: if (e.InputString == "") { this.SetToNullValue(); }
To reproduce: please refer to the attached gif file. The error is applicable for all controls that use RadColorDialog while editing, e.g. RadGridView, RadPropertyGrid. Workaround: disable the spineditors: private void RadPropertyGrid1_EditorInitialized(object sender, Telerik.WinControls.UI.PropertyGridItemEditorInitializedEventArgs e) { PropertyGridColorEditor colorEditor = e.Editor as PropertyGridColorEditor; if (colorEditor !=null) { RadColorBoxElement el = colorEditor.EditorElement as RadColorBoxElement; ((RadForm)el.ColorDialog.ColorDialogForm).Load += ColorDialogForm_Load1; } } private void ColorDialogForm_Load1(object sender, EventArgs e) { RadColorDialogForm form = sender as RadColorDialogForm; RadPageView pageView = form.RadColorSelector.Controls["radPageView1"] as RadPageView; Telerik.WinControls.UI.RadColorPicker.ProfessionalColors professionalColors = pageView.Pages[3].Controls["professionalColorsControl"] as Telerik.WinControls.UI.RadColorPicker.ProfessionalColors; foreach (Control c in professionalColors.Controls ) { RadSpinEditor spinEditor = c as RadSpinEditor; if (spinEditor!=null) { spinEditor.SpinElement.TextBoxItem.Enabled = false; } } }
Steps to reproduce: public Form1() { InitializeComponent(); this.Text = Telerik.WinControls.VersionNumber.Number; this.radMaskedEditBox1.Culture = new System.Globalization.CultureInfo("nl-BE"); this.radMaskedEditBox1.MaskType = Telerik.WinControls.UI.MaskType.Numeric; this.radMaskedEditBox1.Mask = "C"; this.radMaskedEditBox1.Value = 570.00; } private void radButton2_Click(object sender, EventArgs e) { this.radMaskedEditBox1.Culture = new System.Globalization.CultureInfo("en-US"); } private void radButton1_Click(object sender, EventArgs e) { this.radMaskedEditBox1.Culture = new System.Globalization.CultureInfo("nl-BE"); } Run the application and change the culture between Dutch and English, you will see that the value is reset instead keep it. Workaround: CultureInfo providerDutch = new CultureInfo("nl-BE"); CultureInfo providerEnglish = new CultureInfo("en-US"); public Form1() { InitializeComponent(); this.Text = Telerik.WinControls.VersionNumber.Number; this.radMaskedEditBox1.Culture = providerDutch; this.radMaskedEditBox1.MaskType = Telerik.WinControls.UI.MaskType.Numeric; this.radMaskedEditBox1.Mask = "C"; this.radMaskedEditBox1.Value = 570.00; } private void radButton1_Click(object sender, EventArgs e) { double tempValue = double.Parse(this.radMaskedEditBox1.Value.ToString(), NumberStyles.Currency | NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint, providerEnglish); this.radMaskedEditBox1.Culture = new System.Globalization.CultureInfo("nl-BE"); this.radMaskedEditBox1.Value = tempValue; } private void radButton2_Click(object sender, EventArgs e) { double tempValue = double.Parse(this.radMaskedEditBox1.Value.ToString(), NumberStyles.Currency | NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint, providerDutch); this.radMaskedEditBox1.Culture = new System.Globalization.CultureInfo("en-US"); this.radMaskedEditBox1.Value = tempValue; }
When NumberFormat.NumberDecimalSeparator is same with NumberFormat.CurrencyGroupSeparator numbers cannot be edited and deleted. As a workaround set these separators to different values.
How to reproduce: Check also the attached video public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void radButton1_Click(object sender, EventArgs e) { this.radAutoCompleteBox1.AutoCompleteItems.Clear(); List<RadListDataItem> autoCompleteEntries = new List<RadListDataItem>(); for (int i = 0; i < 10000; i++) { autoCompleteEntries.Add(new RadListDataItem("Joe Smith", "joe@fakecompany.com")); autoCompleteEntries.Add(new RadListDataItem("Adam Petersen", "adam@qwerty.com")); autoCompleteEntries.Add(new RadListDataItem("Jack Russel", "jack@russel.nocom")); autoCompleteEntries.Add(new RadListDataItem("Daniel Finger", "daniel.pinger@gmail.com")); autoCompleteEntries.Add(new RadListDataItem("Richard Vail", "rvail@richardvail.com")); autoCompleteEntries.Add(new RadListDataItem("Sebastian Jonnson", "s.jonnson@sjonnson.com")); autoCompleteEntries.Add(new RadListDataItem("Lee Cooper", "lee.cooper@coopercoorp.com")); autoCompleteEntries.Add(new RadListDataItem("Kelvin Clain", "kclain@clainkevin.com")); autoCompleteEntries.Add(new RadListDataItem("Maria Jenson", "mjenson@mariajenson.com")); autoCompleteEntries.Add(new RadListDataItem("Chelsea Maarten", "chelsea@maarten.com")); } this.radAutoCompleteBox1.AutoCompleteItems.AddRange(autoCompleteEntries); } } Workaround: use Begin/End update block and reset the private patternText field: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void radButton1_Click(object sender, EventArgs e) { typeof(RadTextBoxListElement).GetField("patternText", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this.radAutoCompleteBox1.ListElement, null); this.radAutoCompleteBox1.AutoCompleteItems.Clear(); List<RadListDataItem> autoCompleteEntries = new List<RadListDataItem>(); for (int i = 0; i < 10000; i++) { autoCompleteEntries.Add(new RadListDataItem("Joe Smith", "joe@fakecompany.com")); autoCompleteEntries.Add(new RadListDataItem("Adam Petersen", "adam@qwerty.com")); autoCompleteEntries.Add(new RadListDataItem("Jack Russel", "jack@russel.nocom")); autoCompleteEntries.Add(new RadListDataItem("Daniel Finger", "daniel.pinger@gmail.com")); autoCompleteEntries.Add(new RadListDataItem("Richard Vail", "rvail@richardvail.com")); autoCompleteEntries.Add(new RadListDataItem("Sebastian Jonnson", "s.jonnson@sjonnson.com")); autoCompleteEntries.Add(new RadListDataItem("Lee Cooper", "lee.cooper@coopercoorp.com")); autoCompleteEntries.Add(new RadListDataItem("Kelvin Clain", "kclain@clainkevin.com")); autoCompleteEntries.Add(new RadListDataItem("Maria Jenson", "mjenson@mariajenson.com")); autoCompleteEntries.Add(new RadListDataItem("Chelsea Maarten", "chelsea@maarten.com")); } this.radAutoCompleteBox1.ListElement.DataLayer.ListSource.BeginUpdate(); this.radAutoCompleteBox1.AutoCompleteItems.AddRange(autoCompleteEntries); this.radAutoCompleteBox1.ListElement.DataLayer.ListSource.EndUpdate(); } }
To reproduce: this.radDateTimePicker1.ThemeName = "TelerikMetroTouch"; var calendar1 = (radDateTimePicker1.DateTimePickerElement.CurrentBehavior as RadDateTimePickerCalendar); calendar1.ShowTimePicker = true; Workaround: calendar1.Calendar.Width = 250; calendar1.DropDownMinSize = new System.Drawing.Size(500, 250);
Workaround: this.radTextBox1.TextBoxElement.Fill.BackColor = backColor; this.radTextBox1.TextBoxElement.BackColor = backColor;
Please refer to the attached screenshot. Workaround: Me.RadDateTimePicker1.DateTimePickerElement.TextBoxElement.MaxSize = New Size(0, 20)
To reproduce: 1. Add a RadForm and a RadTimePicker/RadDateTimePicker. 2. Change the Enabled property of the RadTimePicker/RadDateTimePicker to false at design time. 3. Apply the Office2013Light theme to the RadTimePicker/RadDateTimePicker at design time. 4. Apply the same theme to the RadForm at design time. If you run the application, you will notice that RadTimePicker/RadDateTimePicker has a gray back color. However, if you turn on/off the Enabled property in a button's Click event, the back color is not gray. Workaround: set the Enabled property to false in the Load event.
Workaround: install .NET Framework 2.0 SP1
Please refer to the attached gif file demonstrating how to reproduce the problem. Workaround: close the popup when pressing Backspace: this.radTextBox1.TextBoxElement.TextBoxItem.TextBoxControl.KeyDown+=TextBoxControl_KeyDown; private void TextBoxControl_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData== Keys.Back) { TextBoxSpellChecker textBoxSpellChecker = _radSpellChecker.GetControlSpellChecker(typeof(RadTextBox)) as TextBoxSpellChecker; if (textBoxSpellChecker!=null) { textBoxSpellChecker.DropDownMenu.ClosePopup(RadPopupCloseReason.Keyboard); } } }
To reproduce: - Use the SpellCheck as you type functionality with RadTextBox. - The "Ignore All" and "Add To Dictionary" strings in the context menu are not changed. Workaround: public RadForm1() { InitializeComponent(); radSpellChecker1.AutoSpellCheckControl = radTextBox1; TextBoxSpellChecker textBoxControlSpellChecker = this.radSpellChecker1.GetControlSpellChecker(typeof(RadTextBox)) as TextBoxSpellChecker; textBoxControlSpellChecker.DropDownMenu.DropDownOpened += DropDownMenu_DropDownOpened; } private void DropDownMenu_DropDownOpened(object sender, EventArgs e) { var menu = (RadDropDownMenu)sender; foreach (var item in menu.Items) { if (item.Text == "Add To Dictionary") { item.Text = "test"; } if (item.Text == "Ignore All") { item.Text = "test"; } } }
To reproduce: add a RadTreeView and a timer. Use the following code: BindingList<Item> list = new BindingList<Item>(); public Form1() { InitializeComponent(); this.radTreeView1.TreeViewElement.CreateNodeElement += TreeViewElement_CreateNodeElement; for (int i = 0; i < 10; i++) { list.Add(new Item(Guid.NewGuid().ToString(), "Node" + i)); } this.radTreeView1.DataSource = list; this.radTreeView1.DisplayMember = "Title"; this.radTreeView1.ValueMember = "UniqueIdentifier"; this.radTreeView1.TreeViewElement.AutoSizeItems = true; this.timer1.Start(); } void TreeViewElement_CreateNodeElement(object sender, Telerik.WinControls.UI.CreateTreeNodeElementEventArgs e) { e.NodeElement = new CustomTreeNodeElement(); } public class Item: System.ComponentModel.INotifyPropertyChanged { public Item(string uniqueIdentifier, string title) { this._uniqueIdentifier = uniqueIdentifier; this._title = title; } public string UniqueIdentifier { get { return this._uniqueIdentifier; } set { this._uniqueIdentifier = value; OnPropertyChanged("UniqueIdentifier"); } } public string Title { get { return this._title; } set { this._title = value; OnPropertyChanged("Title"); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } private string _uniqueIdentifier; private string _title; } public class CustomContentElement : TreeNodeContentElement { StackLayoutElement nodeContentContainer; LinePrimitive lineElement; LightVisualElement idElement; RadTextBoxControlElement textBoxElement; protected override Type ThemeEffectiveType { get { return typeof(TreeNodeContentElement); } } protected override void InitializeFields() { base.InitializeFields(); this.Margin = new Padding(5, 5, 5, 5); this.StretchHorizontally = true; } public override void Synchronize() { this.DrawFill = true; TreeNodeElement treeNodeElement = this.NodeElement; RadTreeNode node = treeNodeElement.Data; Item dataItem = (Item)node.DataBoundItem; if (dataItem != null) { this.idElement.Text = string.Empty + dataItem.UniqueIdentifier; this.textBoxElement.Text = string.Empty + dataItem.Title; } } protected override void CreateChildElements() { nodeContentContainer = new StackLayoutElement(); nodeContentContainer.Orientation = Orientation.Vertical; nodeContentContainer.StretchHorizontally = true; nodeContentContainer.StretchVertically = false; idElement = new LightVisualElement(); idElement.ShouldHandleMouseInput = false; idElement.NotifyParentOnMouseInput = true; idElement.StretchVertically = false; this.nodeContentContainer.Children.Add(idElement); lineElement = new LinePrimitive(); lineElement.BackColor = Color.Black; lineElement.Margin = new Padding(10, 0, 10, 0); lineElement.StretchVertically = false; this.nodeContentContainer.Children.Add(lineElement); textBoxElement = new RadTextBoxControlElement(); textBoxElement.TextChanged += textBoxElement_TextChanged; textBoxElement.Margin = new Padding(20, 3, 20, 3); textBoxElement.StretchVertically = false; this.nodeContentContainer.Children.Add(textBoxElement); this.Children.Add(nodeContentContainer); } private void textBoxElement_TextChanged(object sender, EventArgs e) { RadTextBoxControlElement tb = sender as RadTextBoxControlElement; CustomContentElement contentElement = tb.Parent.Parent as CustomContentElement; Item item = contentElement.NodeElement.Data.DataBoundItem as Item; if (item.Title != tb.Text) { item.Title = tb.Text; } } } public class CustomTreeNodeElement : TreeNodeElement { protected override TreeNodeContentElement CreateContentElement() { return new CustomContentElement(); } protected override Type ThemeEffectiveType { get { return typeof(TreeNodeElement); } } } private void timer1_Tick(object sender, EventArgs e) { foreach (Item item in list) { item.Title = "Node " + DateTime.Now.ToLongTimeString(); } }
To reproduce: public Form1() { InitializeComponent(); this.radTextBox1.Multiline = true; this.radTextBox1.Size = new Size(200, 200); this.radTextBox1.TextChanged += radTextBox1_TextChanged; } private void radTextBox1_TextChanged(object sender, EventArgs e) { this.radTextBox1.BackColor = Color.Red; } Note: when you keep pressed a specific key, you will notice that the memory consumption is increased, although if you force the GarbageCollector, it is released. It is also noticeable that there is text lagging while typing. Please refer to the attached gif file. Workaround: this.radTextBox1.TextBoxElement.TextBoxItem.TextBoxControl.BackColor = Color.Red;
RadMaskedEditBox is not able to edit the value when MaskType is set to Numeric, Mask to percentage and CultureInfo NumberFormat CurrencyGroupSeparator is set to "." Workaround: CultureInfo ci = new CultureInfo(Thread.CurrentThread.CurrentCulture.LCID, false); //do not use user settings Thread.CurrentThread.CurrentCulture = ci;
After binding a boolean property to RadDateTimePicker:Checked, changes made in the property reflect in the GUI, but changes made in the GUI even after lost focus are not reflected on the boolean property. The same test was done with winforms DateTimePicker and the expected behaviour was observed(not the situation reported). above). For further testing background, the class wich contains the binded boolean, implements INotifyPropertyChanged.
To reproduce: Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("es-CO"); radMaskedEditBox1.MaskType = Telerik.WinControls.UI.MaskType.Numeric; radMaskedEditBox1.Mask = "C2"; radMaskedEditBox1.Culture = new System.Globalization.CultureInfo("es-CO"); Click in the masked edit box and press the decimal separator key in the num pad, the cursor is not moved to the desired position. Workaoround: private void RadMaskedEditBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyValue == 46) { var textBoxItem = this.radMaskedEditBox1.MaskedEditBoxElement.TextBoxItem; int indexOfDecimalSeparator = this.radMaskedEditBox1.MaskedEditBoxElement.TextBoxItem.Text.ToLower().IndexOf(','); if (indexOfDecimalSeparator + 1 <= textBoxItem.Text.Length) { textBoxItem.SelectionStart = indexOfDecimalSeparator + 1; } else { textBoxItem.SelectionStart = indexOfDecimalSeparator; } e.Handled = true; } }
Workaround: 1) set the CurrencyNegativePattern to 1 Alternatively: 2) check if the the formatted text is surrounded with brackets and if yes set the value of the masked edit box to be negative
To reproduce: ThemeResolutionService.ApplicationThemeName = "Office2013Light"; this.radTextBox2.Enabled = false; Workaround: this.radTextBox2.BackColor = Color.LightGray;