0

子テーブルMeasurementsを持つテーブルSampleDataがあります。私のWinForm、frmMainでは、単一のSampleDataオブジェクトがSampleDataBindingSourceにバインドされています。MeasurementsBindingSourceには、データソースとしてSampleDataBindingSourceがあり、DataMemberとしてMeasurementsがあります。テキストボックスのセットはSampleDataBindingSourceにバインドされています。datagridviewはMeasurementsBindingSourceにバインドされています。

frmMainの場合、SampleDataタイプのプロパティCurrentSampleを含むプレゼンタークラスpreMainもあります。はSampleDataBindingSource.DataSourcepreMainのCurrentSampleプロパティにバインドされています。

Measurementsのプロパティが十分に割り当てられると、FiringFactorが計算され、FiringFactorが1でない場合は、CurrentSampleのMeasurementエンティティセットに別のMeasurementアイテムが追加されます。

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メソッドが正しく実行され、最終的に別の測定項目がCurrentSampleの測定エンティティセットに追加されます。ただし、datagridviewには新しい行が表示されず、MeasurementsBindingSourceには1つのレコードしかありません(ただしCurrentSample.Measurements.Count = 2)。

CurrentSample.Measurements変更がに伝播しないのはなぜMeasurementsBindingSourceですか?MeasurementsBindingSource.ResetBindings(False)、、を試しましたがMeasurementsDataGridView.RefreshSampleDataBindingSource.ResetBindings(False)何も更新されていないようMeasurementsBindingSourceです。

4

1 に答える 1

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

フォームのスクリーンショットは次のとおりです。

ここに画像の説明を入力

コードビハインド:

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

解決策は、Sample クラスの RefreshMeasurementsBinding イベントとフォームの OnRefreshMeasurementsBinding メソッドにかかっています。MeasurementsBindingSource を Measurements エンティティセットの GetNewBindingList メソッドに頻繁に設定するのは少し面倒に思えますが、うまくいきます。

このフォーラムの投稿で、EntitySets と BindingSource および GetNewBindingList に関する項目 #3 を参照してください。

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

于 2012-09-05T00:02:14.833 に答える