Springen naar inhoud


- - - - -
C# 2010

Datagridview Rijen



  • Log in a.u.b. om te beantwoorden
Er zijn 10 reacties in dit onderwerp

#1 Joh-n

Joh-n

    Starting Developer

  • Leden
  • 7 berichten
    Laatst bezocht 06 mrt 2015 13:42

Geplaatst op 24 februari 2015 - 23:09

hallo,

ik heb 3 column en onder column kan je rijen aanmaken maar 1 daarvan wil ik waarde -1 naar 1 wijziging, dus mij vraag is hoe kan ik data rij van column selecteren?

Groetjes,
Joh-n

#2 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1153 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 26 februari 2015 - 11:49

Bericht bekijkenJoh-n, op 24 februari 2015 - 23:09, zei:

dus mij vraag is hoe kan ik data rij van column selecteren?
Wat is "data rij van column" ?
Waar komt die data vandaan ?
Waarom wijzig je het niet in de bron van de data die je gebruikt om DataGridView op te vullen?
Of is dat net de bedoeling?

Kan je iets duidelijker zijn in je vraagstelling (of de code tonen)?

#3 Joh-n

Joh-n

    Starting Developer

  • Leden
  • 7 berichten
    Laatst bezocht 06 mrt 2015 13:42

Geplaatst op 26 februari 2015 - 13:34

Bericht bekijkenDirk Andries, op 26 februari 2015 - 11:49, zei:

Wat is "data rij van column" ?
Waar komt die data vandaan ?
Waarom wijzig je het niet in de bron van de data die je gebruikt om DataGridView op te vullen?
Of is dat net de bedoeling?

Kan je iets duidelijker zijn in je vraagstelling (of de code tonen)?

Ik heb een .sdf aangemaakt met 2 tabellen. 1 daarvan is klanten gegevens in textbox (dus met slepen naar form) en die andere tabel is bestellingen in datagridview (op het zelfde manier gesleept). Klanten tabel is aan bestellingen gekoppeld. Het werkt perfect alleen bij het aanmaken van een nieuwe lijst krijg je een streep voor de cijfers dat slaat datagridview helaas op, als vorige of volgende knop gedrukt wordt dan is datagridview leeg omdat producten aan id met strepen is gekoppeld.

idTextBox.Text = idTextBox.Text.Replace("-", "");

Hier heb ik een (nieuw) voorbeeld gemaakt, velden van rode blok wil ik cijfers zonder strepen er voor hebben.

Bijlage  image.jpg   76,14K   8 downloads

#4 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1153 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 02 maart 2015 - 10:42

Bericht bekijkenJoh-n, op 26 februari 2015 - 13:34, zei:

...
idTextBox.Text = idTextBox.Text.Replace("-", "");
...
Hier heb ik een (nieuw) voorbeeld gemaakt, velden van rode blok wil ik cijfers zonder strepen er voor hebben.
Je wil gewoon dat

1. De juiste foreign key wordt weggeschreven in je tabel artikel.
En dat is nu eenmaal -1, -2, -3, ... indien je autonummering gebruikt voor de key (in andere tabel) die PK is.
Je zal waarschijnlijk (voor zover dat nog niet gebeurd is) de cascade opties voor die foreign key relatie moeten instellen.

2. De dataset wordt geüpdatet na wegschrijven.
Voor SqlServer gebeurt er automagisch een select op het gewijzigde record bij autonummering met SCOPE_IDENTITY() ,
Voor .sdf gebeurt dat niet automatisch, en zal je dat zelf moeten verzorgen.

Je vindt wat meer uitleg (en de procedure) voor MS-Access en vb.net bij Beth Massi.
Maar het is hetzelfde voor SQL Server Compact en C#.

#5 Joh-n

Joh-n

    Starting Developer

  • Leden
  • 7 berichten
    Laatst bezocht 06 mrt 2015 13:42

Geplaatst op 02 maart 2015 - 12:04

Bericht bekijkenDirk Andries, op 02 maart 2015 - 10:42, zei:


Je wil gewoon dat

