2009-02-02 7 views
7

Tôi gặp hầu như cùng một vấn đề như thế này:Cập nhật một databound ComboBox

C# Update combobox bound to generic list

Tuy nhiên, tôi đang cố gắng để thay đổi chuỗi hiển thị; không thêm, xóa hoặc sắp xếp. Tôi đã thử giải pháp BindingList được cung cấp trong câu hỏi được tham chiếu, nhưng nó đã không giúp được gì. Tôi có thể thấy thuộc tính DataSource của combobox được cập nhật chính xác khi tôi chỉnh sửa các mục, nhưng nội dung được hiển thị trong hộp tổ hợp không phải là nội dung trong thuộc tính DataSource.

mã của tôi trông như sau:

mSearchComboData = new List<SearchData>(); 
mSearchComboData.Add(new SearchData("", StringTable.PatientID)); 
mSearchComboData.Add(new SearchData("", StringTable.LastName)); 
mSearchComboData.Add(new SearchData("", StringTable.LastPhysician)); 
mSearchComboData.Add(new SearchData("", StringTable.LastExamDate)); 

mBindingList = new BindingList<SearchData>(mSearchComboData); 

SearchComboBox.Items.Clear(); 
SearchComboBox.DataSource = mBindingList; 
SearchComboBox.ValueMember = "Value"; 
SearchComboBox.DisplayMember = "Display"; 

... 

Khi tôi cố gắng cập nhật các nội dung tôi làm như sau:

int idx = SearchComboBox.SelectedIndex; 
mBindingList[idx].Display = value; 
SearchComboBox.Refresh(); 

EDIT ::

RefreshItems có vẻ là một phương pháp riêng . Tôi chỉ nhận được thông báo lỗi:

" 'System.Windows.Forms.ListControl.RefreshItems()' là không thể tiếp cận do mức độ bảo vệ của nó"

ResetBindings không có tác dụng.

Trả lời

11

Nếu bạn thay đổi toàn bộ đối tượng, nghĩa là toàn bộ đối tượng SearchData, danh sách liên kết sẽ có kiến ​​thức về thay đổi này, và do đó các sự kiện chính xác sẽ bị phát ra và combobox sẽ cập nhật. BAO GIỜ, vì bạn chỉ cập nhật một thuộc tính, danh sách ràng buộc không có ý tưởng rằng một cái gì đó đã thay đổi.

Những gì bạn cần làm là yêu cầu lớp SearchData của bạn triển khai INotifyPropertyChanged. Dưới đây là một ví dụ nhanh chóng tôi đã viết để chứng minh:

public class Dude : INotifyPropertyChanged 
    { 
     private string name; 
     private int age; 

     public int Age 
     { 
      get { return this.Age; } 
      set 
      { 
       this.age = value; 
       if (this.PropertyChanged != null) 
       { 
        this.PropertyChanged(this, new PropertyChangedEventArgs("Age")); 
       } 
      } 
     } 
     public string Name 
     { 
      get 
      { 
       return this.name; 
      } 

      set 
      { 
       this.name = value; 
       if (this.PropertyChanged != null) 
       { 
        this.PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 


    } 

Và đây là một số mã để kiểm tra:

 private void button1_Click(object sender, EventArgs e) 
     { 
      //Populate the list and binding list with some random data 
      List<Dude> dudes = new List<Dude>(); 
      dudes.Add(new Dude { Name = "Alex", Age = 27 }); 
      dudes.Add(new Dude { Name = "Mike", Age = 37 }); 
      dudes.Add(new Dude { Name = "Bob", Age = 21 }); 
      dudes.Add(new Dude { Name = "Joe", Age = 22 }); 

      this.bindingList = new BindingList<Dude>(dudes); 
      this.comboBox1.DataSource = bindingList; 
      this.comboBox1.DisplayMember = "Name"; 
      this.comboBox1.ValueMember = "Age"; 

     } 


    private void button3_Click(object sender, EventArgs e) 
    { 
     //change selected index to some random garbage 
     this.bindingList[this.comboBox1.SelectedIndex].Name = "Whatever"; 
    } 

Từ lớp của tôi bây giờ thực hiện INotifyPropertyChanged, danh sách ràng buộc được "thông báo" khi một cái gì đó thay đổi, và tất cả điều này sẽ làm việc.

+0

Tôi đã thử khoảng 13 phương pháp khác nhau để có được combobox trên biểu mẫu của tôi để cập nhật, sau đó cuối cùng đã tìm thấy giải pháp này. Tốt bằng văn bản, và làm việc như một say mê. Cảm ơn! –

2

thay vì SearchComboBox.Refresh();

thử SearchComboBox.RefreshItems();

hoặc SearchComboBox.ResetBindings();

Tôi nghĩ rằng nó thực sự là sau này mà bạn cần.

Bạn có thể truy cập tài liệu cho các thành viên là here.

+0

RefreshItems được bảo vệ – Maxence

2

Đây là một bài đăng cũ nhưng điều này có thể hữu ích.

Tôi vừa xem xét cùng một vấn đề và nhận thấy rằng nếu bạn gọi ResetItem trên đối tượng BindingList, với vị trí Mục đã thay đổi, nội bộ sẽ tăng sự kiện thông báo Itemchanged cho bạn làm danh sách cập nhật.

int idx = SearchComboBox.SelectedIndex; 
mBindingList[idx].Display = value; 

mBindingList.ResetItem(idx); //raise Item changed event to update the list display