Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment se positionner sur un enregistrement

7 réponses
Avatar
Philippe
Bonjour

j ai une table avec la colonne ID comme clef primaire

quand j ouvre ma fenetre detail, comment faire pour se positionner sur l
enregistrement que je veux, connaisant son ID ??

merci

7 réponses

Avatar
Paul Bacelar
"Philippe" wrote in message
news:
Bonjour

j ai une table avec la colonne ID comme clef primaire

quand j ouvre ma fenetre detail, comment faire pour se positionner sur l
enregistrement que je veux, connaisant son ID ??

merci



Regarder la Class DataView qui permet de créer une vue sur un DataSet.

Cette Vue ne contiendra que les données pertinentes au ID sélectionné.


--
Paul Bacelar
Avatar
Philippe
Je fais ca, et ca marche

objdsAdherents.Adherents.DefaultView.Sort="ID";
this.BindingContext[objdsAdherents,"Adherents"].Position =
objdsAdherents.Adherents.DefaultView.Find(FMain.iPositionListe);

est ce la bonne méthode ?

merci

Paul Bacelar a écrit :
"Philippe" wrote in message
news:

Bonjour

j ai une table avec la colonne ID comme clef primaire

quand j ouvre ma fenetre detail, comment faire pour se positionner sur l
enregistrement que je veux, connaisant son ID ??

merci




Regarder la Class DataView qui permet de créer une vue sur un DataSet.

Cette Vue ne contiendra que les données pertinentes au ID sélectionné.




Avatar
digging
> j ai une table avec la colonne ID comme clef primaire

quand j ouvre ma fenetre detail, comment faire pour se positionner sur l
enregistrement que je veux, connaisant son ID ??





C'est marrant comme cette question revient souvent ; et je l'ai aussi
posée plusieurs fois. Et j'ai galéré pour trouver une méthode simple,
car le vrai problème avec .NET c'est le foisonnement de méthodes
disponibles !

je suppose que tu a deux Forms : 1. FormTable 2.FormFiche
et tu veux reproduire le classique "ouvre(FormFiche,'ID')" en se
positionnant sur l'enregistrement courant de la Formtable.
Fais ceci :
1. Dans FormTable tu mets ce code par exemple dans un événement-clic
BindingManagerBase bm;
bm = this.BindingContext[dataSet1, "TaDataTable"];
FormFiche fm = new FormFiche(bm.Position);
fm.Show();
2. Dans FormFiche
2.1 dans tes déclarations : private int ligneEnCours=0;
2.2 tu surcharges ensuite le constructeur de FormFiche
public FormFiche(int pos)
{
InitializeComponent();
ligneEnCours = pos;
}
2.3 dans l'événement load de ta form ou dans un bouton
this.BindingContext[dataSet1, "TaDataTable"].Position =ligneEnCours;

Bien sûr j'ai supposé naivement que les deux forms pointent le même
DataSet et la même Datatable, sinon tu adaptes. C'est la forme
canonique et tu n'as pas besoin de connaitre l'ID !
L'autre façon est de passer par un DataView.
En espérant t'avoir aidé.
digging :oÞ

--
- concepteur ensemblier -
Avatar
Philippe
Merci de ton aide

mais je venais de trouver une solution

// Ici on se positionne sur la ligne choisie dans la liste
objdsAdherents.Adherents.DefaultView.Sort="ID";
this.BindingContext[objdsAdherents,"Adherents"].Position =
objdsAdherents.Adherents.DefaultView.Find(FMain.iPositionListe);


en fait mes 2 forms n ont pas le meme dataset, car je t avoue que je ne
sais pas comment faire pour n avoir qu un seul dataset partagé ce qui
serait le plus simples

Peux t on comme avec delphi avoir une fiche que pour les datasets ??

donc j ai une form Main, qui appelle et dock mes 2 forms dans un panel,
dans ma main j ai declaré une variable globale que j affecte quand le
change de ligne depuis la liste


puisje t envoyer mon petit (il est vraiement petit ) prog pour que tu me
dises si mes methodes sont bien, car je debutes en c# et c est galere de
chez galere

