2016-06-04 7 views
1

Guten Tag,Binden eines SortedList als Datenquelle meiner Datagridview

ich eine Klasse habe, wo ich Hypothekenzahlungen für jeden Monat zu berechnen. In dieser Klasse habe ich eine Datenstruktur, in der ich die Eigenschaften jeder Hypothekenzahlung hinterlege, die in einer Schleife berechnet werden. Ich habe dann SortedList wo ich jede Hypothekenzahlung hinterlasse. In der Klasse habe ich eine Funktion, die diese SortedList zurückgibt.

In meiner Benutzeroberfläche rufe ich die Funktion auf, die die SortedList zurückgibt und an eine DataSource bindet. Ich setze diese DataSource zu einem DataGridView, aber wenn ich das Programm ausführe, zeigt das DataGridView nur leere Zeilen ohne Werte an.

Das ist mein classs (genannt Abschreibungen)

Und nach dem End Function ist meine Berufung der Funktion

Public Function GetMonthlyPaymentDetails() As SortedList(Of Integer, MonthlyPeriod) 
    Dim counter As Integer = 1 

    Period.PaymentDate = Today 
    Period.CumulativeInterest = 0 
    Period.EndingBalance = Principal 
    Period.ScheduledPayment = ComputeScheduledPayment() 
    Do 

     Period.BeginningBalance = Period.EndingBalance 
     Period.Interest = GetInterestPerPayment(Period.BeginningBalance) 
     Period.Principal = GetPrincipalPerPayment(Period.ScheduledPayment, Period.Interest) 
     Period.EndingBalance = GetEndingBalance(Period.BeginningBalance, Period.Principal) 
     Period.CumulativeInterest = AccumilateInterest(Period.CumulativeInterest, Period.Interest) 
     'ArrayPeriod(counter) = Period 
     ArrayPeriod.Add(counter, Period) 
     counter += 1 
     'Loop Until Period.EndingBalance = 0 
    Loop Until counter = 240 
    Return ArrayPeriod 
End Function 

Wie Funktion

Dim ABindingSource As New BindingSource 
    a.GetMonthlyPaymentDetails() 
    ABindingSource.DataSource = a.ArrayPeriod 
    AmortizationGrid.DataSource = ABindingSource 

Antwort

1

A SortedList nicht a genannt wird geeignete Datenquelle für eine DataGridView. Jedes Element in der Liste ist ein KeyValuePair, so dass das Raster nur String Darstellungen des Key und des Value anzeigen kann. Wenn Sie die Eigenschaften der Objekte MonthlyPeriod erwarten, müssen Sie eine Liste der Objekte MonthlyPeriod binden. Sie könnten das von der Values Eigenschaft der SortedList bekommen.

+0

Wie genau verbinde ich MonthlyPeriod als Liste? –

+0

Wie ich in meiner Antwort sagte, können Sie eine Liste von 'MonthlyPeriod' Objekte aus der' Values' Eigenschaft der 'SortedList' erhalten und dann binden Sie – jmcilhinney

+0

Macht Sinn, stattdessen habe ich eine Liste verwendet und ich sehe die tatsächlichen Ergebnisse jetzt. Danke vielmals –

0

jmcilhinney hat eine gute Antwort gegeben. FWIW, ich hatte diesen Code für einen einfachen Darlehensrechner, von dem ich dachte, ich würde ihn teilen. Hier ist, wie es getestet wurde

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim foo As New LoanCalc(300000, 3.73D, 360) 
    DataGridView1.DataSource = foo.Schedule 
End Sub 

und hier ist die LoanCalc Klasse

