Toon posts:

[VB.NET2005] Record toevoegen aan DataTable in DataSource

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo Programmeurs,
Ik heb een DataSource aangemaakt met daarin allemaal DataTables.
En nu wil ik vanuit mijn code die DataTable vullen. Een waarde daarvan in een code die gegenereert wordt met de datum van vandaag + een volgnummer. Er staan ook een aantal objecten op het formulier die de gebruiker moet invullen. Ik heb ook databinding toegepast met de objecten op het formulier naar de DataTable. Ik zie allemaal voorbeelden waarin mensen de DataTable vullen met dt.columns(attribuutnaam) = waarde. Dat wil ik ook maar omdat mijn DataTable in een DataSource staat heb ik niet deze properties bij mijn DataTable.
Wanneer ik dus DataSource.DataTable. doe krijg ik maar 4 properties i.p.v. een hele lijst.
Weet iemand hoe ik een DataTable kan vullen vanuit de code en vanaf het formulier (met databinding) die onderdeel is van een DataSource ??? _/-\o_
Ik hoop dat ik duidelijk mijn probleem beschreven hebt. Ik heb op allerlei websites gekeken, aantal boeken doorgespit maar kom mijn probleem niet tegen alleen maar met de hand aangemaakte DataTables die dan worden geupdate.
Bijvoorbaat dank voor de moeite.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:01
Een DataTable heeft altijd een NewRow() en AddRow() method. De eerste 'maakt' een nieuwe rij, met de 2de method voeg je je (opgevulde) rij toe aan je table.
Als het over typed DataTables gaat, dan bepaalt de naam van je datatable ook de naam van de NewxxxRow() en Addxxx method

https://fgheysels.github.io/


Verwijderd

Topicstarter
Dat is juist het probleem, ik kan die DataTable alleen maar bereiken als ik er de DataSource naam voor zet. En als ik dan DataSource.DataTable. doe krijg ik maar 4 properties, nl:
- equals
- GetDataTableSchema
- GetTypedTableSchema
- ReferenceEquals

En dus niet AddRow, NewRow en Columns enz.
Het is mij wel gelukt om een nieuwe rij aan de DataGrid toe te voegen, d.m.v. de databinding.
TblNaamBindingSource.AddNew()
TblNaamBindingSource.MoveLast()
maar bij de TblNaamBindingSource heb ik geen property met Columns.

Dus mijn vraag blijft hoe kan ik een DataTable die onderdeel van een DataSource is vullen met data vanuit de code en vanaf het formulier met objecten die datagebonden zijn aan de DataTable ????

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:01
Mja, ik heb atm niet echt ervaring met die .NET 2.0 bindingsource gevallen, maar, het is niet omdat je die method niet in je intellisense lijstje krijgt, dat hij daarom niet bestaat.

https://fgheysels.github.io/


  • lier
  • Registratie: Januari 2004
  • Laatst online: 18:24

lier

MikroTik nerd

Probeer eens of je je datasource kan casten naar een datatable:

((DataTable)DataSource.DataTable).

Dan zou Intelissence (goed gespeld ?) ook weer moeten werken...

[ Voor 4% gewijzigd door lier op 18-07-2006 11:57 ]

Eerst het probleem, dan de oplossing


Verwijderd

Topicstarter
whoami schreef op dinsdag 18 juli 2006 @ 11:50:
Mja, ik heb atm niet echt ervaring met die .NET 2.0 bindingsource gevallen, maar, het is niet omdat je die method niet in je intellisense lijstje krijgt, dat hij daarom niet bestaat.
oh oke jammer, ik merk dat het nog vrij nieuw is dat er nog weinig over te vinden is en dat boeken het ook niet echt goed beschrijven, normaal programmeer ik alles vanuit de code, maar dit is voor mijn werk en mijn baas wil het op deze manier. Ik ga dan toch even proberen die properties van die DataTable in te stellen op de manier zoals het normaal zou moeten.
Toch bedankt voor de moeite _/-\o_ Ik hoop dat iemand anders hier ervaring mee heeft en mij uit de brand kan helpen

