1. Create a new project 2. Add a button and on this button start a new form containing RadMarkupEditor 3. Open and close this form several times
This behavior comes from the nested MaskedEditBox. RadDateTimePicker behaves the same way - this is core logic and should be the same.
Selection in RadDateTimePicker when the culture is ar-SA is not correct. Further, changing the selected date using the arrow keys does not set the right value.
SpellCheckAllAtOnce form should fill the "Change To:" field with the selected word in the suggestions box
The RadDateTimePicker editor does not allow to edit milliseconds if appropriate format string is applied.
Html formatting does not work as expected in design-time.
To reproduce: Add a RadTextBoxControl to a form, insert a text using the following line: this.radTextBoxControl1.AppendText(string.Format("{0} Foo {0} bar {0}", Environment.NewLine)); You will notice that the newlines are not taken into consideration Workaround: Use the following classes - public class MyTextBoxControl : RadTextBoxControl { protected override RadTextBoxControlElement CreateTextBoxElement() { return new MyTextBoxControlElement(); } } public class MyTextBoxControlElement : RadTextBoxControlElement { protected override TextBoxViewElement CreateViewElement() { return new MyTextBoxViewElement(); } protected override Type ThemeEffectiveType { get { return typeof(RadTextBoxControlElement); } } } public class MyTextBoxViewElement : TextBoxViewElement { protected override void ReplaceTextBlock(ITextBlock targetBlock, int startCharPosition, int endCharPosition, string text) { if (string.IsNullOrEmpty(text) && startCharPosition == 0 && endCharPosition == targetBlock.Length) { this.Children.Remove(targetBlock as RadElement); return; } string headText = targetBlock.Text.Substring(0, startCharPosition); string tailText = targetBlock.Text.Substring(endCharPosition); targetBlock.Text = headText; if (TextBoxViewElement.IsSpecialText(text) || this.ContainsNewLine(text)) { int index = string.IsNullOrEmpty(headText) ? targetBlock.Index : targetBlock.Index + 1; index = this.InsertTextBlocks(index, text, TextBlockElementType); if (string.IsNullOrEmpty(headText)) { targetBlock.Index = index + 1; } if (!string.IsNullOrEmpty(headText) && !string.IsNullOrEmpty(tailText)) { index = this.InsertTextBlocks(index + 1, tailText, TextBlockElementType); return; } } else { targetBlock.Text += text; } targetBlock.Text += tailText; } public bool ContainsNewLine(string text) { string[] words = text.Split(new char[] { ' ', ',', '.', '!', '?' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < words.Length; i++) { string word = words[i]; if (!string.IsNullOrEmpty(word) && word == Environment.NewLine) { return true; } } return false; } }
To reproduce: Add a RadSpinEditor and set its Hexadecimal property to true. Set its maximum to 0xFFFFFFFF(4294967295). Try to enter value larger than 7FFFFFFF(Int.MaxValue). You will notice that the value cannot be set. Workaround: public class MySpinEditor : RadSpinEditor { public new MySpinElement SpinElement { get { return base.SpinElement as MySpinElement; } private set { typeof(RadSpinEditor).GetField("spinElement", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, value); } } protected override void CreateChildItems(RadElement parent) { this.SpinElement = new MySpinElement(); this.SpinElement.RightToLeft = this.RightToLeft == System.Windows.Forms.RightToLeft.Yes; this.RootElement.Children.Add(this.SpinElement); this.SpinElement.ValueChanging += SpinElement_ValueChanging; this.SpinElement.ValueChanged += SpinElement_ValueChanged; this.SpinElement.TextChanging += SpinElement_TextChanging; this.SpinElement.KeyDown += SpinElement_KeyDown; this.SpinElement.KeyPress += SpinElement_KeyPress; this.SpinElement.KeyUp += SpinElement_KeyUp; } void SpinElement_KeyUp(object sender, KeyEventArgs e) { this.CallBaseOnKeyUp(e); } void SpinElement_KeyPress(object sender, KeyPressEventArgs e) { this.CallBaseOnKeyPress(e); } void SpinElement_KeyDown(object sender, KeyEventArgs e) { this.CallBaseOnKeyDown(e); } void SpinElement_TextChanging(object sender, TextChangingEventArgs e) { this.OnTextChanged(e); } void SpinElement_ValueChanged(object sender, EventArgs e) { this.OnValueChanged(e); } void SpinElement_ValueChanging(object sender, ValueChangingEventArgs e) { this.OnValueChanging(e); } } public class MySpinElement : RadSpinElement { protected override decimal GetValueFromText() { try { if (!string.IsNullOrEmpty(this.Text) && ((this.Text.Length != 1) || (this.Text != "-"))) { decimal resultValue = 0m; if (this.Hexadecimal) { resultValue = this.Constrain(Convert.ToDecimal(Convert.ToInt64(this.Text, 16))); } else { resultValue = this.Constrain(decimal.Parse(this.Text, CultureInfo.CurrentCulture)); } return resultValue; } else { return this.internalValue; } } catch { return this.internalValue; } } protected override Type ThemeEffectiveType { get { return typeof(RadSpinElement); } } }
To reproduce: - Set the NullableValue property to null. - When you start the application there is no date in datetime picker but when the control loses the focus the date is automatically filled. Workaround: - Set the NullDate to equals the Value: radDateTimePicker1.NullDate = radDateTimePicker1.Value; - Then you change the NullDate in the ValueChanged event: void radDateTimePicker1_ValueChanged(object sender, EventArgs e) { radDateTimePicker1.NullDate = new DateTime(1980, 1, 1); }
Add the ability to gain focus and change the toggle state upon keypress. Add the ability to show the calendar with a key combination like Alt + DownArrow.
To reproduce: - Add a blank mask to a form and set its Mask type to Standard. - Set its mask to "###-##-##"; - Set its PromptChar to a single space. - Now set the caret before the '-' and type a two digits (the first digit is overridden by the second because the caret is not moved properly). Workaround: Subscribe to the following KeyDown event: void box1_KeyDown(object sender, KeyEventArgs e) { int caretPos = this.box1.MaskedEditBoxElement.TextBoxItem.SelectionStart; if ((e.KeyCode != Keys.Left && e.KeyCode != Keys.Right) && (e.KeyCode != Keys.Up && e.KeyCode != Keys.Down)) { if (caretPos < box1.Text.Length && box1.Text[caretPos] == '-') { this.box1.MaskedEditBoxElement.TextBoxItem.SelectionStart++; } } }
To reproduce: -wire to the PreviewKeyDown event like this: radMaskedEditBox1.PreviewKeyDown += radMaskedEditBox1_PreviewKeyDown Workaround: -wire to the TextBoxItem PreviewKeyDown: radMaskedEditBox1.MaskedEditBoxElement.TextBoxItem.PreviewKeyDown += TextBoxItem_PreviewKeyDown;
RadSpellCheckerLocalizationProvider - The word dictionary is misspelled in case RadSpellCheckerStringId.NotInDictionary. Workaround: Create custom localization provider and override incorrect string.
RadMaskedEditBox - has incorrect behavior when decimal separator is "D". You can set only one digit before separator.
RadMaskEditBox - does not work correctly when the whole text is selected and user presses key "Enter". Control removes the last character. Workaround: Public Class Form1 Dim text1 As String Dim text2 As String Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyData = Keys.Enter Then SendKeys.Send("{TAB}") End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.RadMaskedEditBox1.MaskType = Telerik.WinControls.UI.MaskType.Standard Me.RadMaskedEditBox2.MaskType = Telerik.WinControls.UI.MaskType.Standard Me.RadMaskedEditBox1.Mask = "00/00/00" Me.RadMaskedEditBox1.Text = "__/__/__" Me.RadMaskedEditBox2.Mask = "00/00/00" Me.RadMaskedEditBox2.Text = "__/__/__" End Sub Private Sub RadMaskedEditBox1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadMaskedEditBox1.GotFocus RadMaskedEditBox1.SelectAll() text1 = Me.RadMaskedEditBox1.Text End Sub Private Sub RadMaskedEditBox1_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadMaskedEditBox1.LostFocus Me.RadMaskedEditBox1.Text = text1 End Sub Private Sub RadMaskedEditBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RadMaskedEditBox1.KeyDown If e.KeyData = Keys.Enter Then text1 = Me.RadMaskedEditBox1.Text End If End Sub Private Sub RadMaskedEditBox2_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadMaskedEditBox2.GotFocus RadMaskedEditBox2.SelectAll() text2 = Me.RadMaskedEditBox2.Text End Sub Private Sub RadMaskedEditBox2_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadMaskedEditBox2.LostFocus Me.RadMaskedEditBox2.Text = text2 End Sub Private Sub RadMaskedEditBox2_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RadMaskedEditBox2.KeyDown If e.KeyData = Keys.Enter Then text2 = Me.RadMaskedEditBox2.Text End If End Sub End Class
IF you canceling the textChanging event of the RadTextBox (e.Cancel = true) the cursor back at the start of the text. Work around: 1. Create custom text box element that inherited the RadTextBoxElement. For example: public class MyTextBoxElement : RadTextBoxElement { private bool isValueChanging = false; private int selectionStart = -1; public MyTextBoxElement() { this.TextBoxItem.HostedControl.TextChanged += new EventHandler(HostedControl_TextChanged); } protected override void OnTextChanging(Telerik.WinControls.TextChangingEventArgs e) { base.OnTextChanging(e); Regex regEx = new Regex(@"[\s]{1,}"); if (regEx.IsMatch(e.NewValue)) { isValueChanging = true; this.selectionStart = base.TextBoxItem.SelectionStart - 1; } } private void HostedControl_TextChanged(object sender, EventArgs e) { if (this.isValueChanging && selectionStart >= 0) { this.isValueChanging = false; this.TextBoxItem.SelectionStart = this.selectionStart; } } protected override Type ThemeEffectiveType { get { return typeof(RadTextBoxElement); } } } 2. Create custom Text box that inherited the RadTextBox: For Example: public class MyTextBox : RadTextBox { private static readonly FieldInfo TextBoxElementFieldInfo = typeof(RadTextBox).GetField("textBoxElement", BindingFlags.NonPublic | BindingFlags.Instance); public MyTextBox() { this.ThemeClassName = typeof(RadTextBox).FullName; } protected RadTextBoxElement TextBox { get { return (RadTextBoxElement)TextBoxElementFieldInfo.GetValue(this); } set { TextBoxElementFieldInfo.SetValue(this, value); } } protected override void InitializeTextElement() { this.TextBox = new MyTextBoxElement(); this.TextBox.StretchVertically = true; this.TextBox.ShowBorder = true; } } 3. Use your custom Text box instead the default RadTextBox. 4. Subscribe to text Changing event of the custom text box and add the following code snippet: Regex regEx = new Regex(@"[\s]{1,}"); if (regEx.IsMatch(e.NewValue)) { e.Cancel = true; }
RadAutoCompleteBox - Items collection ordered by input, not alphabetically
Current behavior: With decimal places = 2 2.225 is round to 2.22 the proper behavior would be 2.225 to be round to 2.23
Steps to reproduce. 1. Add a RadTextBoxControl and a button to a form 2. On the button click set a large text (the text from a 150KB text file) to the Text property of the text box. You will see that the control takes a lot of time to complete the operation.
Until Q3 2012 the position of the check box has been on the left hand side of the control. After Q3 the position of the check box is between the text box and the arrow button. The correct position is on the left hand side.