Announcement

Collapse
No announcement yet.

Textbox an DataTable binden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Textbox an DataTable binden

    Hallo Fachleute,

    Ich stehte vor folgendem Problem, ich möchte, dass eine Textbox an eine bestimmte Zelle des DataTables binden.


    Momentan mache ich das mittels Timer, der den Inhalt der Texbox alle Sekunden aktualisiert
    Code:
    Me.Textbox.Text = DT.Rows(DT.Rows.find(ID)).Item(Spaltenname).toString
    Das Problem dabei ist, dass das Textfeld nur dann den Wert des DataTables entspricht, wenn dieser gerade aktualisiert wurde und somit nicht immer, wenn der DataTable aktualisiert wurde.

    Soweit ich herausgefunden habe funktioniert das DataBinding mittels
    Code:
    textBox.DataBindings.Add("Text", dataSetName.Table["Tabellenname"], "Spaltenname")
    Aber wie lege ich die Row fest, an die es gebunden ist. Ich habe zwar unter http://entwickler-forum.de/showthread.php?t=42535 eine Lösung gefunden, aber ich schaffe es nicht diese in VB.net zu übertragen.

    Anmerkung: Der RowIndex ändert sich immer nur beim Laden des Formulars und nicht zwischenzeitlich. Daher würde ich gerne das DataBinding immer beim Laden des Formulars ausführen.

    Vielen Dank im voraus.

  • #2
    Das Problem ist das eine direkte gebundene komplexe Datenmenge(üblicherweise irgendeine Form von Liste also z.B. auch eine Datatable) sich immer auf den aktuellen Datensatz dieser Liste bezieht. Heißt normales Binding sorgt dafür das alle Controls auf die aktuelle Position synchronisiert werden. Das ist auch das Verhalten das man sich fast immer wünscht. In deinem Fall brauchst du also ein Verfahren das mehrere aktuelle Datensätze aus der selben Datenquelle erlaubt.

    Die einfachste Methode wäre wohl einfach zwischen Control (Grid oder Textbox) jeweils eine eigene BindingSource zu schalten. Würde ich in den meisten Fällen sowieso immer machen das vereinfacht das Designen im Winforms Designer ungemein.

    Also nimm dir zwei BindingSources(die übernehmen das Verwalten des aktuellen Datensatzes) und wirf die auf die Form. Binde jeweils eine an das Grid und die andere an die Textbox. Im Code kannst du jetzt sobald du eine konkrete Datatable hast die an die beiden BindingSources binden(BindingSource.DataSource = meineLiebeDataTable) und damit wiederum an die Controls. Bei derjenigen die an deiner Textbox hängt kannst du jetzt noch über deren Position Property steuern welchen konkrete DataRow den jetzt von deiner Textbox verwendet werden soll. Das ändern des Focus im Grid hat dein keinen Einfluss mehr welche DataRow den für die Textbox ausgewählt ist.

    Comment


    • #3
      Tut mir echt leid, aber ich verstehe das leider überhaupt nicht, was du meinst.

      Ich habe in meinem Forumlar - jedenfalls in dem mit dem Problem - lediglich 3 Textfelder, wovon beispielsweise Textfeld 1 den Wert der 3. Spalte der 1. Zeile, Textfeld 2 den Wert der 3. Spalte der 3. Zeile usw. beinhalten soll. Auf diesem Formular befindet sich kein weiteres Steuerelement, mal abgesehen von Labels und auch kein GridView oder dergleichen. Es gibt für den besagten DataTable keinen konkreten Datensatz, auf den ich zugreifen möchte. Der DataTable wird von mehreren parallel laufenden Threads laufend aktualisiert, und spiegelt den aktuellen Status von mehreren parallel laufenden Kopierprozessen wieder. Für die Speicherung des Status der einzelnen Kopierprozesse habe ich mich deswegen entschieden, da ich diese in einem anderen Formular als GridView darstelle und da man DataTables recht einfach als XML Datei speichern und laden kann. Vielleicht wäre es auch sinnvoller gewesen, den Status der Prozesse als Klasse abzuspeichern.

      Comment


      • #4
        Oh. Sorry hatte mehr reininterpretiert als da war. Wenn ich Datatable höre denke ich direkt an Datenbank und Listendarstellung.

        Der von mir beschrieben Teil mit der BindingSource bleibt aber korrekt. Nimm eine BindingSource schalte diese zwischen Textbox und Datatable und setze die Position Property der BindingSource auf die gewünschte Zeile.


        Vielleicht wäre es auch sinnvoller gewesen, den Status der Prozesse als Klasse abzuspeichern.
        Ist es vermutlich immer noch.

        Comment


        • #5
          Ich checke es leider noch immer nicht - ich versuche nun folgendes

          Code:
                  Dim myBindingSource As New BindingSource
                  myBindingSource.DataSource = DATATABLE
                  myBindingSource.Position = myBindingSource.Find(Spalten_in_der_gesucht_werden_soll, was_gesucht_werden_soll)
                  Me.test.DataBindings.Add(New Binding("Text", myBindingSource, Spalte_die_ausgegeben_werden soll))
          bzw.
          Code:
                  Me.test.DataBindings.Add("Text", myBindingSource, Spalte_die_ausgegeben_werden soll)
          beides liefert "System.ArgumentException" - "Dies führt dazu, dass sich zwei Bindungen der Auflistung an dieselbe Eigenschaft binden.
          Parametername: binding"

          Vielleicht könntest du mir noch ein klein wenig weiterhelfen.

          Comment


          • #6
            Der Fehler kommt wenn du das Binding mehr als 1 mal versuchst zu erzeugen. Hast du denn Code an einer Stelle der mehr als 1mal durchlaufen wird oder das Binding gleichzeitig auch über den Winforms Designer erstellt?

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              Der Fehler kommt wenn du das Binding mehr als 1 mal versuchst zu erzeugen. Hast du denn Code an einer Stelle der mehr als 1mal durchlaufen wird oder das Binding gleichzeitig auch über den Winforms Designer erstellt?
              Du hast recht, ich hatte es zu Testzwecken gleich mal in den Timer geschrieben, um zu sehen, inwiefern der Inhalt von den - wie angfangs angeführten - Werten divergiert. Danke jetzt funktioniert es wie gewünscht, wenngleich ich doch überrascht bin, dass es recht kompliziert ist. Ich habe es jetzt in eine Funktion gepackt, der ich die Row, die Column, den DataTable und das Control übergebe und so habe ich die von mir gewünschte Funktion

              Falls es jemanden interessiert:
              Code:
                  Public Sub LinkControlToDataTableCell(ByRef myControl As Control, ByVal myDataTable As DataTable, ByVal ColumnText As String, ByVal iRow As Integer, Optional ByVal sType As String = "Text")
                      Try
                          Dim myBindingSource As New BindingSource
                          myBindingSource.DataSource = myDataTable
                          myBindingSource.Position = iRow
                          myControl.DataBindings.Add(New Binding(sType, myBindingSource, ColumnText))
                      Catch ex As System.ArgumentException
                          'ignorieren
                      Catch ex As Exception
                          Debug.Print("Fehler:" & ex.Message)
                      End Try
                  End Sub

              Comment


              • #8
                Danke jetzt funktioniert es wie gewünscht, wenngleich ich doch überrascht bin, dass es recht kompliziert ist.
                Ehrliche Antwort? Selber Schuld Du hast dir (wahrscheinlich)eine nichttypisierte Datatable als Container deiner Daten ausgesucht und versuchst damit Databinding im Code. Databinding ist so wie es ist (AFAIK) damit es leicht von einem Designer (z.b. dem Winforms Designer) benutzt werden kann. Das manuell im Code zu machen ist eigentlich unüblich.

                Comment

                Working...
                X