Verwijderd

Topicstarter
lier schreef op dinsdag 18 juli 2006 @ 11:52:
Probeer eens of je je datasource kan casten naar een datatable:

((DataTable)DataSource).

Dan zou Intelissence (goed gespeld ?) ook weer moeten werken...
Ik heb al meer van dat soort dingen geprobeerd en dan krijg ik de foutmelding:
cannot be used as an expression.

Ik heb wel iets gevonden over een DataRow. dat je die moet aanmaken en daarin de kolommen oproept en een waarde meegeeft. Hier is een voorbeeld daarvan.

Dim customerRow() As Data.DataRow
customerRow = DataSet1.Tables("Customers").Select("CustomerID = 'ALFKI'")

customerRow(0)("CompanyName") = "Updated Company Name"
customerRow(0)("City") = "Seattle"

Ik ga dit ook nog even proberen.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 13-10-2025

MrSleeves

You'll thank me later.

Allereerst heeft de Intellisense in 2005 de optie om "All" of "Common" weer te geven (maar aan de "Equals" te zien, staat hij op All).

En ten tweede lijken de properties/functies Shared te zijn; oftewel: heb je wel een object aangemaakt?
Als ik System.Data.DataTable. intyp, krijg ik namelijk praktisch hetzelfde lijstje (op GetTypedTableSchema na).

En met DataSource bedoel je een DataSet? (DataSource is een property van bijvoorbeeld een Combobox of Datagrid o.i.d.)

