GXT Combobox:键入一个不在列表中的值并保留它

时间:2013-06-17 13:20:34

标签: gwt combobox gxt

我尝试让GXT组合框(3.0.1)接受我输入的文字,但它会在模糊时不断删除它。是不是可以告诉组合框接受一个不属于其列表库的值?

PS:setForceSelection(false)没有做我想要的事情:))

1 个答案:

答案 0 :(得分:2)

评论中提到的错误集中在ComboBox<String>,因为从用户输入的数据(也称为字符串)到组合中的数据(也是字符串)存在自然映射。如果你没有这样的自然映射,那么最新版本对你没有多大帮助 - 也就是说,你仍然可以做到这一点。

ComboBox使用PropertyEditor来呈现数据,在解析数据时查找并返回商店中的值,还可以将任意数据转换为T值。它委托ComboBoxCell.selectByValue(String)找到匹配的值。

应该可以覆盖该方法并提供新行为,或者根据ComboBox中的内置函数创建自定义PropertyEditor<T>,如果找不到任何内容,将根据您的规则创建新对象。也许是这样的事情:

ComboBox<MyObject> combo = new ComboBox<MyObject>(new ComboBoxCell<MyObject>(store, labelProvider){
  @Override
  protected MyObject selectByValue(String value) {
    MyObject val = super.selectByValue(value);
    if (val == null) {
      // custom logic for creating new objects goes here
      val = new MyObject();
      val.setDisplayName(value);
    }
    return val;
  }
});

如果您最终做了很多事情,请考虑将其分解出来,以便您可以将委托交给负责从字符串中制作自定义对象的组合框。


原始回答,重点关注ComboBox<String>

除了评论中提到的错误报告之外,还有另一个涉及同一问题的错误(也许应该关闭) - http://www.sencha.com/forum/showthread.php?196281-GXT-3-rc2-ComboBox-setForceSelection%28false%29-does-not-work/page2。这不仅讨论了错误本身,以及为什么它是一个问题,而且还讨论了使用PropertyEditor来获取可能不在其中的其他值的可能实现 - 您应该能够调整它以使其更具体对你的情况。

来自该帖子的笔记(复制到这里以避免链接死亡):

  

将其设为ComboBox<String>,而不是试图告诉ComboBox新字符串不是错误,而是给它一个自定义PropertyEditor<String>PropertyEditor的目的(名称是来自2.x的保留,在编辑框架之类的东西之前)是将用户输入的文本转换为可以从代码中使用的值,并且反之亦然 - 如何将模型对象中的值打印到屏幕上的文本中。

     

PropertyEditor的默认ComboBox(实际上是ComboBoxCell)是ComboPropertyEditor - 它使用受保护的方法T selectByValue(String)来尝试找出什么值在商店中匹配当前字符串。

     

正如我所说,如果你想支持任何字符串值,这是一个很好的方法,如果它适合,可以向Store添加一个值,或者只是说'是的,该字符串是一个字符串,字符串是值' - 无需针对商店中的每个价值进行测试。

     

那说,是的,我们当前对clearValueOnParseError = false的行为显然没有意义,并且鉴于2.x和3之间的差异,很可能forceSelection没有意义。我目前正专注于我们如何使clearValueOnParseError工作 - 并尝试确保它足以满足forceSelection行为。