How to set the MaxLength property of the input area of the combobox?

16 posts, 0 answers
  1. zaphod94
    zaphod94 avatar
    10 posts
    Member since:
    Jun 2007

    Posted 08 Jun 2010 Link to this post

    I have followed this example

    http://www.telerik.com/help/silverlight/radcombobox-howto-set-max-length-input-area.html

    However, comboBox.FindName("PART_EditableTextBox") always returns null

    Any other ideas?

    comboBox.GetChildTemplate("PART_EditableTextBox") works from the debug window but get a compile time warned "GetChildTemplate is not accessible because of its access levels

    TIA
    zaphod



  2. Ross Wozniak
    Ross Wozniak avatar
    6 posts
    Member since:
    Jan 2010

    Posted 11 Jun 2010 Link to this post

    Hi Tia,

    I was able to reproduce the problem you are experiencing, and have asked our dev team to look at it, but in the meantime I tried replacing the 'FindName' line with the following and it worked for me:

    var

     

     

    textBox = comboBox.FindChildByType<TextBox>();

     


    Ross
  3. DevCraft banner
  4. Hristo
    Admin
    Hristo avatar
    832 posts

    Posted 14 Jun 2010 Link to this post

    Hi zaphod,

    Or you could change the code in the OnMaxLengthChanged method to this:
    private static void OnMaxLengthChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var comboBox = obj as Telerik.Windows.Controls.RadComboBox;
        if (comboBox == null)
            return;
      
        comboBox.Dispatcher.BeginInvoke(
            delegate()
            {
                var childrenCount = VisualTreeHelper.GetChildrenCount(comboBox);
                if (childrenCount > 0)
                {
      
                    var rootElement = VisualTreeHelper.GetChild(comboBox, 0) as FrameworkElement;
                    TextBox textBox = (TextBox)rootElement.FindName("PART_EditableTextBox");
                    if (textBox != null)
                        textBox.SetValue(TextBox.MaxLengthProperty, e.NewValue);
                }
            });
    }

    We will update the help article.

    Best wishes,
    Hristo
    the Telerik team

    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items.
  5. IDispose
    IDispose avatar
    12 posts
    Member since:
    Apr 2010

    Posted 14 Jun 2010 Link to this post

    Hristo
    Thank you for the solution. I have confirmed that it works with the version of Telerik controls we are currently using.

    Best
    zaphod
  6. p k
    p k avatar
    6 posts
    Member since:
    Dec 2009

    Posted 08 Feb 2011 Link to this post

    Hi,
    I refered the example from http://www.telerik.com/help/silverlight/radcombobox-howto-set-max-length-input-area.html.
    After adding the class and refreing the same in xaml i am getting build error.

    Error 15 The property 'MaxLength' does not exist on the type 'RadComboBox' in the XML namespace . 

    Please help.

    Thanks
    Purushottam
  7. Yana
    Admin
    Yana avatar
    4554 posts

    Posted 11 Feb 2011 Link to this post

    Hello Purushottam,

    Could you please send us your code so we can examine it ? Thanks in advance

    Greetings,
    Yana
    the Telerik team
    Let us know about your Windows Phone 7 application built with RadControls and we will help you promote it. Learn more>>
  8. Matthias Bibo
    Matthias Bibo avatar
    72 posts
    Member since:
    Mar 2010

    Posted 17 Sep 2012 Link to this post

    Hello,

    the HowTo: Set MaxLength Property of the Input Area does not work for us.

    Can you give us some hint? The Howto crashes, because the combobox has no children.Then I added the addition with the childrencount, but then the code gets never executed.

    <bdlControls:BDLComboBox x:Name="txt_targetHpsl" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2" TextSearchMode="StartsWith" CanAutocompleteSelectItems="False" IsEditable="True" IsTextSearchEnabled="False" ItemsSource="{Binding ContextSelektionsErgebnisse, Mode=TwoWay}" Text="{Binding CurrentSelectionWfStep.TargetHpslDescription, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Center" MinWidth="120" Foreground="#396C9C" bdlControls:BDLEditableComboBox.MaxLength="20"/>

    public class BDLComboBox : RadComboBox
        {
            /// <summary>
            /// Initializes a new instance of the <see cref="BDLComboBox" /> class.
            /// </summary>
            public BDLComboBox()
            {
                // StyleManager.SetTheme(this, new Bdl.DialogCrm.Silverlight.Themes.DialogCrmDefaultTheme());     
            }        
        }

    public class BDLEditableComboBox
        {
            /// <summary>
            /// 
            /// </summary>
            public static readonly DependencyProperty MaxLengthProperty =
                DependencyProperty.RegisterAttached("MaxLength", typeof(int), typeof(BDLEditableComboBox), new PropertyMetadata(OnMaxLengthChanged));
      
            /// <summary>
            /// Gets the length of the max.
            /// </summary>
            /// <param name="obj">The obj.</param>
            /// <returns></returns>
            public static int GetMaxLength(DependencyObject obj)
            {
                return (int)obj.GetValue(MaxLengthProperty);
            }
      
            /// <summary>
            /// Sets the length of the max.
            /// </summary>
            /// <param name="obj">The obj.</param>
            /// <param name="value">The value.</param>
            public static void SetMaxLength(DependencyObject obj, int value)
            {
                obj.SetValue(MaxLengthProperty, value);
            }
      
            /// <summary>
            /// Called when [max length changed].
            /// </summary>
            /// <param name="obj">The obj.</param>
            /// <param name="e">The <see cref="System.Windows.DependencyPropertyChangedEventArgs"/> instance containing the event data.</param>
            private static void OnMaxLengthChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
            {
                var comboBox = obj as RadComboBox; 
                if (comboBox == null)
                    return;
      
                comboBox.Dispatcher.BeginInvoke(
                    delegate()
                    {
                        var childrenCount = VisualTreeHelper.GetChildrenCount(comboBox);
                        if (childrenCount > 0)
                        {
                            var rootElement = VisualTreeHelper.GetChild(comboBox, 0) as FrameworkElement;
      
                            if (rootElement != null)
                            {
                                TextBox textBox = (TextBox)rootElement.FindName("PART_EditableTextBox");
                                if (textBox != null)
                                {
                                    textBox.SetValue(TextBox.MaxLengthProperty, e.NewValue);
                                }
                            }
                        }
                    });
            }
        }

    -> I´m not the first person who needs this feature on a RadCombobox and has problems with it.

    The RadCombobox has an "IsEditable"  property , but without an "MaxLength" property it is useless.

    What´s about integrating the "MaxLength" property in the RadCombobox in a future version to avoid such problems and support time for us and you?

    Regards,

    Matthias

  9. Yana
    Admin
    Yana avatar
    4554 posts

    Posted 19 Sep 2012 Link to this post

    Hello Matthias,

    I was not able to reproduce the issue, I guess that you've made some customizations to the ComboBox - the code in OnMaxLengthChanged event should work without a problem with the default template of RadComboBox. Could you please open a support ticket and send us a sample project showing the issue?

    Thanks in advance

    All the best,
    Yana
    the Telerik team

    Time to cast your vote for Telerik! Tell DevPro Connections and Windows IT Pro why Telerik is your choice. Telerik is nominated in a total of 25 categories.

  10. Matthias Bibo
    Matthias Bibo avatar
    72 posts
    Member since:
    Mar 2010

    Posted 20 Sep 2012 Link to this post

    Hello,

    I found the issue, it comes, when the combox is not visible initially (e.g. by an converter,...), then there is no child textbox existing in the VisualTree and the code fails.

    This can be solved, by setting the dependency property in the loaded event, but this is only a workaround.

    I implemented my own combobox class, derived from telerik, it is more elegant:

    /// <summary>
       /// Das BDLComboBox
       /// </summary>
       public class BDLComboBox : RadComboBox
       {
           private int maxLength = 0;
           private bool isMaxLengthSet = false;
     
           /// <summary>
           /// Initializes a new instance of the <see cref="BDLComboBox" /> class.
           /// </summary>
           public BDLComboBox()
           {
                  
               this.Loaded += new System.Windows.RoutedEventHandler(this.BDLComboBox_Loaded);
           }
     
           /// <summary>
           /// Gets or sets the length of the max.
           /// </summary>
           /// <value>
           /// The length of the max.
           /// </value>
           public int MaxLength
           {
               get
               {
                   return this.maxLength;
               }
     
               set
               {
                   if (this.maxLength != value)
                   {
                       this.maxLength = value;
                       this.SetMaxLength();
                   }
               }
           }
     
           /// <summary>
           /// Handles the Loaded event of the BDLComboBox control.
           /// </summary>
           /// <param name="sender">The source of the event.</param>
           /// <param name="e">The <see cref="System.Windows.RoutedEventArgs"/> instance containing the event data.</param>
           private void BDLComboBox_Loaded(object sender, System.Windows.RoutedEventArgs e)
           {
               this.SetMaxLength();
           }
     
           /// <summary>
           /// Sets the length of the max.
           /// </summary>
           private void SetMaxLength()
           {
               if (!this.isMaxLengthSet && this.MaxLength > 0)
               {
                   this.Dispatcher.BeginInvoke(
                       delegate()
                       {
                           var childrenCount = VisualTreeHelper.GetChildrenCount(this);
                           if (childrenCount > 0)
                           {
                               var rootElement = VisualTreeHelper.GetChild(this, 0) as FrameworkElement;
     
                               if (rootElement != null)
                               {
                                   TextBox textBox = (TextBox)rootElement.FindName("PART_EditableTextBox");
                                   if (textBox != null)
                                   {
                                       textBox.SetValue(TextBox.MaxLengthProperty, this.MaxLength);
                                       this.isMaxLengthSet = true;
                                   }
                               }
                           }
                       });
               }
           }
       }

  11. Brian Sayatovic
    Brian Sayatovic avatar
    91 posts
    Member since:
    Nov 2009

    Posted 09 Oct 2012 Link to this post

    The code at that URL, http://www.telerik.com/help/silverlight/radcombobox-howto-set-max-length-input-area.html, I think has been updated since this post was last touched.  I'm using the code as it stands and am having problems.

    System.ArgumentOutOfRangeException was unhandled by user code
      Message=Specified argument was out of the range of valid values.
    Parameter name: childIndex
      StackTrace:
           at System.Windows.Media.VisualTreeHelper.GetChild(DependencyObject reference, Int32 childIndex)
           at MyExtensions.TelerikRadComboBox.Editable.<>c__DisplayClass1.<OnMaxLengthChanged>b__0()
      InnerException:

    Catching it in the debugger, this is the line that is failing:

    var rootElement = VisualTreeHelper.GetChild(comboBox, 0) as FrameworkElement;

    The comboBox variable is not null.  Its a valid RadComboBox.  But GetChild doesn't like the index 0 being passed in.  Using the immediate window, I found that comboBox has no children (VisualTreeHelper.GetChildrenCount(comboBox)).

    What gives?
  12. Matthias Bibo
    Matthias Bibo avatar
    72 posts
    Member since:
    Mar 2010

    Posted 09 Oct 2012 Link to this post

    Hello,
    read my post carefully (including sourcecode) and you´ll propably find the answer, I had the same proplem.
    I The code in the How-To is not complete.... You have to check if it has children like following...

    var childrenCount = VisualTreeHelper.GetChildrenCount(this);
     
                           if (childrenCount > 0)
                           {
                                 .....


    But than it did not work for my either, because when the combobox is not visible initally it has not children. I called it maualyy after loading and then it worked.





  13. Brian Sayatovic
    Brian Sayatovic avatar
    91 posts
    Member since:
    Nov 2009

    Posted 09 Oct 2012 Link to this post

    OK, I hadn't seen the whole thread.  Now I do.  That's a shame there isn't a more elegant, self-contained solution from Telerik after all of these years.
  14. Matthias Bibo
    Matthias Bibo avatar
    72 posts
    Member since:
    Mar 2010

    Posted 10 Oct 2012 Link to this post

    I fully agree, because an editable object needs a limitation of the textinput, so a maxlength property is not just a nice to have.

    @Telerik:

    -Please add the MaxLength property as feature request

    -Please update the how-to, so that it is up to date

  15. Vladi
    Admin
    Vladi avatar
    744 posts

    Posted 15 Oct 2012 Link to this post

    Hi,

    Thank you for your feedback.

    We believe that MaxLength property should not be a built-in feature but a feature that needs to be supported in the control which could be easily implemented if needed. With that said we do not have any future plans on implementing it in as a built-in feature in the control.

    As for the "How to" help article we will see if an update is required and we will handle it as soon as possible.

    Greetings,
    Vladi
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

  16. Brian Sayatovic
    Brian Sayatovic avatar
    91 posts
    Member since:
    Nov 2009

    Posted 15 Oct 2012 Link to this post

    Vladi,

    That is very disappointing.  Most controls which allow for any sort of text input allow for MaxLength.  I know RadComboBox is a composite control, so that is more difficult to expose every property for every control that comprises it.  Hence, the idea of the solution in the aforementioned article.

    However, that article's solution doesn't work.  The solution doesn't need a tweak or cleanup, it needs to be reconsidered from scratch.  It does not work for a control that is not yet visible.  The MaxLength ends up never being set because you can't get to the template parts before the control is rendered.

    In my specific case, the RadComboBox is on a non-focused tab in a RadTabControl.  I'll have to string together an event that listens to the control becoming visible before trying to get the template part so I can set the MaxLength.  Rube Goldberg would be delighted.

    I hope you and your Telerik team reconsider simply freshening the article and consider the sizable challenge your customers face with this.
  17. Vladi
    Admin
    Vladi avatar
    744 posts

    Posted 19 Oct 2012 Link to this post

    Hi Brian,

    In this scenario if you want to set the MaxLength to a specific RadComboBox you could set the Style of the ComboBox in the Resources of the control, the next code snippet shows how to do that:
    <telerik:RadComboBox IsEditable="True">
        <telerik:RadComboBox.Resources>
            <Style TargetType="TextBox">
                <Setter Property="MaxLength" Value="5" />
            </Style>
        </telerik:RadComboBox.Resources>
    </telerik:RadComboBox>

    If you don't want to declare the style in all RadComboBox controls in your project you could use Implicit Styles and edit the theme you are using by setting the MaxLength property of the TextBox with x:Name="PART_EditableTextBox".

    We will update the "How to" help article to include the described approaches, thank you for your feedback.

    Greetings,
    Vladi
    the Telerik team

    Explore the entire Telerik portfolio by downloading Telerik DevCraft Ultimate.

Back to Top
DevCraft banner