[ Voor 20% gewijzigd door MrSleeves op 18-07-2006 12:02 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
MrSleeves schreef op dinsdag 18 juli 2006 @ 12:00:
Allereerst heeft de Intellisense in 2005 de optie om "All" of "Common" weer te geven (maar aan de "Equals" te zien, staat hij op All).

En ten tweede lijken de properties/functies Shared te zijn; oftewel: heb je wel een object aangemaakt?
Als ik System.Data.DataTable. intyp, krijg ik namelijk praktisch hetzelfde lijstje (op GetTypedTableSchema na).

En met DataSource bedoel je een DataSet? (DataSource is een property van bijvoorbeeld een Combobox of Datagrid o.i.d.)
Ja hij staat inderdaad op ALL.

Kan ik die DataSource of DataTable niet public maken dan ?
En dat object heb ik wel aangemaakt maar ik kan hem niet koppelen aan de DataSource.DataTable.
Ik neem aan dat dat de bedoeling is, want daar moet het heen gaan.
Dim dt As DataTable
dt.DataSet = DataSource.DataTable.

Bedoel je dat ? zo nee, hoe bedoel je het dan ? :r
Als ik nu dt. doe krijg ik wel alle properties van de DataTable maar dat is ook logisch.

  • xylone
  • Registratie: December 2001
  • Laatst online: 14-12-2025
Als ik het goed begrijp heb je dus een aantal tabellen via relaties opgevraagd en in een datasource geplaatst en deze gebind aan een grid oid?

Wanneer je dit doet, kun je niet direct data toevoegen, omdat dit een view is van verschillende tabellen.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 13-10-2025

MrSleeves

You'll thank me later.

Wat is die DataSource? DataSource is (als property van een Combobox) een Object dat Ilist implementeert; dat kan dus van alles zijn (Array, DataSet, DataTable).

Als DataSource een DataSet is (wat ik vermoed, aangezien je in de startpost zegt dat er DataTables inzitten), dan kan dit toch gewoon:
code:
1
2
Dim dt as DataTable = Directcast(DataSource, DataSet).Tables("<tabelnaam/nummer>")
dt.AddRow(New Object() {item1, item2})


Of je doet het netjes met dt.NewRow, dan krijg je een DataRow terug die je in kan vullen.

[ Voor 54% gewijzigd door MrSleeves op 18-07-2006 12:13 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
xylone schreef op dinsdag 18 juli 2006 @ 12:07:
Als ik het goed begrijp heb je dus een aantal tabellen via relaties opgevraagd en in een datasource geplaatst en deze gebind aan een grid oid?

Wanneer je dit doet, kun je niet direct data toevoegen, omdat dit een view is van verschillende tabellen.
ja zo is mijn situatie nu.
maar ik heb in een zo'n TableAdapter een Fill Query gemaakt die dus verschillende tabellen bij elkaar douwt. Die TableAdapter is de DataSource voor mijn datagrid. Die datagrid functioneert gewoon prima en het databinding werkt ook prima. Maar Microsoft pleit juist ervoor dat je met hun "geweldige" DataSource meerdere tabellen (ook meerdere databases) aan elkaar kan koppelen en met DataBinding makkelijk gegevens kan updaten en toevoegen. Maar jij zegt dat het niet mogelijk is als je een TableAdapter met relaties naar meerdere tabellen hebt om dan data toe te voegen ? dan zie ik het nut niet in van het hele gedoe, iedereen heeft toch in een database meerdere relaties met meerdere tabellen :X

Verwijderd

Topicstarter
MrSleeves schreef op dinsdag 18 juli 2006 @ 12:11:
Wat is die DataSource? DataSource is (als property van een Combobox) een Object dat Ilist implementeert; dat kan dus van alles zijn (Array, DataSet, DataTable).
DataSet

  • xylone
  • Registratie: December 2001
  • Laatst online: 14-12-2025
Verwijderd schreef op dinsdag 18 juli 2006 @ 12:12:
[...]
maar ik heb in een zo'n TableAdapter een Fill Query gemaakt die dus verschillende tabellen bij elkaar douwt. Die TableAdapter is de DataSource voor mijn datagrid.
Als ik me goed herinner kun je daar ook ergens een update query genereren. Misschien dat het inderdaad daar wel mee kan. (Ik heb het zelf heel snel proberen te vergeten, omdat je in de toekomst toch tegen de beperkingen aan gaat lopen, maar dat ik mijn mening ;-) )

Ff gezocht... Het is nl. een DataView (denk ik) wat je in de DataSource hebt zitten.

Hierin kun je wel data wijzigen dmv:
code:
1
2
3
4
5
6
7
private void AddNewDataRowView(DataView dv)
{
   DataRowView drv = dv.AddNew();
   // Change values in the DataRow.
   drv["ColumnName"] = "New value";
   drv.EndEdit();
}

Verwijderd

Topicstarter
xylone schreef op dinsdag 18 juli 2006 @ 12:29:
[...]

Ff gezocht... Het is nl. een DataView (denk ik) wat je in de DataSource hebt zitten.

[/code]
Als ik op mijn DataSource klik staat er duidelijk dat het een DATASET is.

----------------Rij toevoegen----------------------
Dim CustomersRow As DataRow = dataset.Tables("tabelnaam").NewRow()

CustomersRow("attribuut") = con_id
DsDBdata.Tables("tabelnaam").Rows.Add(CustomersRow)

----------------Rij wijzigen----------------------
Dim customerRow() As Data.DataRow
customerRow = DsDBdata.Tables("tabelnaam").Select("attribuut= " & variabele& "")

customerRow(0)("attribuut") = "Nieuwe tekst"

---------------------------------

Maar stel dat ik het op deze manier doe dan zit ik nog met de objecten op mijn formulier die datagebonden zijn. Dan zou ik die handmatig in de code een voor een moeten noteren:
customerRow(1)("attribuut2") = tekstbox.text
customerRow(2)("attribuut3") = tekstbox2.text
Enzovoorts, maar dat is niet de bedoeling daar heb ik juist die DataBinding voor dat dat niet meer hoeft. En alleen met die databinding kom ik er ook niet, want dan heb ik nog een waarde die vanuit de code gegenereert wordt, die datum van vandaag + volgnr. Die moet ik eigenlijk toevoegen op het moment dat de gebruiker alle tekstboxen en shit heeft ingevuld en op Save klikt. Dan wordt de DataTable of TableAdapter gevuld en daarna wil ik dus nog kunnen aangeven dat die gegenereerde code er nog bij moet. Dat is mijn probleem :'(

  • xylone
  • Registratie: December 2001
  • Laatst online: 14-12-2025
Om even iets meer van je code te snappen, kun je niet het stuk code posten waarin je je data ophaald en bind aan de controls?

  • Sensei_D
  • Registratie: Maart 2002
  • Laatst online: 29-01 15:14
Ff voor mijn duidelijkheid :+ : wat je feitelijk wilt is een record toevoegen m.b.v. een datagebonden control, en op datzelfde moment 2(of1) velden van het toe te voegen record toevoegen? Zo, ja, dat moet in het bewaarevent van de datagebonden control.
Zo, nee, dan kan ik je niet helpen ;)