Public Class LoanCalc 

    'payment 
    '   iA 
    ' P = ------------ 
    '  1-((1+i)^-n) 
    ' 
    ' 
    'loan balance after n paymnets 
    'Balance = A(1+i)^n-P/i((1+i)^n-1) 
    ' 
    'P is payment, i is interest rate, A is loan amount, n is the number of payments 

    Private _amt As Decimal = 0 'loan amount 
    Private _term As Integer = 0 'term of loan in months 
    Private _rate As Decimal = 0 'interest rate/period (rate/12) 
    Private _payment As Decimal = 0 'payment 
    Private Shared ReadOnly zeroPercent As Decimal = 1D/1000000000 'a kludge 

    ''' <summary> 
    ''' create loan object 
    ''' </summary> 
    ''' <param name="loanmAmt">the amount of the loan</param> 
    ''' <param name="interestRate">interest rate, e.g. 4.5 or .045 for 4.5%</param> 
    ''' <param name="TermMonths">loan length in months</param> 
    ''' <remarks></remarks> 
    Public Sub New(loanmAmt As String, interestRate As String, TermMonths As String) 
     Me._amt = Decimal.Parse(loanmAmt) 
     Dim r As Decimal = Decimal.Parse(interestRate) 
     If r >= 1 Then 
      Me._rate = r/100D 
     Else 
      Me._rate = r 
     End If 
     Me._rate /= 12D 
     If Me._rate = 0D Then Me._rate = zeroPercent 
     Me._term = Integer.Parse(TermMonths) 
     Me._payment = CDec(-((Me._rate * Me._amt)/(1 - ((1 + Me._rate)^-Me._term)))) 
    End Sub 

    ''' <summary> 
    ''' create loan object 
    ''' </summary> 
    ''' <param name="loanmAmt">the amount of the loan</param> 
    ''' <param name="interestRate">interest rate, e.g. 4.5 or .045 for 4.5%</param> 
    ''' <param name="TermMonths">loan length in months</param> 
    ''' <remarks></remarks> 
    Public Sub New(loanmAmt As Decimal, interestRate As Decimal, TermMonths As Integer) 
     Me._amt = loanmAmt 
     If interestRate >= 1 Then 
      Me._rate = interestRate/100D 
     Else 
      Me._rate = interestRate 
     End If 
     Me._rate /= 12D 
     If Me._rate = 0D Then Me._rate = zeroPercent 
     Me._term = TermMonths 
     Me._payment = CDec(-((Me._rate * Me._amt)/(1 - ((1 + Me._rate)^-Me._term)))) 
    End Sub 

    Public Function LoanAmount() As Decimal 
     Return Me._amt 
    End Function 

    Public Function InterestRate() As Decimal 
     Return Me._rate * 12D 
    End Function 

    Public Function TermMonths() As Decimal 
     Return Me._term 
    End Function 

    Public Function TermYears() As Decimal 
     Return Me._term/12D 
    End Function 

    Public Function Payment() As Decimal 
     Return Me._payment 
    End Function 

    Public Function Schedule() As DataTable 
     Me.LOANxml = New XElement(Me.loanCont) 
     Me.LOANxml.<loaninfo>.<name>.Value = Me.NameOfLoan 
     Me.LOANxml.<loaninfo>.<amount>.Value = Me._amt.ToString("c2") 
     Me.LOANxml.<loaninfo>.<term>.Value = Me._term.ToString 
     Me.LOANxml.<loaninfo>.<rate>.Value = (Me._rate * 12D).ToString("p4") 
     Me.LOANxml.<loaninfo>.<payment>.Value = (-Me._payment).ToString 

     Dim amort As New XElement(Me.loanAmort) 
     Dim begbal As Decimal = Me._amt 
     Dim pad As Integer = Me._term.ToString.Length 
     For np As Integer = 1 To Me._term 
      Dim balAfter As Decimal = Me.BalanceAfterXpayments(np) 
      Dim prin As Decimal = begbal - balAfter 
      Dim int As Decimal = -Me._payment - prin 
      Dim apay As New XElement(loanSched) 
      apay.<num>.Value = np.ToString.PadLeft(pad, " "c) 'make payment number sortable 
      apay.<begbal>.Value = begbal.ToString("c2") 
      apay.<interest>.Value = int.ToString("c2") 
      apay.<principal>.Value = prin.ToString("c2") 
      apay.<endbal>.Value = balAfter.ToString("c2") 
      amort.Add(apay) 
      begbal = balAfter 
     Next 
     Me.LOANxml.Add(amort) 
     Dim tempDS As New DataSet 
     tempDS.ReadXml(amort.CreateReader) 
     ' Me.PopulateLoanInfo(Me.LOANxml) 'for testing XML 
     Return tempDS.Tables(0).Copy 
    End Function 

    Private Function BalanceAfterXpayments(numOfPaymnets As Integer) As Decimal 
     'Balance = A(1+i)^n-P/i((1+i)^n-1) 
     Dim onePlusIupN As Double = (1 + Me._rate)^numOfPaymnets 
     Return CDec((Me._amt * onePlusIupN) - ((-Me._payment/Me._rate) * (onePlusIupN - 1))) 
    End Function 

    Public NameOfLoan As String 

    Private LOANxml As XElement 

    Private loanCont As XElement = <loan> 
             <loaninfo> 
              <name></name> 
              <amount></amount> 
              <term></term> 
              <rate></rate> 
              <payment></payment> 
             </loaninfo> 
             <!-- schedule follows --> 
            </loan> 

    Private loanAmort As XElement = <amortization> 
            </amortization> 

    Private loanSched As XElement = <sched> 
             <num></num> 
             <begbal></begbal> 
             <interest></interest> 
             <principal></principal> 
             <endbal></endbal> 
            </sched> 

    Public Sub SaveScheduleXML(path As String) 
     If Me.LOANxml IsNot Nothing Then 
      Me.LOANxml.Save(path) 
     End If 
    End Sub 

    Public Sub LoadXMLLoan(path As String) 
     Dim xe As XElement = XElement.Load(path) 
     Me.PopulateLoanInfo(xe) 
    End Sub 

    Private Sub PopulateLoanInfo(theLoan As XElement) 
     'sample 
     ' 
     '<loaninfo> 
     ' <name>Test this</name> 
     ' <amount>$300,000.00</amount> 
     ' <term>360</term> 
     ' <rate>3.73 %</rate> 
     ' <payment>$1,385.94</payment> 
     '</loaninfo> 
     Me.NameOfLoan = theLoan.<loaninfo>.<name>.Value 
     Me._amt = Decimal.Parse(theLoan.<loaninfo>.<amount>.Value.Replace("$", "").Replace(",", "")) 
     Me._term = Integer.Parse(theLoan.<loaninfo>.<term>.Value) 
     Me._rate = Decimal.Parse(theLoan.<loaninfo>.<rate>.Value.Replace("%", "").Trim) 
     Me._rate /= 100D 'convert rate from percent 
     Me._rate /= 12D 'and then monthly 
     If Me._rate = 0D Then Me._rate = zeroPercent 
     Me._payment = Decimal.Parse(theLoan.<loaninfo>.<payment>.Value.Replace("$", "").Replace(",", "")) 
     Me._payment = -Me._payment 
    End Sub 
End Class 

Dieser Code hat für Darlehen an und von XML-Dateien zu speichern.

Verwandte Themen