Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这能起作用而这不能';T_C#_Linq - Fatal编程技术网

C# 为什么这能起作用而这不能';T

C# 为什么这能起作用而这不能';T,c#,linq,C#,Linq,此方法将在第一次加载值为的组合框,但在后续尝试时不会加载值为: public Form1() { InitializeComponent(); comboBox1.DisplayMember = "Name"; comboBox1.ValueMember = "ID"; LoadUsersToComboBox(); } PersonRepository peopleRepo = new Pers

此方法将在第一次加载值为的组合框,但在后续尝试时不会加载值为

    public Form1()
    {
        InitializeComponent();
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "ID";  
        LoadUsersToComboBox();
    }

    PersonRepository peopleRepo = new PersonRepository();

    private void LoadUsersToComboBox()
    {
        comboBox1.DataSource = peopleRepo.FindAllPeople().ToList();          
    }

    private void button2_Click(object sender, EventArgs e)
    {                        
        LoadUsersToComboBox();
    }
为什么第一个只加载第一次

以下是PeopleRepository类的代码:

    private void LoadUsersToComboBox()
    {
        comboBox1.DataSource = peopleRepo.FindAllPeople().ToList();
    }
名称空间SQLite\u测试\u
{
公共类PersonRepository
{
private ScansEntities3 db=新的scansenties3();
公共可查询FindAllPeople()
{
返回db.People;
}
}
}

在这个调用中,您设置的是数据源,而不是实际绑定数据的databind调用。您能在调用.databind的地方发布方法吗?

解决方案很简单:

namespace SQLite_Testing_Grounds
{
    public class PersonRepository
    {
        private ScansEntities3 db = new ScansEntities3();

        public IQueryable<Person> FindAllPeople()
        {
            return db.People;
        }
    }
}
.
这是一个数据绑定的基础,实际上我根本不是WinForms的人(我对WPF了解得更多),但我认为在内部,您有一些类似的东西:

// Nothing changes, DataSource old value is still the same (same reference,
// even is the content of the People list does change).
comboBox1.DataSource = peopleRepo.FindAllPeople();

// ToList() creates a new object each time, so DataSource is assigned to a 
// NEW object, and so calls a kind of invalidation of its visual.
comboBox1.DataSource = peopleRepo.FindAllPeople().ToList();

嗯,您还没有解释什么是
peopleRepo
,或者
FindAllPeople()
做了什么,或者第一个代码的后续尝试出现了什么问题。这使得诊断变得非常困难。我将发布FindAllPeople()的代码。如果您设置comboBox1.DataSource=null,然后使用comboBox1.DataSource=peopleRepo.FindAllPeople();工作正常吗?我认为存在一些延迟加载问题,这是有道理的。有人可以确认吗?实际上,在调用FindAllpeople()之前,您应该尝试将DataSource设置为null或新的空列表。不知道编译器是否会对此进行优化并以静默方式删除中间值,但如果不是,您应该会得到相同的结果,而不需要调用ToList()方法;在发布这个问题之前,结果是一样的。没有更改。因此编译器会对此进行优化,并删除空关联。~可以说是错误的平台。他正在使用更类似于实时数据绑定的东西,我想你和我一样,在ASP.NET中工作。。。
// This method returns the same reference every time
public IQueryable<Person> FindAllPeople()
{
    return db.People;
}
// Nothing changes, DataSource old value is still the same (same reference,
// even is the content of the People list does change).
comboBox1.DataSource = peopleRepo.FindAllPeople();

// ToList() creates a new object each time, so DataSource is assigned to a 
// NEW object, and so calls a kind of invalidation of its visual.
comboBox1.DataSource = peopleRepo.FindAllPeople().ToList();
private object dataSource;
public object DataSource {
    get {
        if (value != dataSource) {
            dataSource = value;
            RaisePropertyChanged("DataSource");
        }
    }
}