sensei_d.fpv channel


Verwijderd

Topicstarter
Sensei_D schreef op dinsdag 18 juli 2006 @ 13:30:
Ff voor mijn duidelijkheid :+ : wat je feitelijk wilt is een record toevoegen m.b.v. een datagebonden control, en op datzelfde moment 2(of1) velden van het toe te voegen record toevoegen? Zo, ja, dat moet in het bewaarevent van de datagebonden control.
Zo, nee, dan kan ik je niet helpen ;)
Ja dat is precies wat ik wil. Ik heb een aantal datagebonden controls op het formulier die wil ik toevoegen + in de code nog een veld dat bestaat uit een gegenereerde code.

De bewaarevent van de datagebonden control is dan de tblnaamBindingSource als ik mij niet vergis, daarmee doe ik ook een AddNew() bij de datagrid.
Maar in de tblnaamBindingSource heb ik weer niet de property Columns, daar had ik dus al op gezocht. Ook geen Rows. Hoe zorg ik dan dat in een huidige record die in die tblnaamBindingSource staat nog een veld kan toevoegen voordat ie naar de DataSet wordt geupdate ???

Verwijderd

Topicstarter
xylone schreef op dinsdag 18 juli 2006 @ 13:26:
Om even iets meer van je code te snappen, kun je niet het stuk code posten waarin je je data ophaald en bind aan de controls?
Dat gaat lastig omdat er op 1 regel na niets geprogrammeerd wordt maar alles via de DataSet / DataTables / DataBinding gedaan wordt. Dus alles in de properties op het formulier.
De enige regel code die ik heb is tijdens het laden van het formulier om de DataGrid te vullen
tableAdapter.fill(DataSet.tabelnaam) Ik heb dus een DataSet met allemaal DataTables. Ik heb een formulier met tekstboxen en comboboxen, die heb ik datagebonden aan de Tabel waar het vandaan of heen moet. En ik heb een datagrid op het formulier die de datasource van de DataTable heeft.
Ik hoop dat je zo mijn situatie beter begrijpt. Het gaat hierbij om het vastleggen van ContactMomenten. Dus per e-mail of per telefoon enz. De gebruiker moet dus die textboxen en comboboxen vullen en vervolgens op save klikken, dan maak ik via de code een contact code aan die wordt gegenereert en ziet de gebruiker dus niet, maar moet wel naar de DataSet toe.
Dus het bestaat uit 2 delen: formulier met textboxen en comboboxen die datagebonden zijn en een veld wat vanuit de code gevuld moet worden. Dat moet in 1 record weggeschreven worden.

  • xylone
  • Registratie: December 2001
  • Laatst online: 14-12-2025
Verwijderd schreef op dinsdag 18 juli 2006 @ 13:44:
[...]
Dat gaat lastig omdat er op 1 regel na niets geprogrammeerd wordt maar alles via de DataSet / DataTables / DataBinding gedaan wordt. Dus alles in de properties op het formulier.
Als je naar de code kijkt, zul je wel bindings moeten kunnen terug vinden, zoiets als
textBoxAddress.DataBindings.Add("Text", customersDataSet1, "Customers.Address");