merci



digging a écrit :
j ai une table avec la colonne ID comme clef primaire

quand j ouvre ma fenetre detail, comment faire pour se positionner sur
l enregistrement que je veux, connaisant son ID ??





C'est marrant comme cette question revient souvent ; et je l'ai aussi
posée plusieurs fois. Et j'ai galéré pour trouver une méthode simple,
car le vrai problème avec .NET c'est le foisonnement de méthodes
disponibles !

je suppose que tu a deux Forms : 1. FormTable 2.FormFiche
et tu veux reproduire le classique "ouvre(FormFiche,'ID')" en se
positionnant sur l'enregistrement courant de la Formtable.
Fais ceci :
1. Dans FormTable tu mets ce code par exemple dans un événement-clic
BindingManagerBase bm;
bm = this.BindingContext[dataSet1, "TaDataTable"];
FormFiche fm = new FormFiche(bm.Position);
fm.Show();
2. Dans FormFiche
2.1 dans tes déclarations : private int ligneEnCours=0;
2.2 tu surcharges ensuite le constructeur de FormFiche
public FormFiche(int pos)
{
InitializeComponent();
ligneEnCours = pos;
}
2.3 dans l'événement load de ta form ou dans un bouton
this.BindingContext[dataSet1, "TaDataTable"].Position
=ligneEnCours;

Bien sûr j'ai supposé naivement que les deux forms pointent le même
DataSet et la même Datatable, sinon tu adaptes. C'est la forme canonique
et tu n'as pas besoin de connaitre l'ID !
L'autre façon est de passer par un DataView.
En espérant t'avoir aidé.
digging :oÞ



Avatar
digging
Le 01/02/2005, Philippe a supposé :
Merci de ton aide

mais je venais de trouver une solution

// Ici on se positionne sur la ligne choisie dans la liste
objdsAdherents.Adherents.DefaultView.Sort="ID";
this.BindingContext[objdsAdherents,"Adherents"].Position =
objdsAdherents.Adherents.DefaultView.Find(FMain.iPositionListe);



L'essentiel est d'y arriver dans un premier temps, puis tu affineras
ton code ensuite.
Crois mois, il y a tellement de possibilités que pour une fois, c'est
la surabondance qui me gêne plutôt qu'autre chose. On a vraiment le
choix !

en fait mes 2 forms n ont pas le meme dataset, car je t avoue que je ne sais
pas comment faire pour n avoir qu un seul dataset partagé ce qui serait le
plus simples



Bien, il te faut éclaircir cette notion de DataSet pour pouvoir
avancer. En fait ce que tu partage entre les deux forms, c'est ton
schema, c'est à dire que tes forms instancient le même DataSet. Après
une longue discution avec Ambassadeur Kosh - que je remerçie en passant
- j'ai compris ceci et que je pratique assidument :
1. dans ton projet, ajoute un composant
2. drop un SqlDataAdapter par table sur ton composant et fais ce qu'il
faut
3. génère le groupe de données, mais ne l'inclue pas dans ton
composant. ce faisant, le schéma .XSD sera généré, ton DataSet quoi !
4. ton composant tu le garnies de méthodes Fill, Update, etc
5. dans chaque form, drop un dataSet : il e demande si tu veux créer un
nvx ou te lier au DataSet typé existant, évidement tu te lies au
DataSet typé
6. dans ta form, tu instancies ton composant, puis tu appelles
classiquement la méthode Fill à l'ouverture.

Un ENORME avantage : tu peux créer autant de forms que tu veux, faire
tes tests, sans jamais repasser par le ballet SQLConnection,
SqlDataAdapter, etc.
Et là, tes différentes forms pointent bien le même DataSet - en fait
instancient le même schéma.

C'est le principe le plus simple pour débuter. par la suite tu
apprendras l'utilité du DataSet non typé, mais ça c'est une autre
affaire.

Peux t on comme avec delphi avoir une fiche que pour les datasets ??



Je viens de Windev !

