Mẫu công khai1()
{
InitializeComponent();
comboBox1.DisplayMember = "Tên";
comboBox1.ValueMember = "ID";
LoadUsersToComboBox();
}
PersonRepository peopleRepo = new PersonRepository();
khoảng trống riêng tư LoadUsersToComboBox()
{
comboBox1.DataSource = peopleRepo.FindAllPeople().ToList();
}
private void button2_Click(object sender, EventArgs e)
{
LoadUsersToComboBox();
}
Phương pháp này trước tiên sẽ仅Hộp tổ hợp có giá trị được tải nhưng không được tải trong các lần thử tiếp theo:
khoảng trống riêng tư LoadUsersToComboBox()
{
comboBox1.DataSource = peopleRepo.FindAllPeople() /*Trả về IQueryable*/
}
Mỗi lần tôi gọi LoadUsersToComboBox() nó sẽ tải:
khoảng trống riêng tư LoadUsersToComboBox()
{
comboBox1.DataSource = peopleRepo.FindAllPeople().ToList();
}
Tại sao cái đầu tiên chỉ tải lần đầu tiên?
Đây là mã cho lớp PeopleRepository:
không gian tên SQLite_Testing_Grounds
{
lớp công khai PersonRepository
{
ScansEntities3 riêng tư db = ScansEntities3 mới();
công khai IQueryable FindAllPeople()
{
trả về db.People;
}
}
}
Giải pháp rất đơn giản:
// Phương thức này trả về cùng một tham chiếu mỗi lần
công khai IQueryable FindAllPeople()
{
trả về db.People;
}
kết quả:
// Không có gì thay đổi, giá trị cũ của DataSource vẫn giữ nguyên (cùng tham chiếu,
// ngay cả khi nội dung của danh sách Người thay đổi).
comboBox1.DataSource = peopleRepo.FindAllPeople();
// ToList() mỗi lần tạo một đối tượng mới, do đó DataSource được gán cho một đối tượng
// Đối tượng MỚI và do đó gọi là một kiểu vô hiệu hóa hình ảnh của nó.
comboBox1.DataSource = peopleRepo.FindAllPeople().ToList();
.
Đây là những điều cơ bản về ràng buộc dữ liệu, tôi thực sự không phải là người WinForms (tôi biết nhiều hơn về WPF), nhưng tôi nghĩ trong nội bộ bạn có một cái gì đó như:
nguồn dữ liệu đối tượng riêng tư;
đối tượng công cộng DataSource {
get {
if (giá trị != dataSource) {
dataSource = giá trị;
RaisePropertyChanged("DataSource");
}
}
}
Tôi là một lập trình viên xuất sắc, rất giỏi!