Nu is het zo, dat wanneer je deze waarde veranderd dat deze direct in je dataset wordt veranderd, en dat je dus je dataset kunt wegschrijven naar je db.

Maar voor het maken van een nieuw record, zul je toch bij je adapter moeten kijken, of daar niet iets van een new() methode aanwezig is. Alleen deze weet nl. hoe de tabellen structuur in elkaar zit en hoe je een nieuwe row kunt maken. Wanneer je dit dus onder een knop "Nieuw" zet, kun je gelijk je ID (Datum tijd en nummer) setten.

  • Sensei_D
  • Registratie: Maart 2002
  • Laatst online: 29-01 15:14
Verwijderd schreef op dinsdag 18 juli 2006 @ 13:44:
[...]


Dat gaat lastig omdat er op 1 regel na niets geprogrammeerd wordt maar alles via de DataSet / DataTables / DataBinding gedaan wordt. Dus alles in de properties op het formulier.
De enige regel code die ik heb is tijdens het laden van het formulier om de DataGrid te vullen
tableAdapter.fill(DataSet.tabelnaam) Ik heb dus een DataSet met allemaal DataTables. Ik heb een formulier met tekstboxen en comboboxen, die heb ik datagebonden aan de Tabel waar het vandaan of heen moet. En ik heb een datagrid op het formulier die de datasource van de DataTable heeft.
Ik hoop dat je zo mijn situatie beter begrijpt. Het gaat hierbij om het vastleggen van ContactMomenten. Dus per e-mail of per telefoon enz. De gebruiker moet dus die textboxen en comboboxen vullen en vervolgens op save klikken, dan maak ik via de code een contact code aan die wordt gegenereert en ziet de gebruiker dus niet, maar moet wel naar de DataSet toe.
Dus het bestaat uit 2 delen: formulier met textboxen en comboboxen die datagebonden zijn en een veld wat vanuit de code gevuld moet worden. Dat moet in 1 record weggeschreven worden.
Maar dit is veel makkelijker te doen hoor. Ik adviseer wel een FormView te gebruiken, die is speciaal gemaakt voor het bewerken van enkele records, maar het is zeker niet verplicht.

Wat je moet doen is het te genereren veld gewoon niet binden en dan het volgende event in je code neerplanten(geld voor FormView, heb alleen ff VS.NET2K5 bij de hand):
code:
1
2
3
4
    Protected Sub FormView1_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewInsertEventArgs) _
        Handles FormView1.ItemInserting
        e.Values("jespecialeveld") = "specialevalue"
    End Sub

De rest is wel gebind en alles wordt dan in 1 keer bewaard en volgens mij heb je dan wat je wilt....

[ Voor 4% gewijzigd door Sensei_D op 18-07-2006 13:57 ]

sensei_d.fpv channel


Verwijderd

Topicstarter
Sensei_D schreef op dinsdag 18 juli 2006 @ 13:56:
[...]

Maar dit is veel makkelijker te doen hoor. Ik adviseer wel een FormView te gebruiken, die is speciaal gemaakt voor het bewerken van enkele records, maar het is zeker niet verplicht.

Wat je moet doen is het te genereren veld gewoon niet binden en dan het volgende event in je code neerplanten(geld voor FormView, heb alleen ff VS.NET2K5 bij de hand):
code:
1
2
3
4
    Protected Sub FormView1_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewInsertEventArgs) _
        Handles FormView1.ItemInserting
        e.Values("jespecialeveld") = "specialevalue"
    End Sub

De rest is wel gebind en alles wordt dan in 1 keer bewaard en volgens mij heb je dan wat je wilt....
Zoiets zoek ik ja. 8)
Het is in ieder geval duidelijk wat ik bedoel. Ik heb idd niet het speciale veld gebonden, wat overigens wel een oplossing is maar niet de "schoonste" programmeeroplossing.
Wat ik in gedachte had is een invisible textfield op het formulier te planten en daar de gegenereerde code in te stoppen en die wel te databinden aan het juiste attribuut in de DataTable. Dan wordt ie gewoon mee weggeschreven naar de DataTable net als alle andere objecten op het formulier die wel zichtbaar zijn.

  • Sensei_D
  • Registratie: Maart 2002
  • Laatst online: 29-01 15:14
