2012-08-23 42 views
0

我有一个表SampleData,它有一个子表,测量。在我的WinForm中,frmMain,一个SampleData对象绑定到SampleDataBindingSource; MeasurementsBindingSource将SampleDataBindingSource作为其数据源,将Measurements作为其DataMember。一组文本框绑定到SampleDataBindingSource; datagridview绑定到MeasurementsBindingSource。绑定到子实体集的子绑定源不会更新

对于frmMain,我还有一个Presenter类preMain,它包含SampleData类型的属性CurrentSample。 SampleDataBindingSource.DataSource被绑定到preMain的CurrentSample属性。

当足够的测量属性的已分配,它计算FiringFactor和,如果FiringFactor不为1,它增加了一个测量项目的CurrentSample的测量EntitySet的:

Partial Class Measurement 

    Private Sub UpdateFiringFactor() 
     Dim necessaryDataIsAvailable As Boolean = (Me.CrucibleMass IsNot Nothing And _ 
                Me.CrucibleSampleFiredMass IsNot Nothing And _ 
                Me.CrucibleSampleMass IsNot Nothing) 
     If necessaryDataIsAvailable Then 
      Me.FiringFactor = CDbl((Me.CrucibleSampleFiredMass - Me.CrucibleMass)/(Me.CrucibleSampleMass - Me.CrucibleMass)) 
      If Me.FiringFactor <> 1 Then 
       Me.SampleData.AddNewMeasurement() 
      End If 
     End If 
    End Sub 

    Private Sub OnCrucibleMassChanged() 
     UpdateFiringFactor() 
    End Sub 


    Private Sub OnCrucibleSampleFiredMassChanged() 
     UpdateFiringFactor() 
    End Sub 


    Private Sub OnCrucibleSampleMassChanged() 
     UpdateFiringFactor() 
    End Sub 
End Class 

当我输入值对于数据网格视图中的CrucibleMass,CrucibleSampleMass和CrucibleSampleFiredMass,UpdateFiringFactor方法确实运行正常,我最终将另一个Measurement项添加到CurrentSample的Measurements实体集中。但是,datagridview不显示新行,而MeasurementsBindingSource只有1条记录(但是CurrentSample.Measurements.Count = 2)。

为什么CurrentSample.Measurements的变化不会传播到MeasurementsBindingSource?我试过MeasurementsBindingSource.ResetBindings(False),MeasurementsDataGridView.Refresh,SampleDataBindingSource.ResetBindings(False),但似乎没有更新MeasurementsBindingSource或其datagridview。

回答

0

这是我发现的EntitySet的/ BindingSource的问题的解决方案:

Imports System.ComponentModel 

Partial Class Measurement 

    Public Sub ChangeCrucibleMass(ByVal thisMass As Double) 
     CrucibleMass = thisMass 
     UpdateFiringFactor() 
    End Sub 

    Public Sub ChangeCrucibleSampleMass(ByVal thisMass As Double) 
     CrucibleSampleMass = thisMass 
     UpdateFiringFactor() 
    End Sub 

    Public Sub ChangeCrucibleSampleFiredMass(ByVal thisMass As Double) 
     CrucibleSampleFiredMass = thisMass 
     UpdateFiringFactor() 
    End Sub 

    Private Sub UpdateFiringFactor() 
     If AllDataAreAvailable() Then 
      FiringFactor = (CrucibleSampleFiredMass - CrucibleMass)/(CrucibleSampleMass - CrucibleMass) 
      Me.Sample.OnMeasurementsChanged(Nothing, Nothing) 
     End If 
    End Sub 

    Private Function AllDataAreAvailable() As Boolean 
     AllDataAreAvailable = False 
     Dim allFieldsHaveValue As Boolean = (CrucibleMass IsNot Nothing And CrucibleSampleFiredMass IsNot Nothing And CrucibleSampleMass IsNot Nothing) 
     If allFieldsHaveValue Then 
      Dim denominatorIsNotZero As Boolean = (CrucibleSampleMass - CrucibleMass) <> 0 
      Return denominatorIsNotZero 
     End If 

    End Function 

End Class 

Partial Class Sample 

    Public Sub OnMeasurementsChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Handles Me.PropertyChanged 
     If Me.Measurements.Count > 0 AndAlso Me.Measurements.Last.FiringFactor IsNot Nothing AndAlso Me.Measurements.Last.FiringFactor <> 1 Then 
      Me.Measurements.Add(New Measurement With {.CrucibleMass = Me.Measurements.Last.CrucibleMass}) 
      RaiseEvent RefreshMeasurementsBinding() 
     End If 
    End Sub 

    Private Sub OnCreated() 
     Me.Measurements.Add(New Measurement) 
    End Sub 

    Public Event RefreshMeasurementsBinding() 

End Class 

这里的表格截图:

enter image description here

和代码隐藏:

Imports System.ComponentModel 

Public Class Form1 

    Private WithEvents newSample As Sample 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     newSample = SampleConduit.GetSample(1) 
     'newSample = New Sample 
     Me.SampleBindingSource.DataSource = newSample 
     OnRefreshMeasurementsBinding() 

    End Sub 

    Private Sub OnRefreshMeasurementsBinding() Handles newSample.RefreshMeasurementsBinding 
     Me.MeasurementsBindingSource.DataSource = newSample.Measurements.GetNewBindingList 
    End Sub 


    Private Sub MeasurmentsDataGridView_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles MeasurmentsDataGridView.CellClick 
     Me.MeasurementsBindingSource.EndEdit() 
     Dim currentMeasurement = CType(Me.MeasurementsBindingSource.Current, Measurement) 
     Select Case e.ColumnIndex 
      Case 0 
       currentMeasurement.ChangeCrucibleMass(GetMeasurement) 
      Case 1 
       currentMeasurement.ChangeCrucibleSampleMass(GetMeasurement) 
      Case 2 
       currentMeasurement.ChangeCrucibleSampleFiredMass(GetMeasurement) 
     End Select 
    End Sub 

    Private Function GetMeasurement() As Double 
     Return CDbl(InputBox("Measurement:", "Get Measurement", "0")) 
    End Function 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click 
     Dim currentSample = CType(Me.SampleBindingSource.Current, Sample) 
     SampleConduit.SaveSample(currentSample) 
    End Sub 
End Class 

解决方案取决于RefreshMeasurementsBinding前夕在Sample类中的nt和在窗体中的OnRefreshMeasurementsBinding方法。经常将MeasurementsBindingSource设置为Measurements实体集上的GetNewBindingList方法似乎有点不便,但它有效。

见项目#3关于此论坛发帖EntitySets和的BindingSource和GetNewBindingList:

http://www.infragistics.com/community/forums/t/43526.aspx