Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[C#]Bindingsources, tableadapters & views

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een urenregistratie systeempje.
Verschillende mensen kunnen op urencodes schrijven. Elke urencode heeft een maximaal aantal beschikbare uren. Voordat de uren opgeslagen kunnen worden moet eerst gecontroleerd worden of er nog wel voldoende uren beschikbaar zijn.
Ik gebruik C# met een MS-SQL2005 database in VS2008. Ik heb drie relevante tabellen:
  • uren
  • codes
  • medewerkers
Het form is 'gebound' op de tabel uren.
Op mijn form moet eerst de medewerker worden geselecteerd uit een combobox. Deze combobox wordt gevuld met de Naam en ID uit de medwerkers tabel. Het ID wordt in uren opgeslagen.
Uit de combobox codes moet de juiste code worden geselecteerd. Deze combobox krijgt zijn data via een opgeslagen view die de unieke codes uit de codes tabel haalt.
Op de SelectionChangeCommitted event van deze combobox worden de overige gegevens uit de codes tabel gehaald via dezelfde view. Deze gegevens zoals start en einddatum, de beschikbare en de geboekte uren worden als labels op het form getoond.
Vervolgens worden de uren ingevuld en wordt er gecontroleerd of het aantal geboekte uren plus de nieuwe uren niet meer zijn dan de beschikbare uren.
Indien dit allemaal OK is, wordt de save knop enabled en kan het record worden opgeslagen.

Dit werkt allemaal prima, alleen worden de geboekte uren wel in de database ververst, maar niet in de dataset, zodat als je opnieuw dezelfde urencode selecteert de geboekte uren de oude waarden hebben en men dus gewoon door kan blijven boeken, ook al zijn de uren opgebruikt.
Als het form wordt gesloten en weer wordt geopend zijn de uren wel geupdate.

Waarschijnlijk moet ik een keer extra de gegevens uit de tabel ophalen, maar ik kom er niet uit hoe en waar.

Eerst maar eens wat code.
Overigens heb ik het form gemaakt door de velden te slepen uit de dataset.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void Dagboekje_Load(object sender, EventArgs e)
{
  // Vullen unieke codes:
  this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes);
  // Vullen medewerkers:
  this.medewerkersTableAdapter.Fill(this.dataSet.Medewerkers);
  this.urenBindingSource.AddNew();
}

private void CodesComboBox_SelectionChangeCommitted(object sender, EventArgs e)
{
  // Ophalen gegevens obv geselecteerde urencode:
  DataRow[] row = this.dataSet.vw_uniekeCodes.Select("Irisnr = " + irisnr);            
}

private void BtnSaveRecord_Click(object sender, EventArgs e)
{
  this.urenBindingSource.EndEdit();
  this.tableAdapterManager.UpdateAll(this.urenDataSet)

  // Hier moet waarschijnlijk een soort van update komen,
  // deze optie geeft weer andere problemen:
  // this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes); 
}


Het probleem zit in de update.
Als ik this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes); doe, dan worden de updates ineens niet goed naar de database gestuurd.
Dan wordt elke keer de eerste urencode uit de combobox verstuurd, ipv de geselecteerde. Maar dat geldt dan weer niet voor de laatste.
Dus als ik meerdere records toevoeg zonder het form te sluiten dan hebben alle records als urencode 14594 (de eerste in de combobx) behalve de laatst toegevoegde. Bij het sluiten van het form gaat het dan wel goed. Maar ik heb geen specifieke code daarvoor gemaakt.

Heeft iemand een idee, waar ik fout zit? _/-\o_

Verwijderd

Topicstarter
Even een klein schopje omdat het weekend er tussen zat ;)

Verwijderd

Topicstarter
Ik heb het inmiddels opgelost. Na heel veel gepuzzel.
Inderdaad moet de TableAdapter opnieuw gevuld worden, elke keer als er een record is toegevoegd:
C#:
1
this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes);  

Het probleem was nu wanneer/waar.
Ik heb een nieuwe functie gemaakt: AddRecord(). Deze functie wordt aangeroepen in de Load event van het form en helemaal op het einde van het Click event van de Save-knop.
De truc is om de .Fill() aan te roepen, nadat urenBindingSource.AddNew(); is aangeroepen.
C#:
1
2
3
4
5
6
7
8
9
10
11
private void AddRecord()
{
    this.urenBindingSource.AddNew();
    
    // Set default values 
   [.. knip ..]
    // Get view data:
    this.vw_uniekeCodesTableAdapter.Fill(this.dataSet.vw_uniekeCodes);

    this.btnSaveRecord.Enabled = this.AllFilledCorrectly();
}

Hopelijk heeft iemand anders er wat aan. het heeft mij drie dagen uitzoekwerk gekost.

  • Aphelion
  • Registratie: Januari 2002
  • Laatst online: 11-11 09:56
Hoezo werk je trouwens niet met LINQ classes :) Als je C# en framework 3.5 gebruikt?

Feeling lonely and content at the same time, I believe, is a rare kind of happiness


Verwijderd

Zoals Aphelion al zei, misschien is het handig dat je neit gewoon linq gebruikt en databinding.. werkt gemakkelijker. Maar wellicht hebben je gebruikers niet standaard 3.5 geinstalleerd staan.

Verder zou je ook gebruik kunnen maken van de validation objecten van .net? Deze kan je aan bijv. een textbox vast zetten en indien er dan nog ergens fouten in je scherm zijn mag je niet updaten. Maar nu heb je dan wel het bijkomende voordeel dat je de gebruiker visueel op de hoogte stelt van waar hij/zij de fout heeft gemaakt

suc6