DTS.Table.Rows.Add() -- anschließend selektieren?

  • VB.NET

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

    DTS.Table.Rows.Add() -- anschließend selektieren?

    Servus Leute,

    ich habe mal wieder ein kleines Problem.

    Mit folgendem Code füge ich einen neuen Datensatz in ein Dataset ein (an DGV gebunden).

    VB.NET-Quellcode

    1. Dim nR As ArtikelDts.TL1_ArtikelRow = ArtikelDts.TL1_Artikel.NewTL1_ArtikelRow
    2. nR.Einheit_ID = 123 'Beispielwert
    3. nR.Warengruppe_ID = 456 'Beispielwert
    4. ArtikelDts.TL1_Artikel.Rows.Add(nR)


    Ich möchte anschließend, dass diese Zeile automatisch im gebundenen Datagridview aktiv wird (selectiert?!). Normalerweise wird diese einfach am Ende eingefügt. Wenn der Benutzer aber Spalten vorher sortiert, reiht sich die neue Zeile gleich mal ordnungsgemäß ein, und ich weiß nicht, wo ich selektieren soll. Meiner Vermutung folgend, dass ich über nR die Zeile als Objekt ansprechen und auswählen kann, führte mich nicht zum Erfolg. :-/

    Hat jemand nen Denkanstoß für mich? :pinch:

    Vielen Dank!

    lg
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:

    VB.NET-Quellcode

    1. Dim nR As New ArtikelDts.TL1_ArtikelRow = ArtikelDts.TL1_Artikel.NewTL1_ArtikelRow(....)


    Du musst "New" schreiben und dann gleich in Klammern die einzelnen Spaltenwerte übergeben. Mach die Klammer auf und wähle die 2.Überladung, dann siehst du, in welcher Reihenfolge du was eingeben musst.
    Hey sonne,

    die Art alle Spalten direkt zu befüllen in der Klammer ist mir bekannt, ich finde es aber für mich verständlicher und übersichtlicher, wenn ich die Spalten (mit Spaltenbezeichnung) einzeln anspreche und befülle (was ja auch bereits funktioniert). Selbst wenn ich die Spalten direkt über Klammer einfüge, kann ich die eingefügte Zeile doch nicht selectieren, nach dem einfügen?!

    Danke für die Hilfe!

    lg
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:
    Was soll ich dazu sagen. Der Code funktioniert. Ich füge damit Daten in mein Dataset ein, welche dann im Datagridview angezeigt werden.

    Jetzt mal angenommen ich fungiere mit NEW, wie würde ich denn nach dem Einfügen, die Zeile selectieren, wenn diese durch Spaltensortierung nicht am Ende steht?
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:
    Hey Sonne,

    danke für den Denkanstoß. So hab ich es jetzt erfolgreich lösen können! :)

    VB.NET-Quellcode

    1. TL1_Artikel_BS.Position = TL1_Artikel_BS.Find("ID", nR.ID.ToString)


    Dangö!
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:

    sonne75 schrieb:

    Du musst "New" schreiben und dann gleich in Klammern die einzelnen Spaltenwerte übergeben. Mach die Klammer auf und wähle die 2.Überladung, dann siehst du, in welcher Reihenfolge du was eingeben musst.
    nö - das funktioniert schon. Diese TL1_Artikel.NewTL1_ArtikelRow - Function generiert eine neue typisierte DataRow, da braucht man nicht das Schlüsselwort New.

    Ich find den Weg über

    VB.NET-Quellcode

    1. dim rwArtikel = TL1_Artikel.AddTL1_ArtikelRow(..., ..., ...)
    auch eleganter (weil ist in 1 Zeile erledigt, und kann keine Property vergessen werden), aber das mit .NewTL1_ArtikelRow() geht auch.


    @TE:

    VB.NET-Quellcode

    1. TL1_Artikel_BS.Position = TL1_Artikel_BS.Find("ID", nR.ID.ToString)
    Warum hängst du da ein .ToString an?
    Bist du einer von denen, die ToString überall anhängen?
    Stimmt, jetzt, wo du sagst, merke ich auch, dass bei mir "Add" drin ist und bei ihm "New", deswegen braucht es kein explizites "New" davor.

    Aber der Weg über .Position und .Find war richtig? Den habe ich mir nämlich für ihn zusammengegoogelt.
    Weil ich nur wusste, dass ich Bindingsource brauche, es hat ja nur 2-3 Minuten gedauert. Ich bin gleich auf MSDN-Seite mit .Current gekommen, aber das ist nur eine ReadOnly Property, da wurde es aber erwähnt, dass man zum Setzen .Position braucht, nur Index hatte ich nicht. Und dann bin ich schnell durch irgendeinen Thread auf .Find gekommen.
    Im Objektkatalog schaue ich nach, wenn ich in etwa weiß, was ich tun muss. Bei MSDN gibt es einfach mehr Erklärungen und Beispiele.

    ErfinderDesRades schrieb:


    Warum hängst du da ein .ToString an?
    Bist du einer von denen, die ToString überall anhängen?


    hey edr,
    ;( ich erkenne den Unsinn dahinter und habe es korrigiert. Ich würde mich nicht zu denen zählen. :)
    Über den Vor- & Nachteil Befehle mit einer Zeile abzuarbeiten kann man sich gern unterhalten.
    Wenn die Werte (so wie es auch tatsächlich passiert) in Abhängigkeit von anderen Werten/Tabellen usw. sind, wirds mMn wüst.
    Jetzt werde ich bestimmt gelyncht aber darum gehts ja in nem Forum, sonst kommt man nicht weiter.

    In dem obigen Beispiel mit den Beispielwerten steckt eigentlich das dahinter:

    VB.NET-Quellcode

    1. Dim nR As ArtikelDts.TL1_ArtikelRow = ArtikelDts.TL1_Artikel.NewTL1_ArtikelRow
    2. nR.Einheit_ID = CInt(DirectCast(Einheit_BS.Current, DataRowView).DataView(Einheit_BS.Position).Item("ID"))
    3. nR.Warengruppe_ID = CInt(DirectCast(Warengruppe_BS.Current, DataRowView).DataView(Warengruppe_BS.Position).Item("ID"))
    4. ArtikelDts.TL1_Artikel.Rows.Add(nR)
    5. TL1_Artikel_BS.Position = TL1_Artikel_BS.Find("ID", nR.ID)


    Also ich wähle in einem DGV eine Einheit und in einem anderen eine Warengruppe und wenn ich einen neuen Artikel einfüge, sollen die ausgewählten Werte automatisch für den neuen Artikel übernommen werden. Auch war meine Überlegung (weil ich ja noch rumspiele und mich vertraut mache - ja, dauert länger), wenn ich die Tabellen erweitere oder Spalten entferne, dass ich dann durch die Spaltenbezeichnungen sehe, was fehlt bzw. übrig ist?! (Ja ich weiß - erst Datenmodell fertig, dann modellieren, das ändert nichts daran, dass ich als Hobbyprogrammierer Dinge vergesse oder nachträglich als umständlich erachte).
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:
    Da hätte ich vielleicht noch Gänselfüßle dran machen sollen!? :)
    Naja, als Laie und Autodidakt bastelt man sich eben mehr oder weniger seine Lösung passend. Dabei wählt man wohl oft, ich formuliere es mal als einen holprigen Weg..
    Wenn jetzt ein "Profi" daher kommt, ist es manchmal naheliegend, dass die Arbeit in der Luft zerfetzt wird, weil aufgezeigt wird, was alles "schlecht/unkomfortabel" daran ist. Letztlich ist das ja gut (Kritik), weil man nur so lernt.

    *edit*
    Mit den Variablen wäre es dann doch aber vom Platz her wieder statt dem Ein-Zeiler ein N-Zeiler? Und passend formuliert finde ich die Spaltenüberschriften über nR.Spaltenname = xy ? :)
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:
    Ja, klar, dann hätte es keinen Unterschied von der Zeilenanzahl gemacht, deswegen ja auch Geschmacksfrage :) Deine Benamung passt in dem Fall natürlich, ich meinte nur, wenn man über Variablen gehen würde.

    Profil gibt es in diesem Thread nur einen, und ich bin es nicht. :P

    @ErfinderDesRades
    Wie gesagt, ich wusste nicht mal, dass ich .Find und .Position benutzen muss, ich hatte nur .Current im Kopf. Sonst schaue ich auch häufig im Objektkatalog nach.
    Um mich da mal in euer Gespräch zu hängen: ich empfinde diese Art über .Find "umständlich", also hätte ich wohl erst ziemlich spät - als Umweg - danach gesucht...
    Für mich wäre es praktisch/verständlich, wenn ich doch meine typisierte Datarow erzeuge, dass ich diese innherhalb des Gridview oder der bindingsource direkt ansprechen kann. Was wäre denn, wenn ich keine ID hätte?

    *edit*

    @ sonne
    Das mit dem lynchen galt auch dem "Profi".. :D :D :D
    Aber nein natürlich lese auch sehr viel von dir im Forum und finde du machst eine gute Arbeit :thumbsup:
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:

    xpecidy schrieb:

    ich empfinde diese Art über .Find "umständlich"

    Ja, ich kann verstehen, was du meinst, man hat schließlich seine DataRow und muss sie wieder suchen. Aber siehe es mal so, dass du nur die Referenz auf deine DataRow suchst, über die du dann DGV ansprechen kannst. Und ID ist die einzige Eigenschaft, die einen Datensatz einzigartig macht, deswegen wirst du immer eine haben müssen.

    xpecidy schrieb:

    Aber nein natürlich lese auch sehr viel von dir im Forum und finde du machst eine gute Arbeit

    Danke für die Blumen. :D Ich bemühe mich auch...