如何在可编辑的ComboBox中设置TextInput的“maxChars”?

时间:2009-05-11 18:44:20

标签: actionscript-3 flex combobox textinput

我想设置可编辑ComboBox的TextInput的maxChars属性。我目前正在使用更改事件将文本修剪为一定数量的字符:

private function nameOptionSelector_changeHandler(event:ListEvent):void
{
    nameOptionSelector.text = nameOptionSelector.text.substr(0, MAX_LENGTH);
}

这感觉有点矫枉过正。必须有更好的方法来做到这一点......

3 个答案:

答案 0 :(得分:2)

我的替代方法是直接使用受保护的textInput。此方法允许在GUI构建器或代码中设置“maxChars”属性,就像使用普通TextField一样。请注意,零是maxChars的有效值,表示无限制字符。需要覆盖.childrenCreated()以避免在TextInput对象存在之前尝试设置maxChars。

package my.controls
{
    import mx.controls.ComboBox;

    public class EditableComboBox extends ComboBox
    {
        public function EditableComboBox()
        {
            super();
        }

        private var _maxChars:int = 0;

        override protected function childrenCreated():void
        {
            super.childrenCreated();

            // Now set the maxChars property on the textInput field.
            textInput.maxChars = _maxChars;
        }

        public function set maxChars(value:int):void 
        {
            _maxChars = value;
            if (textInput != null && value >= 0)
                textInput.maxChars = value;
        }

        public function get maxChars():int 
        {
            return textInput.maxChars;
        }

  }
}

答案 1 :(得分:1)

您可以扩展ComboBox并覆盖内部maxChars的默认TextInput值。如果需要动态设置它,可以添加一个公共方法来设置扩展类的属性。

答案 2 :(得分:0)

使用Stiggler的建议,这是我实施的完整解决方案:

package
{
    import mx.controls.ComboBox;

    public class ComboBoxWithMaxChars extends ComboBox
    {
        public function ComboBoxWithMaxChars()
        {
            super();
        }

        private var _maxCharsForTextInput:int;

        public function set maxCharsForTextInput(value:int):void
        {
            _maxCharsForTextInput = value;

            if (super.textInput != null && _maxCharsForTextInput > 0)
                super.textInput.maxChars = _maxCharsForTextInput;
        }

        public function get maxCharsForTextInput():int
        {
            return _maxCharsForTextInput;
        }

        override public function itemToLabel(item:Object):String
        {
            var label:String = super.itemToLabel(item);

            if (_maxCharsForTextInput > 0)
                label = label.substr(0, _maxCharsForTextInput);

            return label;
        }
    }
}