1. De juiste foreign key wordt weggeschreven in je tabel artikel.
En dat is nu eenmaal -1, -2, -3, ... indien je autonummering gebruikt voor de key (in andere tabel) die PK is.
Je zal waarschijnlijk (voor zover dat nog niet gebeurd is) de cascade opties voor die foreign key relatie moeten instellen.

2. De dataset wordt geüpdatet na wegschrijven.
Voor SqlServer gebeurt er automagisch een select op het gewijzigde record bij autonummering met SCOPE_IDENTITY() ,
Voor .sdf gebeurt dat niet automatisch, en zal je dat zelf moeten verzorgen.

Je vindt wat meer uitleg (en de procedure) voor MS-Access en vb.net bij Beth Massi.
Maar het is hetzelfde voor SQL Server Compact en C#.

Dank je wel je hebt heel duidelijk uitgelegd en link met de afbeeldingen is ook handig, dan kan ik beter van .sdf overstappen naar SQL Server Compact, de instellingen zal ik ook wijzigen.

#6 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1153 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 02 maart 2015 - 12:21

Bericht bekijkenJoh-n, op 02 maart 2015 - 12:04, zei:

dan kan ik beter van .sdf overstappen naar SQL Server Compact, de instellingen zal ik ook wijzigen.
Euh ...
.sdf is SQL Server Compact.

#7 Joh-n

Joh-n

    Starting Developer

  • Leden
  • 7 berichten
    Laatst bezocht 06 mrt 2015 13:42

Geplaatst op 02 maart 2015 - 13:58

Bericht bekijkenDirk Andries, op 02 maart 2015 - 12:21, zei:

Euh ...
.sdf is SQL Server Compact.

"2. De dataset wordt geüpdatet na wegschrijven.
Voor SqlServer gebeurt er automagisch een select op het gewijzigde record bij autonummering met SCOPE_IDENTITY() ,
Voor .sdf gebeurt dat niet automatisch, en zal je dat zelf moeten verzorgen."

Dan bedoel je SqlServer. Sorry, dat ik fout had gelezen.

#8 Joh-n

Joh-n

    Starting Developer

  • Leden
  • 7 berichten
    Laatst bezocht 06 mrt 2015 13:42

Geplaatst op 04 maart 2015 - 16:44

Ik heb alle stappen doorgenomen en heb met Access geprobeerd omdat het een losse bestand is, maar dan krijg ik deze foutmelding te zien dat -1 niet overheen komt met textbox(bovenaan).

Bijlage  foutmelding.jpg   140,48K   1 downloads

#9 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1153 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 05 maart 2015 - 11:48

Bericht bekijkenJoh-n, op 04 maart 2015 - 16:44, zei:

maar dan krijg ik deze foutmelding te zien dat -1 niet overheen komt met textbox(bovenaan).
Neen, dat klopt niet.
Je krijgt de foutmelding te zien omdat de rij (Klant) nog niet is weggeschreven naar de DataTable (dat is dus DataSet/DataTable, niet databank).
Een DataGridView zal bij het toevoegen van een tweede rij een BindingSource.EndEdit uitvoeren voor de eerste rij: dus je nieuwe rij in bestelling wordt toegevoegd (in de DataTable).
Daar zit echter een FK constraint op, vanwege de Parent/Child relatie tussen Klant en Bestelling en de DataSet controleert dus of er overeenkomstige rij is in de Klant datatable.
En die rij is nog niet toegevoegd (want je bent nog aan het editeren).