donc j ai une form Main, qui appelle et dock mes 2 forms dans un panel, dans
ma main j ai declaré une variable globale que j affecte quand le change de
ligne depuis la liste



Oublie la notion de variable globale, cela ne pourra que te déservir
avec le temps !

puisje t envoyer mon petit (il est vraiement petit ) prog pour que tu me
dises si mes methodes sont bien, car je debutes en c# et c est galere de chez
galere



T'inquiètes pas. Sur ce forum, il y a un très bon support. Mais en
général j'ai remarqué qu'ils interviennent quand ça se complique. Et
les gars trouvent toujours. Pour les débutants comme nous, je ne saurai
te recommander de charger MSDN Library, il y a plein d'exemple dedans
sur tout ce que je te raconte.
Je veux bien jeter un coup d'oeil - et le récupérer - sur ton prog.
mais si tu as un gros blème, n'hésites pas, poste lebout de code à
problème.
digging

--
- concepteur ensemblier -
Avatar
Paul Bacelar
Voici un exemple complet utilisant un dataSet typé
Il y 2 fichiers.
Le premier est un xsd qui definie un DataSet typé. Vous n'avez qu'a demander
la création d'un nouveau DataSet de nom "Dataset1" dans votre projet et
faire un copier-coller de ce qui suit dans la vue XML du DataSet (en bas à
gauche du Designer de DataSet).

< FICHIER Dataset1.xsd>
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="Dataset1" targetNamespace="http://tempuri.org/Dataset1.xsd"
elementFormDefault="qualified"
attributeFormDefault="qualified" xmlns="http://tempuri.org/Dataset1.xsd"
xmlns:mstns="http://tempuri.org/Dataset1.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Dataset1" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Adherents">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:integer" minOccurs="0" />
<xs:element name="Nom" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ObjetsLies">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:ID" minOccurs="0" />
<xs:element name="Propriétaire" type="xs:integer" minOccurs="0" />
<xs:element name="Desc" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:key name="Dataset1Key1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:Adherents" />
<xs:field xpath="mstns:ID" />
</xs:key>
<xs:key name="Dataset1Key2" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:ObjetsLies" />
<xs:field xpath="mstns:ID" />
</xs:key>
<xs:keyref name="AdherentsObjetsLies" refer="Dataset1Key1">
<xs:selector xpath=".//mstns:ObjetsLies" />
<xs:field xpath="mstns:Propriétaire" />
</xs:keyref>
</xs:element>
</xs:schema>
< /FICHIER Dataset1.xsd>

Le second fichier creer un formulaire avec 2 grilles en mode Master/Detail.
La première grille permet de remplir le DataSet.
Ne mettez que des nombres dans les colonnes ID.
Ne doubleclicker pas dans la grille en haut en étant en mode détail.
En mode Master sur la grille supérieur, si vous doubleclickez sur une ligne
non vide, le formulaire du bas affichera les détails correspondants.
<CODE IMPORTANT>
private void dataGrid1_Click(object sender, System.EventArgs e)
{
System.Data.DataView MyView = new
System.Data.DataView(dataset11.ObjetsLies);
MyView.RowFilter = "Propriétaire = " +
dataGrid1[dataGrid1.CurrentRowIndex,0].ToString();
dataGrid2.SetDataBinding(MyView, "");
}
</CODE IMPORTANT>