Verwijderd schreef op dinsdag 18 juli 2006 @ 14:20:
[...]


Zoiets zoek ik ja. 8)
Het is in ieder geval duidelijk wat ik bedoel. Ik heb idd niet het speciale veld gebonden, wat overigens wel een oplossing is maar niet de "schoonste" programmeeroplossing.
Wat ik in gedachte had is een invisible textfield op het formulier te planten en daar de gegenereerde code in te stoppen en die wel te databinden aan het juiste attribuut in de DataTable. Dan wordt ie gewoon mee weggeschreven naar de DataTable net als alle andere objecten op het formulier die wel zichtbaar zijn.
Dit laatst is natuurlijk ook mogelijk ja, maar dit lijk me niet heel erg netjes. Maar voeg je een nieuw record toe met de datagrid dan? Mag ik anders vragen hoe je dat doet. Misschien dat het daar ook wel mee kan op de manier die ik aangeef...

sensei_d.fpv channel


Verwijderd

Topicstarter
Sensei_D schreef op dinsdag 18 juli 2006 @ 16:02:
[...]

Dit laatst is natuurlijk ook mogelijk ja, maar dit lijk me niet heel erg netjes. Maar voeg je een nieuw record toe met de datagrid dan? Mag ik anders vragen hoe je dat doet. Misschien dat het daar ook wel mee kan op de manier die ik aangeef...
Nee niet met een datagrid, die is read-only, de gebruikers mogen en kunnen daar niks in typen.
Ik werk met een DataSet en DataTables. Zo'n DataTable heeft een TableAdapter en daarmee kan ik nu records updaten, dat werkt gewoon. Alleen wat nog niet werkt is een nieuwe record toevoegen die deels uit datagebonden objecten op het formulier bestaat EN een waarde die vanuit de code moet worden meegegeven aan diezelfde record.

  • Sensei_D
  • Registratie: Maart 2002
  • Laatst online: 29-01 15:14
Verwijderd schreef op donderdag 20 juli 2006 @ 10:17:
[...]


Nee niet met een datagrid, die is read-only, de gebruikers mogen en kunnen daar niks in typen.
Ik werk met een DataSet en DataTables. Zo'n DataTable heeft een TableAdapter en daarmee kan ik nu records updaten, dat werkt gewoon. Alleen wat nog niet werkt is een nieuwe record toevoegen die deels uit datagebonden objecten op het formulier bestaat EN een waarde die vanuit de code moet worden meegegeven aan diezelfde record.
Je doet hem helemaal in code??
Kan je dit niet doen dan? Ik heb het niet getest.
code:
1
2
3
    Protected Sub Objectdatasource_Inserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ObjectDataSourceMethodEventArgs)
        e.InputParameters.Item("jespecialeveld") = "jespecialevalue"
    End Sub

Toch is dit met een FormView VELE malen makkelijker.

sensei_d.fpv channel


Verwijderd

Topicstarter
bedankt voor de moeite, maar ik heb al een andere oplossing gevonden die makkelijker is. Je moet een DataRowView aanmaken: Dim drv As DataRowView = tabelnaamBindingSource.AddNew
en dan doe je drv("kolomnaam") = waarde en dan onder de knop save doe je de TableAdapter updaten en dan worden de waarden van het formulier + de waarde uit je code naar de Database gestuurd. Dat is precies wat ik zocht. Die bindingsource houdt de waarden net zolang bij zich totdat je een update doet, dan schrijft ie alles weg naar de DataSet(DB). Nogmaals bedankt voor het helpen zoeken iedereen _/-\o_ Nog een tip: je kan geen TableAdapter updaten die uit meerdere tabellen is samengesteld, meeste van jullie zullen dit wel weten maar voor diegene die het nog niet weten bij deze.
Pagina: 1