Oplossing: eer je rijen begint toe te voegen aan je bestelling, moet je gewoon tegen de datatable vertellen dat je een rij hebt toegevoegd voor klant.
Dit doe je door zelf de EndEdit uit te voeren (bijvoorbeeld in het Enter event van de DataGridView:

C Code:
private void FormBestelling_Load(object sender, EventArgs e)
	 {
		 klantTableAdapter.Fill(parentChildDataSet.Klant);
		 bestellingTableAdapter.Fill(parentChildDataSet.Bestelling);
		 // eventhandler laden
		 bestellingDataGridView.Enter += bestellingDataGridView_Enter;
	 }

	
	 private void bestellingDataGridView_Enter(object sender, EventArgs e)
	 {
		 // valideer klant invoer
		 Validate();
		 // schrijf klant weg naar (enkel) DataTable (niet naar databank)!.
		 klantBindingSource.EndEdit();
	 }



Bericht bekijkenDirk Andries, op 05 maart 2015 - 11:48, zei:

Oplossing: eer je rijen begint toe te voegen aan je bestelling, moet je gewoon tegen de datatable vertellen dat je een rij hebt toegevoegd voor klant.
Oh: bovenstaande werkt ook op SqlServer CE (.sdf).
Alleen krijg je dan de fout bij het wegschrijven naar de databank (TableAdapter.Update) omdat de waarde voor de key -1 blijft.
Je kan dat oplossen door de pk de juiste waarde te geven.
Ik los dat generiek op met een method uit een helper klasse die ik ooit geschreven heb (in VB).
Hieronder de aanpassingen voor C#

C Code:
public class SqlCeHelper
{

public static void FixAdapterIdentityInsert(object sender, SqlCeRowUpdatedEventArgs e)
	 {
		 if (e.Status == UpdateStatus.Continue &&
			 e.StatementType == StatementType.Insert)
		 {
			 var pk = e.Row.Table.PrimaryKey;
			 using (var cmd = new SqlCeCommand("SELECT @@IDENTITY", e.Command.Connection, e.Command.Transaction))
			 {
				 object id = (decimal)cmd.ExecuteScalar();
				 try
				 {
					 pk[0].ReadOnly = false;
					 e.Row[pk[0]] = Convert.ToInt32(id);
					 e.Row.AcceptChanges();
				 }
				 finally
				 {
					 pk[0].ReadOnly = true;
				 }
			 }
		 }
	 }
}




en je kan dat gebruiken, overigens voor alle CE tables met pk = identitiy, voor de beide adapters
C Code:
	 private void FormBestelling_Load(object sender, EventArgs e)
	 {
		 klantTableAdapter.Fill(parentChildDataSet.Klant);
		 bestellingTableAdapter.Fill(parentChildDataSet.Bestelling);
		 // eventhandler laden
		 bestellingDataGridView.Enter += bestellingDataGridView_Enter;
		
		 // fix voor CE:
		 klantTableAdapter.Adapter.RowUpdated += SqlCeHelper.FixAdapterIdentityInsert;
		 bestellingTableAdapter.Adapter.RowUpdated += SqlCeHelper.FixAdapterIdentityInsert;
	 }




#10 Joh-n

Joh-n

    Starting Developer

  • Leden
  • 7 berichten
    Laatst bezocht 06 mrt 2015 13:42

Geplaatst op 05 maart 2015 - 18:02

Waar kan ik SqlCeRowUpdatedEventArgs en SqlCeCommand namen vandaan halen?

Mij broncode ziet er nu zo uit:
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}
		private void testBindingNavigatorSaveItem_Click(object sender, EventArgs e)
		{
			this.Validate();
			this.testBindingSource.EndEdit();
			this.tableAdapterManager.UpdateAll(this.testdatabaseeeeDataSet);
		}
		public class SqlCeHelper
		{
			public static void FixAdapterIdentityInsert(object sender, SqlCeRowUpdatedEventArgs e)
			{
				if (e.Status == UpdateStatus.Continue &&
					e.StatementType == StatementType.Insert)
				{
					var pk = e.Row.Table.PrimaryKey;
					using (var cmd = new SqlCeCommand("SELECT @@IDENTITY", e.Command.Connection, e.Command.Transaction))
					{
						object id = (decimal)cmd.ExecuteScalar();
						try
						{
							pk[0].ReadOnly = false;
							e.Row[pk[0]] = Convert.ToInt32(id);
							e.Row.AcceptChanges();
						}
						finally
						{
							pk[0].ReadOnly = true;
						}
					}
				}
			}
		}
		private void Form1_Load(object sender, EventArgs e)
		{
			// TODO: This line of code loads data into the 'testdatabaseeeeDataSet.test2' table. You can move, or remove it, as needed.
			this.test2TableAdapter.Fill(this.testdatabaseeeeDataSet.test2);
			// TODO: This line of code loads data into the 'testdatabaseeeeDataSet.test' table. You can move, or remove it, as needed.
			this.testTableAdapter.Fill(this.testdatabaseeeeDataSet.test);
			testTableAdapter.Fill(testdatabaseeeeDataSet.test);
			test2TableAdapter.Fill(testdatabaseeeeDataSet.test2);
			// eventhandler laden 
			test2DataGridView.Enter += test2DataGridView_Enter;
			// fix voor CE: 
			testTableAdapter.Adapter.RowUpdated += SqlCeHelper.FixAdapterIdentityInsert;
			test2TableAdapter.Adapter.RowUpdated += SqlCeHelper.FixAdapterIdentityInsert;
		}
		private void test2DataGridView_Enter(object sender, EventArgs e)
		{
			// valideer klant invoer 
			Validate();
			// schrijf klant weg naar (enkel) DataTable (niet naar databank)!. 
			testBindingSource.EndEdit();
		} 
	}
}