<FICHIER Form1.cs>
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace WindowsApplication1
{
/// <summary>
/// Description résumée de Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private WindowsApplication1.Dataset1 dataset11;
private System.Windows.Forms.DataGrid dataGrid1;
private System.Windows.Forms.DataGrid dataGrid2;
/// <summary>
/// Variable nécessaire au concepteur.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Requis pour la prise en charge du Concepteur Windows Forms
//
InitializeComponent();
//
// TODO : ajoutez le code du constructeur après l'appel à
InitializeComponent
//
}
/// <summary>
/// Nettoyage des ressources utilisées.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Code généré par le Concepteur Windows Form
/// <summary>
/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
/// le contenu de cette méthode avec l'éditeur de code.
/// </summary>
private void InitializeComponent()
{
this.dataset11 = new WindowsApplication1.Dataset1();
this.dataGrid1 = new System.Windows.Forms.DataGrid();
this.dataGrid2 = new System.Windows.Forms.DataGrid();
((System.ComponentModel.ISupportInitialize)(this.dataset11)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataGrid2)).BeginInit();
this.SuspendLayout();
//
// dataset11
//
this.dataset11.DataSetName = "Dataset1";
this.dataset11.Locale = new System.Globalization.CultureInfo("en-US");
//
// dataGrid1
//
this.dataGrid1.DataMember = "Adherents";
this.dataGrid1.DataSource = this.dataset11;
this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid1.Location = new System.Drawing.Point(64, 16);
this.dataGrid1.Name = "dataGrid1";
this.dataGrid1.Size = new System.Drawing.Size(424, 136);
this.dataGrid1.TabIndex = 0;
this.dataGrid1.DoubleClick += new System.EventHandler(this.dataGrid1_Click);
//
// dataGrid2
//
this.dataGrid2.DataMember = "ObjetsLies";
this.dataGrid2.DataSource = this.dataset11;
this.dataGrid2.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid2.Location = new System.Drawing.Point(64, 232);
this.dataGrid2.Name = "dataGrid2";
this.dataGrid2.Size = new System.Drawing.Size(424, 136);
this.dataGrid2.TabIndex = 1;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(608, 396);
this.Controls.Add(this.dataGrid2);
this.Controls.Add(this.dataGrid1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.dataset11)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataGrid2)).EndInit();
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void dataGrid1_Click(object sender, System.EventArgs e)
{
System.Data.DataView MyView = new
System.Data.DataView(dataset11.ObjetsLies);
MyView.RowFilter = "Propriétaire = " +
dataGrid1[dataGrid1.CurrentRowIndex,0].ToString();
dataGrid2.SetDataBinding(MyView, "");
}
}
}
</FICHIER Form1.cs>
--
Paul Bacelar

"Philippe" wrote in message
news:O#
Je fais ca, et ca marche

objdsAdherents.Adherents.DefaultView.Sort="ID";
this.BindingContext[objdsAdherents,"Adherents"].Position > objdsAdherents.Adherents.DefaultView.Find(FMain.iPositionListe);

est ce la bonne méthode ?

merci

Paul Bacelar a écrit :
> "Philippe" wrote in


message
> news:
>
>>Bonjour
>>
>>j ai une table avec la colonne ID comme clef primaire
>>
>>quand j ouvre ma fenetre detail, comment faire pour se positionner sur l
>>enregistrement que je veux, connaisant son ID ??
>>
>>merci
>
>
> Regarder la Class DataView qui permet de créer une vue sur un DataSet.
>
> Cette Vue ne contiendra que les données pertinentes au ID sélectionné.
>
>


Avatar
Philippe
Merci, je vais essayer ca des demain


Paul Bacelar a écrit :
Voici un exemple complet utilisant un dataSet typé
Il y 2 fichiers.
Le premier est un xsd qui definie un DataSet typé. Vous n'avez qu'a demander
la création d'un nouveau DataSet de nom "Dataset1" dans votre projet et
faire un copier-coller de ce qui suit dans la vue XML du DataSet (en bas à
gauche du Designer de DataSet).

< FICHIER Dataset1.xsd>
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="Dataset1" targetNamespace="http://tempuri.org/Dataset1.xsd"
elementFormDefault="qualified"
attributeFormDefault="qualified" xmlns="http://tempuri.org/Dataset1.xsd"
xmlns:mstns="http://tempuri.org/Dataset1.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Dataset1" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Adherents">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:integer" minOccurs="0" />
<xs:element name="Nom" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ObjetsLies">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:ID" minOccurs="0" />
<xs:element name="Propriétaire" type="xs:integer" minOccurs="0" />
<xs:element name="Desc" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:key name="Dataset1Key1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:Adherents" />
<xs:field xpath="mstns:ID" />
</xs:key>
<xs:key name="Dataset1Key2" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:ObjetsLies" />
<xs:field xpath="mstns:ID" />
</xs:key>
<xs:keyref name="AdherentsObjetsLies" refer="Dataset1Key1">
<xs:selector xpath=".//mstns:ObjetsLies" />
<xs:field xpath="mstns:Propriétaire" />
</xs:keyref>
</xs:element>
</xs:schema>
< /FICHIER Dataset1.xsd>

