代码之家  ›  专栏  ›  技术社区  ›  Josh Smeaton

在Windows窗体(VB)中更改数据源时,为什么这些组合框不能正确更新?

  •  0
  • Josh Smeaton  · 技术社区  · 15 年前

    在Windows窗体项目中,我有几个组合框。第一个组合框包含对象列表。然后,这些对象有几个列表,这些列表用作后续组合框的数据源,具体取决于在第一个组合框中选择的项。

    选择第一个项目后,其他组合框将正确更新。第二次(或任何连续时间)更改此项时,其他组合框不会正确更新。调试时,它显示其他组合框的数据源分配正确,项目数正确。但这些项目实际上并没有显示出来。原因可能是什么?

    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
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Josh Smeaton    15 年前

    使用Reflector查看设置数据源时会发生什么,调用以下方法:

    base.DataSource = value;
    

    这样做的目的是:

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

    设置数据连接:

    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
    

    如果用guid.newguid.toString手动设置displaymember,则数据源将正确更新。数据源比较似乎正在确定它们是否相同,而实际上它们并不相同。即使当我调用.datasource=new list(of…)(list)时,它也不会正确更新。

    object.equals方法执行以下操作:

     InternalEquals(object objA, object objB);
    

    我假设这是一个指针比较?编译器可能正在进行的优化是否会缓存一个列表对象,然后在运行时用所需的值填充该列表?创建对象时,我确信每个列表都是一个新列表(类型)。