我正确使用IEnumerable吗?

时间:2012-12-10 08:32:18

标签: c#

我对以下代码感到头疼。似乎很直接,但我不明白为什么会出错。

这个想法很简单,我只是循环将DataGirdView的引用添加到ViewModel的属性中。就是这样。

但在我修改ViewModel中的值后,IEnumerable<ICompanyViewModel> vms不会反映它,就好像它没有发生一样。我做错了什么?请帮忙。

    public void UpdateCompany(IEnumerable<ICompanyViewModel> vms) {
        CompanyBindingSource.DataSource = new BindingListView<CompanyViewModel>(vms.ToList());
        var lst = new List<DataGridViewRow>();
        foreach (DataGridViewRow dgvr in DataGridView1.Rows) lst.Add(dgvr);
        foreach (var vm1 in vms) { 
            foreach (var dgvr in lst) {
                var ov = (ObjectView<CompanyViewModel>)dgvr.DataBoundItem;
                var vm2 = (ExhibitorViewModel)ov.Object;
                if (vm1.ID == vm2.ID) {
                    vm1.DataGridViewRow = dgvr;
                    break;
                }
            }                
            if (vm1.DataGridViewRow != null) lst.Remove(vm1.DataGridViewRow); 

        } // I can see DataGridViewRows being matched with vm1.
    }     // Then, I expand IEnumerable 'vms' and check the value again. All
          // the ViewModels lost their references to the matching DataGridViewRows.
          // In every ViewModel.DataGridViewRow = null; WHY IS THIS HAPPENING?? 


//.... here is the background code of my model

public class CompanyViewModel : BaseViewModel, ICompanyViewModel {
    public DataGridViewRow DataGridViewRow { get; set; }
    public ICompany Company { get; set; }
    public long ID {
        get { return Company.ID; }
    }
    public string Name {
        get { return Company.Name; }
        set { Company.Name = value; }
    }
}    
public interface ICompanyViewModel : IViewModel {
    DataGridViewRow DataGridViewRow { get; set; }
    public ICompany Company { get; set; }
    long ID { get; }
    string Name { get; set; }
}
public interface IViewModel { }
public abstract class BaseViewModel : IViewModel { }

2 个答案:

答案 0 :(得分:0)

好吧,如果你正在使用IEnumerable<T>,你必须手动(明确地)说出绑定机制(无论它是什么),更新!

如果您不喜欢这个想法,请考虑改用ObservableColelction。 在这种情况下,.net framework本身可以跟踪该集合中发生的AddRemove事件,并更新绑定到的绑定。

答案 1 :(得分:0)

问题的根源:IEnumerable的多次枚举

我正在错误地使用IEnumerable。根据Resharper,我应该真正调用.ToList();一旦我得到IEnumerable的列表&lt; ICompanyViewModel&gt;虚拟机。

否则,每次我打电话给foreach ...我都在有效地再次调用数据库!哦,这是非常重要的,不要弄错,幸运的是我发现了。