Le second fichier creer un formulaire avec 2 grilles en mode Master/Detail.
La première grille permet de remplir le DataSet.
Ne mettez que des nombres dans les colonnes ID.
Ne doubleclicker pas dans la grille en haut en étant en mode détail.
En mode Master sur la grille supérieur, si vous doubleclickez sur une ligne
non vide, le formulaire du bas affichera les détails correspondants.
<CODE IMPORTANT>
private void dataGrid1_Click(object sender, System.EventArgs e)
{
System.Data.DataView MyView = new
System.Data.DataView(dataset11.ObjetsLies);
MyView.RowFilter = "Propriétaire = " +
dataGrid1[dataGrid1.CurrentRowIndex,0].ToString();
dataGrid2.SetDataBinding(MyView, "");
}
</CODE IMPORTANT>

<FICHIER Form1.cs>
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace WindowsApplication1
{
/// <summary>
/// Description résumée de Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private WindowsApplication1.Dataset1 dataset11;
private System.Windows.Forms.DataGrid dataGrid1;
private System.Windows.Forms.DataGrid dataGrid2;
/// <summary>
/// Variable nécessaire au concepteur.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Requis pour la prise en charge du Concepteur Windows Forms
//
InitializeComponent();
//
// TODO : ajoutez le code du constructeur après l'appel à
InitializeComponent
//
}
/// <summary>
/// Nettoyage des ressources utilisées.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Code généré par le Concepteur Windows Form
/// <summary>
/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
/// le contenu de cette méthode avec l'éditeur de code.
/// </summary>
private void InitializeComponent()
{
this.dataset11 = new WindowsApplication1.Dataset1();
this.dataGrid1 = new System.Windows.Forms.DataGrid();
this.dataGrid2 = new System.Windows.Forms.DataGrid();
((System.ComponentModel.ISupportInitialize)(this.dataset11)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataGrid2)).BeginInit();
this.SuspendLayout();
//
// dataset11
//
this.dataset11.DataSetName = "Dataset1";
this.dataset11.Locale = new System.Globalization.CultureInfo("en-US");
//
// dataGrid1
//
this.dataGrid1.DataMember = "Adherents";
this.dataGrid1.DataSource = this.dataset11;
this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid1.Location = new System.Drawing.Point(64, 16);
this.dataGrid1.Name = "dataGrid1";
this.dataGrid1.Size = new System.Drawing.Size(424, 136);
this.dataGrid1.TabIndex = 0;
this.dataGrid1.DoubleClick += new System.EventHandler(this.dataGrid1_Click);
//
// dataGrid2
//
this.dataGrid2.DataMember = "ObjetsLies";
this.dataGrid2.DataSource = this.dataset11;
this.dataGrid2.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid2.Location = new System.Drawing.Point(64, 232);
this.dataGrid2.Name = "dataGrid2";
this.dataGrid2.Size = new System.Drawing.Size(424, 136);
this.dataGrid2.TabIndex = 1;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(608, 396);
this.Controls.Add(this.dataGrid2);
this.Controls.Add(this.dataGrid1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.dataset11)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataGrid2)).EndInit();
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void dataGrid1_Click(object sender, System.EventArgs e)
{
System.Data.DataView MyView = new
System.Data.DataView(dataset11.ObjetsLies);
MyView.RowFilter = "Propriétaire = " +
dataGrid1[dataGrid1.CurrentRowIndex,0].ToString();
dataGrid2.SetDataBinding(MyView, "");
}
}
}
</FICHIER Form1.cs>