#11 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1153 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 05 maart 2015 - 19:55

Bericht bekijkenJoh-n, op 05 maart 2015 - 18:02, zei:

Mij broncode ziet er nu zo uit:
Code:
		 // ...
		 this.test2TableAdapter.Fill(this.testdatabaseeeeDataSet.test2);
		 // ...
		 this.testTableAdapter.Fill(this.testdatabaseeeeDataSet.test);
		 //...
		 testTableAdapter.Fill(testdatabaseeeeDataSet.test);
		 test2TableAdapter.Fill(testdatabaseeeeDataSet.test2);

Je vult nu twee keer test en test2, dat kan niet de bedoeling zijn?
Noteer dat de volgorde van belang kan zijn.
En dat fouten in de Load event handler worden "opgegeten".

Bericht bekijkenJoh-n, op 05 maart 2015 - 18:02, zei:

Waar kan ik SqlCeRowUpdatedEventArgs en SqlCeCommand namen vandaan halen?
Dat is System.Data.SqlServerCe

Ik zou de helper klasse in een afzonderlijk bestand stoppen.
Of, als alternatief, de method FixAdapterIdentityInsert verplaatsen naar de DataSet zelf:
C Code:
using System.Data;
using System.Data.SqlServerCe;

namespace ParentChildCe {

public partial class ParentChildDataSet {
	 public static void FixAdapterIdentityInsert(object sender, SqlCeRowUpdatedEventArgs e)
	 {
		 if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert)
		 {
			 var pk = e.Row.Table.PrimaryKey;
			 using (var cmd = new SqlCeCommand("SELECT @@IDENTITY", e.Command.Connection, e.Command.Transaction))
			 {
				 try
				 {
					 pk[0].ReadOnly = false;
					 e.Row[pk[0]] = cmd.ExecuteScalar();
					 e.Row.AcceptChanges();
				 }
				 finally
				 {
					 pk[0].ReadOnly = true;
				 }
			 }
		 }
	 }
}
}


en oproepen met:
C Code:
		 // fix voor CE:
		 klantTableAdapter.Adapter.RowUpdated += ParentChildDataSet.FixAdapterIdentityInsert;
		 bestellingTableAdapter.Adapter.RowUpdated += ParentChildDataSet.FixAdapterIdentityInsert;

Je kan de procedure (voor SqlServer, vb.net) ook min of meer terugvinden in deze filmpjes.
Het is wel wat ouder en de info die voor jou interessant is, staat verspreid over een twee- tot drietal filmpjes (o.a. 11.Insert).

En de code met SqlServer Compact Edition (.sdf)
Hou er rekening mee dat niet alle fouten afgevangen worden (deze code is niet "af", was een startpunt voor een oefening).

Bijlage  ContactManagerCe.zip   53,07K   2 downloads





Ook met taq C# 2010 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[C# 2010] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)