none
Werte aus einer Form in einer Checkbox(aus Liste) in eine andere Klasse/ Funktion übergeben RRS feed

  • Frage

  • Hallo ihr,

    ich bin Neu hier uns habe einfach mal eine Frage und würde mich freuen wenn ihr mir weiter helfen könnt.

    Und zwar habe ich in einer Form eine Sub in der beim selectieren aus einer Liste der Faktor abgefragt wird.(die Werte ziehe ich über eine SQL Abfrage ab / discounts)
    Diesen kann ich dort auch abgreifen.(MsgBox(faktor)) Nur würde ich diesen gerne denn selektierten Wert(hier davon der Faktor) in einer anderen Function (Klasse/ Sub)
    abrufen.

    ---Form mit Checkbox----
    Public Sub Cbx_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cbx.SelectedIndexChanged
    Dim faktor As Double = discounts(Cbx_.SelectedIndex - 1).Faktor
    MsgBox(faktor)
    End Sub

    ---Andere Klasse---Die Form mit Checkbox ist geschlossen---
    Private Sub WertausCbx()
    --hier würde ich gern denn selektierten wert abrufen wollen
    End Sub

    Könnt ihr mir hierbei vielleicht helfen?

    Liebe Grüße
    Donnerstag, 4. Januar 2018 14:08

Antworten

  • Hi,
    wie Stefan geschrieben hat, benötigst Du einen Puffer für die Werte, auf die beide Forms zugreifen und damit Werte austauschen können. Eine Möglichkeit für die Realisierung solch eines gemeinsam genutzten Puffers kann ein Singleton-Objekt sein. Das kann entweder eine statische Klasse sein, die in VB als Modul realisiert wird, oder eine Klasse, die einen statischen Verweis auf immer die gleiche Instanz liefert. Nachfolgend ein Beispiel dazu:

    Imports System.ComponentModel
    Imports System.Runtime.CompilerServices
    
    Public Class Form29
      Private cb As New CheckBox With {.Text = "CheckBox"}
      Private Sub Form29_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(cb)
        cb.DataBindings.Add("Checked", Form29B.Instance, "Wert")
        Call (New Form29A).Show()
      End Sub
    End Class
    
    Public Class Form29A
      Inherits Form
      Private cb As New CheckBox With {.Text = "CheckBox"}
      Private Sub Form_load() Handles Me.Load
        Me.Controls.Add(cb)
        cb.DataBindings.Add("Checked", Form29B.Instance, "Wert", False, DataSourceUpdateMode.OnPropertyChanged)
      End Sub
    End Class
    
    Public Class Form29B
      Implements INotifyPropertyChanged
      Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    
      Private Shared _instance As Form29B
      Public Shared Function Instance() As Form29B
        If _instance Is Nothing Then _instance = New Form29B
        Return _instance
      End Function
    
      Private _wert As Boolean
      Public Property Wert As Boolean
        Get
          Return _wert
        End Get
        Set(value As Boolean)
          _wert = value
          OnpropertyChanged()
        End Set
      End Property
    
      Friend Sub OnpropertyChanged(<CallerMemberName> Optional propName As String = "")
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(Wert)))
      End Sub
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks


    Donnerstag, 4. Januar 2018 15:48

Alle Antworten

  • Hi,

    Du wirst den Wert irgendwo zwischenspeichern müssen. Am ehesten kommt mir da die Instanz einer Klasse in den Sinn, auf die beide Elemente (Formular und deine andere Klasse) Zugriff haben.

    Denn wenn die Form nicht mehr vorhanden ist, kannst Du logischerweise auch nicht mehr auf die selektierten Werte irgendwelcher Controls dieses Formulars zugreifen.

    Wie genau Du das machen musst, hängt aber davon ab, wie deine Anwendung aufgebaut ist, um welchen Anwendungstyp es sich handelt (ich nehme an WinForms?) und wann Du wo und wie auf die Werte zugreifen willst.

    Public Class Settings
    
        Public Property Faktor As Double
    
    End Class
    
    ---
    
    Public Sub Cbx_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cbx.SelectedIndexChanged
    
    Dim faktor As Double = discounts(Cbx_.SelectedIndex - 1).Faktor
    
        <InstanzVonSettings>.Faktor = faktor
        
    End Sub
    
    ---
    
    Private Sub WertausCbx()
    
    Dim faktor As Double
        faktor = <GleicheInstanzVonSettingsWieImFormular>.Faktor
    
    End Sub

    Hier mal rein schematisch dargestellt, wie Du das machen könntest.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 4. Januar 2018 14:43
    Moderator
  • Hallo Stefan,

    wie müsste ich denn die Instanz schreiben?

    <InstanzVonSettings>

    hätte jetzt einfach Settings.Faktor

    geschrieben.

    Gruß

    Donnerstag, 4. Januar 2018 15:02
  • Hi,
    wie Stefan geschrieben hat, benötigst Du einen Puffer für die Werte, auf die beide Forms zugreifen und damit Werte austauschen können. Eine Möglichkeit für die Realisierung solch eines gemeinsam genutzten Puffers kann ein Singleton-Objekt sein. Das kann entweder eine statische Klasse sein, die in VB als Modul realisiert wird, oder eine Klasse, die einen statischen Verweis auf immer die gleiche Instanz liefert. Nachfolgend ein Beispiel dazu:

    Imports System.ComponentModel
    Imports System.Runtime.CompilerServices
    
    Public Class Form29
      Private cb As New CheckBox With {.Text = "CheckBox"}
      Private Sub Form29_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(cb)
        cb.DataBindings.Add("Checked", Form29B.Instance, "Wert")
        Call (New Form29A).Show()
      End Sub
    End Class
    
    Public Class Form29A
      Inherits Form
      Private cb As New CheckBox With {.Text = "CheckBox"}
      Private Sub Form_load() Handles Me.Load
        Me.Controls.Add(cb)
        cb.DataBindings.Add("Checked", Form29B.Instance, "Wert", False, DataSourceUpdateMode.OnPropertyChanged)
      End Sub
    End Class
    
    Public Class Form29B
      Implements INotifyPropertyChanged
      Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    
      Private Shared _instance As Form29B
      Public Shared Function Instance() As Form29B
        If _instance Is Nothing Then _instance = New Form29B
        Return _instance
      End Function
    
      Private _wert As Boolean
      Public Property Wert As Boolean
        Get
          Return _wert
        End Get
        Set(value As Boolean)
          _wert = value
          OnpropertyChanged()
        End Set
      End Property
    
      Friend Sub OnpropertyChanged(<CallerMemberName> Optional propName As String = "")
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(NameOf(Wert)))
      End Sub
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks


    Donnerstag, 4. Januar 2018 15:48