Wie kann ich auf ein Control vom DataRepeater zugreifen? EDIT: einfachen Code gefunden

  • VB.NET

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

    Wie kann ich auf ein Control vom DataRepeater zugreifen? EDIT: einfachen Code gefunden

    Hallo,

    ich stehe vor dem Problem, dass in meinem DataRepeater je nach Programmablauf mal eine ComboBox sichtbar sein muss, mal nur eine Textbox. DataSource von der ComboBox muss immer angepasst werden. Sie wird aus Tabelle gebildet, allerdings nicht direkt, andere Elemente vom Repeater sind an die Value-Table gebunden (an "Value", "Avail" und "ValueTitle"), aber in der ComboBox soll eine List aus "EnumT.Value" erscheinen.


    Die List hole ich mir mit:

    VB.NET-Quellcode

    1. Dim rwMapVF = rwVal.MapValFuncRow
    2. If rwMapVF.EnumFuncRow IsNot Nothing Then
    3. Dim rwEnum = rwMapVF.EnumFuncRow
    4. Dim lstEnumValues = From eTable In rwEnum.GetEnumTRows Select eTable.Value

    Es soll in jeder ComboBox das Gleiche erscheinen.

    Das Problem ist nur, dass auf die ComboBox nicht zugreifen kann, der Code:

    VB.NET-Quellcode

    1. Dim t = DataRepeater2.Controls("cbEnum")

    findet leider nichts (der Name stimmt).

    Es gibt eine Eigenschaft .CurrentItem, aber ich will ja alle Items anpassen, bevor der User was auswählen kann.

    Jetzt habe ich mir überlegt, dass ich eine zusätzliche Tabelle anlege, wo ich die List schon mal unterbringe:

    Aber ich weiß immer noch nicht, wie ich über Bindingssource die ComboBox damit befüllen kann. Die anderen Elemente sind, wie gesagt, an diese ValueBindingSource gebunden, ich würde die ComboBox gerne auch über diese ValueBindingSource binden, nur weiß ich nicht, wie.

    Und ich will die TextBox und ComboBox (samt Labels als Namen, sind auch gebunden) nach Bedarf ausblenden können.

    Danke.

    EDIT: ich brauche natürlich auch noch das ausgewählte Element, um damit weiter arbeiten zu können.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „sonne75“ ()

    ICH HABE ES!!! :thumbsup:

    Mein Gedankengang war schon richtig, ich musste nur "DataRepeaterItem" dazwischen schalten.

    Falls es jemand brauchen wird:

    EDIT: Der Code funktioniert nicht, weil die Auflistung .Controls nicht alle Items enthält. Beispiel für funktionierende For-Schleife ist weiter unten

    VB.NET-Quellcode

    1. For Each rpItem As DataRepeaterItem In DataRepeater2.Controls
    2. Dim cbItem = rpItem.Controls("cbEnum")
    3. If cbItem IsNot Nothing Then
    4. Dim cb = DirectCast(cbItem, ComboBox)
    5. cb.DataSource = (From eTable In rwEnum.GetEnumTRows Select eTable.Value).ToList
    6. cb.Visible = True
    7. End If
    8. Next

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „sonne75“ ()

    Habe mich zu früh gefreut, jedes DataRepeaterItem hat eine unterschiedliche ComboBox, bzw. teilweise gar nicht sichtbar.

    D.h. ich muss wissen, welche Value zu welchem Item gehört.

    Ich dachte mir, ich mache ein unsichtbares Label, gebunden an ID, und gehe die Items durch, bis ich die ID finde, dann kann ich damit weiterarbeiten.

    Ist zwar etwas "vergewaltigt", aber auf die Schnelle fällt mir nichts anderes ein.

    EDIT: Das wäre der Code davon:
    EDIT2: Der Code muss richtig so sein:

    VB.NET-Quellcode

    1. Private Function GetValueRepeaterItem(ByVal rwVal As ValueRow) As DataRepeaterItem
    2. For i = 0 To DataRepeater2.ItemCount - 1
    3. DataRepeater2.CurrentItemIndex = i
    4. Dim rpItem = DataRepeater2.CurrentItem
    5. Dim lblID = rpItem.Controls("lblID")
    6. If lblID IsNot Nothing AndAlso lblID.Text = rwVal.ValueID.ToString Then Return rpItem
    7. Next
    8. Return Nothing
    9. End Function

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „sonne75“ ()

    jetzt habich auch bisserl mit rumprobiert - also Comboboxen im DataRepeater scheinen ja unbrauchbar.
    Auch generiert der DataRepeater tatsächlich so viele Panels wie Datensätze anzuzeigen sind - also "das skaliert nicht gut" - ums in Theoretiker-Deutsch zu formulieren ;)

    (War mir doch so: die PowerPacks kamen mir doch immer wie Schrott vor)
    Verstehe jetzt nicht. Es ist doch genau so von mir gewünscht, dass so viele angezeigt werden, wie viele vorhanden sind?
    Und auf ComboBoxen kann ich doch jetzt zugreifen.

    Was meinst du also?

    Ist mein Vorgehen mit ValueID über Label in Ordnung so? Es funktioniert zumindest.

    VB.NET-Quellcode

    1. cb.DataSource = rwEnum.GetEnumTRows
    klar kann man Linq lieben - aber manches geht halt auch ohne ;)

    oder anners: Welchen Datentyp gibt rwEnum.GetEnumTRows zurück?

    ups - übersehen - du willst ja die Values in die Combo machen - dann ist egal - würde man wohl eher einen DisplayMember setzen

    VB.NET-Quellcode

    1. cb.DataSource =From rw in rwEnum.GetEnumTRows Select rw.Value
    2. 'oder
    3. cb.DataSource = rwEnum.GetEnumTRows
    4. cb.DisplayMember = "Value"
    Habe den Code aktualisiert, über die .Controls-Auflistung erhielt ich manchmal weniger Elemente, als tatsächlich. Beim Vergleich mit .ItemCount hat man deutlich den Unterschied gesehen. Musste also den Umweg über .CurrentItem gehen, denn man kann nicht auf .Item zugreifen. X(
    Ich wusste, dass es einfacher geht, als ValueID an ein Label zu binden. :thumbup:

    VB.NET-Quellcode

    1. Private Function GetValueRepeaterItem(ByVal Index As Integer) As DataRepeaterItem
    2. DataRepeater2.CurrentItemIndex = Index
    3. Return DataRepeater2.CurrentItem
    4. End Function


    Verwendung:

    VB.NET-Quellcode

    1. Dim rwValues = rwChan.SimulSensorRow.GetMapDeviceValueRows(0).GetValueRows()
    2. For i = 0 To rwValues.Length - 1
    3. Dim rpItem = GetValueRepeaterItem(i)
    4. .......