2012-01-05 63 views
1

在我的表单中,我有一个控件组合框。数据绑定后我想添加文本“选择”。我试试这个WinForm ComboBox在数据绑定后添加文本“选择”

cbOperatorList.DataSource = operatorService.GetOperatorList(); 
cbOperatorList.Items.Insert(0, "Select"); 

但是当我这样做。我得到例外

如果您设置属性 数据源,更改项目的集合是不可能的。

UPDATE

public BindingList<Operator> GetOperatorList(string filter = "") 
{ 
      return 
       new BindingList<Operator>(
        this.operatorRepository.All.Where(
         item => item.FirtsName.Contains(filter) || item.LastName.Contains(filter) || item.MiddleName.Contains(filter)). 
         ToList()); 
} 

UPDATE

我解决了这一问题,使用此代码

cbOperatorList.DataSource = 
       this.operatorService.GetOperatorList().Concat(new[] { new Operator { LastName = "Select", Id = 0 } }).OrderBy(
        item => item.Id).ToList(); 

回答

3

如果GetOperatorList()返回不可变的IEnumerable<T>,则可以使用linq将其与new object[] { "Select" }连接。假设Tobject,你会投:

cbOperatorList.DataSource = operatorService 
    .GetOperatorList() 
    .Cast<object>() 
    .Concat(new object[] { "Select" }); 

编辑

如果你想要的单词“选择”出现之初,反向串联:

cbOperatorList.DataSource = (new object[] { "Select" }) 
    .Concat(
     operatorService.GetOperatorList().Cast<object>() 
    ); 
+0

它可以工作,但文本被追加到末尾 – Greg 2012-01-06 14:17:21

+0

@Greg如果您想在开始处选择“选择”,请参阅编辑的文章。如果你想在中间的某个地方,它会变得更加复杂。 – phoog 2012-01-06 14:27:45

+0

你的代码工作是错误的。因为显示的数据是错误的。我只看到“选择”文本,然后看到对象 – Greg 2012-01-06 14:37:43

1

你没有描述什么GetOperatorList()的回报,但你可以首先设置一个变量le获取该列表并将您的项目插入列表之前将DataSource设置为该变量。

你将不得不重构你的代码来处理这个“选择”项目,以免混淆你的操作符对象。