如何将List<string>转换为AutoCompleteStringCollection

6
我有一个列表,想要将其转换为autoCompleteStringCollection。我不想使用foreach。
        _textbox.AutoCompleteMode = AutoCompleteMode.Append;
        _textbox.AutoCompleteSource = AutoCompleteSource.CustomSource;
        _textbox.AutoCompleteCustomSource = user.GetNameUsers() as AutoCompleteStringCollection;

请注意,user.GetNameUsers()是一个列表。

代码不起作用,它变成了null。

谢谢。


1
需要注意的是:你得到 null 的原因是 as 运算符试图将你的 List<string> 强制转换为 AutoCompleteStringCollection,但是 as 只有在运行时类型匹配时才会成功(它不会尝试任何用户定义的转换),而 List<string> 和 AutoCompleteStringCollection 的运行时类型不同,因此它返回 null。 - Matt Ellen
我明白了,谢谢。让它更易懂。 - aeruL
1
this.textbox.AutoCompleteCustomSource.AddRange(new string[] {"anytext","another one"}); - Rishav
2个回答

26
_textbox.AutoCompleteMode = AutoCompleteMode.Append;
_textbox.AutoCompleteSource = AutoCompleteSource.CustomSource;
var autoComplete = new AutoCompleteStringCollection();
autoComplete.AddRange(user.GetNameUsers().ToArray());
_textbox.AutoCompleteCustomSource = autoComplete;

如果您经常需要这样做,可以编写一个扩展方法:

public static class EnumerableExtensionsEx
{
    public static AutoCompleteStringCollection ToAutoCompleteStringCollection(
        this IEnumerable<string> enumerable)
    {
        if(enumerable == null) throw new ArgumentNullException("enumerable");
        var autoComplete = new AutoCompleteStringCollection();
        foreach(var item in enumerable) autoComplete.Add(item);
        return autoComplete;
    }
}

使用方法:

_textbox.AutoCompleteCustomSource = user.GetUsers().ToAutoCompleteStringCollection();

并且,如果你希望将其变成一行代码,则可以将其封装在一个实用方法中。 - driis
在执行此操作时,请确保从查询中删除任何空值。我没有这样做,当设置AutoCompleteCustomSource时,它会崩溃,而没有任何错误消息或调试信息。 - jaredbaszler

2

在查看了 AutoCompleteStringCollection 的文档,特别是构造函数后,我发现没有可以接受 List 的构造函数。

因此,您有两个选择。

1)使用 AddRange 将所有列表项添加到新的 AutoCompleteStringCollection 实例中。

var acsc= new AutoCompleteStringCollection();
acsc.AddRange(user.GetNameUsers().ToArray());

2)继承一个新类,添加所需的构造函数,并在内部调用与上述代码相似的代码。

public class MyAutoCompleteStringCollection : AutoCompleteStringCollection
{
  public MyAutoCompleteStringCollection(IEnumerable items)
  {
     this.AddRange(items.ToArray())
  }
}

因此,您可以使用
_textbox.AutoCompleteCustomSource = new MyAutoCompleteStringCollection (user.GetNameUsers());

个人而言,我现在会选择选项1。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接