2009-09-27 1 views
0

Windows 양식 프로젝트에는 여러 콤보 상자가 있습니다. 첫 번째 콤보 상자에는 개체 목록이 포함되어 있습니다. 그런 다음 해당 객체는 첫 번째 항목에서 선택되는 항목에 따라 연속적인 콤보 상자의 데이터 소스로 사용되는 여러 목록을 갖습니다.Windows Forms (VB)에서 데이터 소스를 변경할 때 이러한 콤보 상자가 올바르게 업데이트되지 않습니다.

첫 번째 항목을 선택하면 다른 콤보 상자가 올바르게 업데이트됩니다. 이 항목을 두 번 또는 다른 시간을 변경하면 다른 콤보 상자가 올바르게 업데이트되지 않습니다. 디버깅 할 때 다른 콤보 상자의 데이터 소스가 올바르게 할당되어 있고 항목 수가 올바르게 표시됩니다. 그러나 항목은 실제로 표시되지 않습니다. 그 원인은 무엇일까요?

Private Sub cmbPackage_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPackage.SelectedIndexChanged 
    // The Package controls what other options are available. 
    If (TypeOf (cmbPackage.SelectedItem) Is Package) Then 
     // Set current package as a member object to see if it was a scoping issue 
     _currentPackage = CType(cmbPackage.SelectedItem, Package) 
     ClearOptionDropdowns() 
     cmbReward.DataSource = _currentPackage.Rewards 
     cmbPayment.DataSource = _currentPackage.PaymentTypes 
     cmbCommMethod.DataSource = _currentPackage.CommunicationMethods 
     cmbBillMethod.DataSource = _currentPackage.BillMethods 
     cmbNotification.DataSource = _currentPackage.BillNotifications 

     cmbReward.Refresh() 
     cmbPayment.Refresh() 
     cmbCommMethod.Refresh() 
     cmbBillMethod.Refresh() 
     cmbNotification.Refresh() 
     ... 
     ... 
End Sub 

Private Sub ClearOptionDropdowns() 
    cmbReward.DataSource = Nothing 
    cmbPayment.DataSource = Nothing 
    cmbCommMethod.DataSource = Nothing 
    cmbBillMethod.DataSource = Nothing 
    cmbNotification.DataSource = Nothing 
    ' Also had x.items.clear(), but removed to see if that was affecting it 
End Sub 
+0

'.DataSource = Nothing'을 설정 한 후 콤보 상자에서'.Refresh()'메서드를 호출 해 보았습니까? – ChrisF

+0

방금 ​​시도했지만 작동하지 않았습니다. –

답변

1

데이터 소스가 설정되어있을 때, 다음과 같은 메소드가 호출 될 때 어떻게되는지 반사판을 사용하여 :

if (this.dataSource != value) 
    { 
     try 
     { 
      this.SetDataConnection(value, this.displayMember, false); 
     } 

SetDataConnection :

private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force) 
{ 
    bool flag = this.dataSource != newDataSource; 
    bool flag2 = !this.displayMember.Equals(newDisplayMember); 
    if (!this.inSetDataConnection) 
    { 
     try 
     { 
      if ((force || flag) || flag2) 
      { 
       // Update Accordingly 
다음이 수행

base.DataSource = value; 

내가 제조하는 경우 Guid.NewGuid.ToString을 사용하여 DisplayMember를 설정하면 데이터 소스가 올바르게 업데이트됩니다. 데이터 소스 비교는 가장 확실하게 그렇지 않을 때 데이터 소스 비교가 동일하다고 판단하는 것 같습니다. .DataSource = new List (Of ...) (list)를 호출해도 올바르게 업데이트되지 않습니다. 내가 믿고있어

InternalEquals(object objA, object objB); 

포인터 비교를 수행합니다

Object.Equals 방법이 무엇입니까? 컴파일러가 하나의 List 객체를 캐시하고 런타임에 필요한 값으로 해당 목록을 채울 수있는 최적화가 있습니까? 나는 각 List가 객체가 생성 될 때 새로운 List (Of Type)임을 확신한다.

관련 문제