DataGridView und Textboxen / RadioButtons

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    DataGridView und Textboxen / RadioButtons

    Hallo,

    es geht um folgendes:
    Ich habe mehrere Textboxen die mit einem Inhalt (durch den Benutzer) befüllt werden sollen.
    nachdem dann auf Button1 geklickt wurde sollen diese Daten bzw. werte in eine Zeile eines DGV geschrieben werden.

    mit diesem Code bekomme ich zumindest die erste "Zelle" des DGV gefüllt und er legt mir auch eine weitere Zeile an was auch soweit stimmt aber ich bin momentan ratlos wie ich die weiteren "Zellen" aus dieser Zeile füllen kann?

    VB.NET-Quellcode

    1. 'Das hier funktioniert einwandfrei mit Button1_Click Event
    2. With DataGridView1
    3. .Rows.Add(txtBoxNumber.Text)
    4. End With


    ich hab es mit dem hier versucht aber das geht nicht. Also quasi dass er eine Zelle nach der anderen Abarbeitet.

    VB.NET-Quellcode

    1. With DataGridView1
    2. .Rows.Add(txtBoxNumber.Text)
    3. .Columns.Add(txtBoxSubject.Text) 'das hier geht nicht, wirft direkt einen Fehler
    4. End With


    Hinzu kommt dass ich noch RadioButtons hab deren Text ebenfalls in die "Zellen" eingetragen werden soll.
    Also ich habe zwei Stück davon, den einen "Yes" der andere mit dem Wert "No".
    Theoretisch müsste ich ja dann sowas machen und es werden sehr viele If-Schleifen vermutlich.

    VB.NET-Quellcode

    1. If radioBtnNo.Checked = True Then
    2. txtBoxAnswer.Text = radioBtnNo.Text
    3. End If



    Habt ihr evtl eine Idee?
    Danke vorab

    *Thema verschoben* ~NoFear23m

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Hallo @0ptix

    Nicht gerade viel Infos zu deinem Vorhaben. Somit kann ich dir einfach nur mal dies beschrieben.

    Mach dir ein typisiertes Dataset (tDS) mit deiner entsprechenden Datatable drin.
    >> Dazu gibt es viele gute Beispiele hier im Forum, einfach mal die Suche bemühen.

    Nimm dir eine Bindingsource und fülle die Source mit deiner TDs und binde die an deiner DGV.Source
    >> Auch dazu gibt es viele Beispiele hier im Forum.

    Nach Click deines Buttons
    Mit tDataset.datatable.addrow kann eine neue Zeile eingefügt werden, die nachher auch gleich in der DGV zu sehen ist.

    EDIT:
    Man kann es sich auch ganz einfach machen
    Bietet aber immer noch die Flexibilität, wenn nachher Daten verändert, gespeichert etc. werden
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Annahme Dein tDs heisst "DsAddRow"
    2. ' Datatable heisst "RowSample"
    3. Private Bs As New BindingSource
    4. Private Sub DgvRowAdd_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Me.Bs.DataSource = Me.DsAddRow 'Dein tDs
    6. Me.DataGridView1.DataSource = Me.Bs 'Deine BindingSource
    7. Me.DataGridView1.DataMember = "RowSample" 'Ausgewählte Datatable
    8. End Sub
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. If String.IsNullOrEmpty(Me.TextBox1.Text) Then Return
    11. If String.IsNullOrEmpty(Me.TextBox2.Text) Then Return
    12. Dim newrow = DirectCast(Me.DsAddRow.RowSample.NewRow, RowSampleRow)
    13. With newrow
    14. .TextBox1 = Me.TextBox1.Text
    15. .TextBox2 = Me.TextBox2.Text
    16. .Radio1 = Me.RadioButton1.Checked
    17. .Radio2 = Me.RadioButton2.Checked
    18. End With
    19. Me.DsAddRow.RowSample.AddRowSampleRow(newrow)
    20. End Sub


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Danke für deine Antwort, ich versuchs noch mal zu erklären:
    Ich habe ein DataGridView mit folgenden Columns:

    Column1 = Number
    Column2 = Surname
    Column3 = Lastname
    Column4 = department

    Diese sollen mit folgenden Werten bei "Button1_Click" befüllt werden:

    textbox1.text = Column1
    textbox2.text = Column2
    textbox3.text = Column3
    textbox4.text = Column4

    Mit diesem Code kann ich Column1, Zeile 1 befüllen:

    VB.NET-Quellcode

    1. With DataGridView1
    2. .Rows.Add(textBox1.Text)
    3. End With


    Allerdings bleiben Column2 - Column4 leer.
    Ich brauche also einen Code der mir Column2, Column3 und Column4 mit den o.g. Werten befüllt.

    D.h. ich habe zum Beispiel:
    TextBox1.Text = 1
    textbox2.text = Max
    textbox3.text = Mustermann
    textbox4.text = HR

    Dann soll in meinem DataGridView in der jeweiligen Zelle folgendes stehen:
    Column1 = Wert der TextBox1 (in diesem Fall "1")
    Column2 = Wert der TextBox2 (in diesem Fall "Max")
    Column3 = Wert der TextBox3 (in diesem Fall "Mustermann")
    Column4 = Wert der TextBox4 (in diesem Fall "HR")

    nach dem Eintragen dieser Werte sollen die Textboxen geleert werden - ist kein Problem, funktioniert Problemlos mit Button1_Click.
    Im Anschluss sollen wieder Daten in die TextBox1 - TextBox4 eingetragen werden können.

    Also haben wir ja wieder folgendes:

    Bei den "Columns" die Variablen:

    Column1 = Number
    Column2 = Surname
    Column3 = Lastname
    Column4 = department

    und bei den "neuen" Textboxen:

    TextBox1.Text = 2
    textbox2.text = Beate
    textbox3.text = Beispiel
    textbox4.text = Beispiel-Abteilung

    Wenn ich dann wieder auf meinen "Button1" klicke soll das DataGrid View in Zeile 1 folgendes enthalten:
    1 - Max - Mustermann - HR

    und in Zeile 2:
    2 - Beate - Beispiel - Beispiel-Abteilung

    Und jetzt das Problem:
    WIE übergebe ich den Wert von TextBox2 an Column2?
    WIE übergebe ich den Wert von TextBox3 an Column3?
    WIE übergebe ich den Wert von TextBox4 an Column4?

    Was mich zu einer weiteren Frage führt:
    Gibt es die Möglichkeit "Column1" automatisch "hochzählen" zu lassen? Also einfach fortlaufende Nummern...?

    Ich hoffe dass es so besser verständlich ist...?
    Willkommen im Forum.

    Eine Möglichkeit ist:

    VB.NET-Quellcode

    1. DataGridView1.Rows.Add(textBox1.Text)
    2. DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(1).Value = TextBox2.Text 'die 2. Zelle der letzten Zeile wird somit befüllt
    3. DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(2).Value = TextBox3.Text
    4. DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(3).Value = TextBox4.Text

    ABER: Das ergäbe nur dann Sinn, wenn Du mit den DGV-Daten nicht weiterarbeiten willst - was sehr unwahrscheinlich ist. Die Daten sollten im DGV angezeigt werden und dort ggf. bearbeitbar sein, der "echte" Speicherplatz Deiner Daten sollte aber nicht das DGV sein. Eine DataTable eines tDS - wie exc-jdbi erwähnte - ist eine Möglichkeit. Wenn Du tiefergehende OOP-Vorhaben mit Deinen Daten hast, dann eine Daten-Klasse oder wasauchimmer, aber nur-DGV-Daten machen die Sache später komplizierter als es sein muss. Ich spreche aus Erfahrung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    1. Spalten hinzufügen
    DataGridView.Columns.Add()

    2. Zeilen hinzufügen mit Werten
    DataGridView.Rows.Add(Value1, Value2, Value3,...)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @0ptix Warum lässt Du die Texte nicht direkt in das DGV bzw. die DataTable schreiben?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @VaporiZed Okay, ich versuche das mal & melde mich dann wieder. Danke dir :)

    //Nachtrag:
    Die Zellen werden befüllt, alles gut. Allerdings steht jetzt der Text aus TextBox1 in der ersten Zelle, dann wird eine neue Zeile angelegt und der Rest dann in den anderen Zellen..
    Wenn ich das Rows.Add weglasse dann bekomm ich einen Fehler..

    //Nachtrag Nummer2:
    Wenn ich das ohne With mache und nur das hier verwende dann legt er mir keine neuen Zeilen an..

    VB.NET-Quellcode

    1. DataGridView1.Rows(DataGridView1.Rows.Count - 1).Cells(1).Value = txtbox.Text


    @exc-jdbi Sorry ich hab jetzt erst deinen Code gesehen, entschuldigung. Ich werde mir das auch gleich mal anschauen, evtl bringt mich das meinem Ziel näher. Danke vorab :)

    @RodFromGermany Weil das Read-only ist. Das hat schon so seinen Sinn warum ich das so machen will ;)

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

    @VB1963 natürlich. Und zwar:
    Die einzelnen Zellen sollen nicht veränderbar sein, d.h. einmal drin - nich mehr raus. Das einzige was veränderbar sein soll ist in einer Zelle via Dropdown hinterlegt.
    Ich hab mich evtl falsch ausgedrückt, sorry. Ich wollte eigentlich sagen dass ich die Zellen auf Read-Only einstelle :)
    @VB1963
    Ja als "Datenbank" wollte ich einfach eine Excel Datei verwenden...
    Weil die Daten von DGV in Excel und zurück sollte ja kein Problem sein.

    Es ist so:
    Aus diesem Programm wird eine Excel Datei erstellt in dieser steht z.b. personenbezogene Daten.
    In der Datenbank sollen dann nur daten stehen die diese Person betreffen, also z.b Telefonnummer, E-Mail Adresse, Gesprächsnotizen.
    D.h ich erstelle mithilfe von eine Instanz bzw eine variable Excel-Tabelle

    VB.NET-Quellcode

    1. My.Computer.FileSystem.CreateDirectory(
    2. "C:\Test\" & txtBoxName.Text & "\")
    3. oBook.SaveAs("C:\Test\" & txtBoxProjectNumber.Text)


    Danach fülle ich die Tabelle mit diesem Code:

    VB.NET-Quellcode

    1. Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    2. Dim oExcel As Object
    3. Dim oBook As Object
    4. Dim oSheet As Object
    5. oExcel = CreateObject("Excel.Application")
    6. oBook = oExcel.Workbooks.Add
    7. oSheet = oBook.Worksheets(1)
    8. oSheet.Range("B2").Value = txtBoxName.text


    Das dann wieder rein zu laden, also dass in der txtBoxName.text der Wert aus der Zelle "B2" steht funktioniert problemlos.
    Beide obige Codes funktionieren so wie ich will, d.h das passt soweit.

    Allerdings will ich dann das DataGridView in die gleiche Excel-Mappe speichern und ebenfalls wieder in das "Programm" laden.
    Somit habe ich eine klare trennung der Informationen. Ist das halbwegs verständlich? :S

    Oder ist es möglich für jede "Person" eine neue DataSet zu erstellen und die nach dem gleichen Prinzip wieder zu laden?
    Also mit einem OpenFileDialog wie ichs auch schon mit der Excel Datei gemacht habe
    Weil wenn ich das mit dem DataSet richtig verstanden habe dann brauch ich ja unfassbar viele davon weil die sich nicht aus dem Programm heraus generieren lassen...?

    //Nachtrag: Ich versuchs noch mal mit Bildern zu erklären:







    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „0ptix“ ()

    0ptix schrieb:

    Allerdings steht jetzt der Text aus TextBox1 in der ersten Zelle, dann wird eine neue Zeile angelegt und der Rest dann in den anderen Zellen..
    Das passiert aber nur, wenn Du im DGV erlaubst, dass Zeilen vom Benutzer hinzugefügt werden dürfen. Dann musst Du so arbeiten:

    VB.NET-Quellcode

    1. DataGridView1.Rows.Add(textBox1.Text)
    2. DataGridView1.Rows(DataGridView1.Rows.Count - 2).Cells(1).Value = TextBox2.Text 'die 2. Zelle der letzten Zeile wird somit befüllt
    3. DataGridView1.Rows(DataGridView1.Rows.Count - 2).Cells(2).Value = TextBox3.Text
    4. DataGridView1.Rows(DataGridView1.Rows.Count - 2).Cells(3).Value = TextBox4.Text

    Oder besser wie mrMo schrieb.

    ##########

    Bilder-Uploads bitte forenintern mittels [+ Erweiterte Antwort]
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    0ptix schrieb:

    Ja als "Datenbank" wollte ich einfach eine Excel Datei verwenden...
    Weil die Daten von DGV in Excel und zurück sollte ja kein Problem sein.
    Excel ist keine Datenbank...
    Aber wie du ein Excelsheet in eine Tabelle eines typ. Dataset einliest und ein DGV an die Tabelle bindest, findest du hier Excel in DataGridView importieren (eine Textbox kannst du ebenso binden...)
    What? Doch, natürlich. Damit geht es sogar einfacher - wie geschrieben. Die tDS-Tables lassen sich leicht befüllen und sind ein sinnvollerer Speicherort als in einem DGV. Die Daten bei tDS-Verwendung werden dann später nur in einem DGV angezeigt. Und/oder in TextBoxen. Oder woauchimmer.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ah okay verstehe. Ich dachte nur dass ich dann für jede einzelne Person im Voraus ein Datatable bzw dataset definieren muss.
    Ich weiß ja noch nicht wie viele Personen das werden sollen.
    Ich gehe also mal davon aus dass ich auch aus dem Programm selbst ein DataSet bzw eine neue XML Datei anlegen kann :)
    Vielen Dank euch für die vielen Antworten, ich konnte soweit alles realisieren was ich wollte, das einzige was noch fehlt is
    der Export und IMport der Excel datei, ist aber dneke ich machbar mit den Links von euch :)
    Vielen Lieben Dank

    0ptix schrieb:

    Ich dachte nur dass ich dann für jede einzelne Person im Voraus ein Datatable bzw dataset definieren muss. Ich weiß ja noch nicht wie viele Personen das werden sollen.
    Eigentlich machst du das in einer Tabelle (diese Tabelle befindet sich im Dataset!) - da kannst du in dieser einen Tabelle endlich viele Personen angeben. Zu dem ist sie ja da. Oder verstehe ich dich da nicht richtig 8|
    @VB1963
    Also ich möchte über das Programm einen Benutzer mit Details hinzufügen und das speichern.
    Wenn ich jetzt also einen Namen anklicke und dann auf "Laden" klicke dann möchte ich alle Details eines Benutzers in meinem Programm sehen.

    Es kann ja jederzeit ein neuer Benutzer hinzukommen & ich möchte nicht jedes mal die Tabelle in Visual Studio öffnen und eine neue Datenbank oder DatenSet erstellen sondern das direkt aus dem Programm heraus machen.

    Ist das halbwegs verständlich? :S

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „0ptix“ ()

    Du musst ja auch nicht jedesmal beim Öffnen deiner App ein neues Dataset und eine Datenbank neu erstellen. Das ist ja unsinnig...
    Deine App besitzt ein Dataset mit deiner Tabelle, die beim Öffnen mit Daten befüllt werden soll. Die Daten kommen von einer externen Datendatei oer DB. Bei Datendatei kann es sich um eine .xml-Datei handeln, die deine Daten für deine App enthält. Das Dataset ist ganz leicht via .xml-Datei zu bedienen. Die darin befindliche Tabelle wird mit deinem DGV und anderen visualisierenden Controls mittels Bindingsource an die dort befindlichen Daten angebunden und synchronisiert. Und dazu benötigt man nicht einmal überwiegend viel Usercode dazu...
    Schaue dich im Tutorialbereich Datenbanken einmal um. Da hat @ErfinderDesRades sehr viel davon verfasst und super beschrieben...
    Und nur nochmal um das klarzustellen, da da wohl falsche Vorstellungen zu sein scheinen: Ein tDS und seine DataTables sind genauso beim Programmstart, also von Anfang an, da wie Dein Formular, Deine Buttons und Dein leeres DGV. Sie müssen zwar erstmal dem Projekt hinzugefügt werden - (fast) genauso wie ein DGV oder eine TextBox, aber danach warten sie nur darauf, befüllt zu werden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.