2016-08-03 48 views
0

我想实现类似的Google搜索栏我们的应用程序的行为:用户必须能够输入用户名作为自由文本并根据输入的数据系统必须提供几个基于已有用户名的弹出栏上的建议。WinForms:提供带有动态建议弹出的文本编辑器


下面是简要算法:

  • 用户输入一些字符文本编辑框
  • 系统触发一个Web服务调用一些改变事件里面的更新建议列表数据
  • 文本编辑还必须提供输入和保留自由文本以创建新用户的能力,而不仅仅是查找存在的

我不能使用devexpress的lookupeditds - 它们允许只保留值,在数据源呈现 - 即使新的价值已被内部处理ProcessNewValue加入到数据源,

更改事件触发一个更多的时间与我的清爽数据源覆盖新的独特价值。 现在我期待Combobox控制。但看起来像没有能力输入自由文本旁边显示建议弹出。

+1

如果您对第三方库开放,Infragistics NetAdvantage for Windows Forms有一个我们广泛使用的伟大的自动建议组合框。它正是你想要达到的。 – Mangist

+0

@Mangist谢谢你的建议。不知道它可能在我的项目中:-( –

+1

您可以使用常规的Windows窗体组合然后使用AutoCompleteMode属性。https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox .autocompletemode(v = vs.110).aspx作为用户类型,您将不得不击中数据库,然后重新加载ComboBox中的Items列表。我将使用DataSource,DisplayMember,ValueMember。您可以使其工作,我 – Mangist

回答

1

我不能使用的DevExpress的查询编辑 - 它们允许只保留值,在数据源呈现 - 即使新的价值已经被内部ProcessNewValue处理,加入到数据源,

我相信你”再错在这里,因为你可以使用的DevExpress LookUpEdit方便:

class AutoCompleteLookUpEdit : LookUpEdit { 
    List<string> suggestions = new List<string>(); 
    public AutoCompleteLookUpEdit() { 
     Properties.DataSource = suggestions; 
     Properties.ImmediatePopup = true; 
    } 
    protected override void ProcessFindItem(KeyPressHelper helper, char pressedKey) { 
     suggestions.Clear(); 
     // add search suggestions here depending on helper.Text value 
     suggestions.Add("google"); 
     suggestions.Add("devexpress"); 
     // ... 
     base.ProcessFindItem(helper, pressedKey); 
    } 
} 

看看在How to create an editor with a dynamic autocomplete list了详细的例子。

P.S.您可以使用AcceptEditorTextAsNewValue属性来控制查找是否接受输入的文本作为有效值,即使它不属于基础数据源。

+0

不幸的是,仍有相同的结果 - 在离开编辑器后,它包含[Edit Value is null]而不是新值... –

+0

保持输入值的唯一方法是将它们添加到数据源中,但我不希望它与实际建议一起可见。 –

+0

最后得到它 - 必须在ProcessNewValue事件内处理新值。现在它可以无缝工作,并且和预期一样非常感谢德米特里! –