Rechnen in TextBox

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Dazu brauchst Du einen Parser, der solche mathematische Ausdrücke verarbeiten kann, hier im Forum gab es mal ein paar, kannst Dir ja mal anschauen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @mox das ist syntaktisch richtig aber hat mit dem Problem wenig bis nix zu tun.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Ich hab sowas mal über nen kleines Tool gebaut, welches für die Berechnung wiederum ein automatisch generiertes Programm "kompiliert".

    Dazu gibt dann ne Klasse die man einfach nutzt...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Projekteinstellungen:
    2. 'Option Strict On
    3. 'Option Explicit On
    4. 'Imports Microsoft.VisualBasic.ControlChars
    5. Imports System.Reflection
    6. Imports System.CodeDom.Compiler
    7. Imports System.Text.RegularExpressions
    8. Public Class Calculator : Implements IDisposable
    9. Private _prov As New Microsoft.VisualBasic.VBCodeProvider
    10. Private _tpClass1 As Type
    11. Private Shared ReadOnly _bindFlags As BindingFlags = _
    12. BindingFlags.DeclaredOnly Or _
    13. BindingFlags.Public Or _
    14. BindingFlags.InvokeMethod Or _
    15. BindingFlags.Static
    16. Private _rgx As New Regex("(?<=\d)\s*\*?\s*(?=[a-zA-Z\(])", RegexOptions.Compiled) 'mit diesem Regex wird bei mathematische Multiplikation-Schreibweise das im VB-Code erforderliche '*' eingefügt
    17. Public Function TrySetExpression(ByVal Value As String) As Boolean
    18. Static expression As String
    19. If Not AssignSave(expression, _rgx.Replace(Value, "*")) Then Return _tpClass1 IsNot Nothing
    20. _tpClass1 = Nothing
    21. Dim sl As New StringList
    22. 'vollständige kleine Klasse mit einer Function
    23. sl.AddLine("Imports System.Math")
    24. sl.AddLine("Public Class Class1")
    25. sl.AddLine("Public Shared Function Calc(ByVal X As Double) As Object")
    26. sl.AddLine("Return ", expression) ' expression, vom User eingegeben, wird einkompiliert
    27. sl.AddLine("End Function")
    28. sl.AddLine("End Class")
    29. Dim cp As New CompilerParameters
    30. cp.GenerateInMemory = True
    31. Dim cr As CompilerResults = _prov.CompileAssemblyFromSource(cp, sl.Flush)
    32. If cr.Errors.Count > 0 Then
    33. 'sl.AddLines("Die Expression konnte nicht kompiliert werden.", "")
    34. For Each err As CompilerError In cr.Errors
    35. sl.AddLine(err.ErrorText)
    36. Next
    37. MessageBox.Show("Diese Eingabe konnte nicht kalkuliert werden.")
    38. Return False
    39. End If
    40. ' aus der Assembly interessiert nur der Reflection-Type "Class1"
    41. _tpClass1 = cr.CompiledAssembly().GetType("Class1")
    42. Return True
    43. End Function
    44. Public Function Calc(ByVal x As Double) As Single
    45. ' "gerechnet" wird, indem die Class1.Calc()-Function per Reflection aufgerufen wird
    46. Dim args() As Object = {x}
    47. Return CSng(_tpClass1.InvokeMember("Calc", _bindFlags, Nothing, Nothing, args, Nothing))
    48. End Function
    49. Public Sub Dispose() Implements IDisposable.Dispose
    50. If _prov Is Nothing Then Return
    51. _prov.Dispose()
    52. _prov = Nothing
    53. GC.SuppressFinalize(Me)
    54. End Sub
    55. End Class
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Vielleicht gibts ja auch nen einfacheren Weg. Ich bin nämlich dabei Spalten eines DataGridViews zu addieren. Dies geschah bisher immer über eine TextBox wo dann diese Rechnung (Bsp. 3+5+2) drinnen stand.
    Mein bisheriger Code ist zwar noch nicht ganz fertig aber darum geht's ja grad auch nicht.

    VB.NET-Quellcode

    1. ​Dim colIndex As Int32 = 0
    2. Dim ret = From item In DataGridView1.Rows _
    3. Select CType(DirectCast(item, DataGridViewRow).Cells.Item(colIndex).Value, String)
    4. TextBox1.Text = (String.Join("+", ret.ToArray))
    5. Dim s As String = TextBox1.Text
    6. Dim data() As String = s.Split("+".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)


    Naja also meine eigentliche Frage ist, ob ich das auch direkt ausrechnen kann.
    Also um da mal direkt rein zu grätschen...
    Man rechnet nicht mit Controls!!!
    Und nen Datagridview hat Daten nur anzuzeigen.

    Ein Dataset ist für die Daten da... Dann kannst du die auch überall anzeigen lassen.
    Dann kannst du auch einfach "Formelfelder" oder auch "Berechnete Felder" einfügen und das im Designer ohne ne Zeile Code.
    Mal davon ab dass ein Datagridview viel viel viel zu langsam ist. Alle Arbeit mit Daten wird im Dataset gemacht und das Datagridview ist nur die Ansicht eines Ergebnisses in tabellarischer Form.

    Der @ErfinderDesRades hat dazu hier sehr schöne Anleitungen gemacht mit Videos und nem komplett fertigen Beispiel.

    Bevor du da weiter rumwurschtelst und dich total verhädderst bis dir keiner mehr helfen kann... Guck dir die Tutorials an.

    erfinderdesrades.unitweb.de/Pr…r/Downloadpage/index.html
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    MemoAnMichSelbst schrieb:

    Man rechnet nicht mit Controls!!!
    Jou.
    @Marceliboy Trenne GUI und Daten.
    Die GUI dient dazu, daten anzuzeigen und zu editieren.
    Mit Daten kannst Du Datenverarbeitung machen. Wenn Du damitz fertig bist, werden die Ergebnisse an der GUI in entsprechenden Contrrols angezeigt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!