ComboBox filtrés en cascade

Signaler
Messages postés
2
Date d'inscription
mardi 29 janvier 2008
Statut
Membre
Dernière intervention
30 janvier 2008
-
Messages postés
2
Date d'inscription
mardi 29 janvier 2008
Statut
Membre
Dernière intervention
30 janvier 2008
-
Bonjour à tous,
Je travaille actuellement sur une application Windows et j'ai cinq combobox (Client,Produit, Pièce...) à remplir et à liés en cascade c'est à dire lorsque je sélectionne un Client dan mon premier combo je ne dois voir apparaitre dans le combo suivant que les produits concernant ce Client et ainsi de suite. J'espère que ce n'est pas trop flou ???

Pour cela :
   - Je creer une procedure que j'appellerai sur l'evenement SelectedIndexChanged de mon Combo
   - Dans cette procédure je creer ma connexion et je l'ouvre
   - Ensuite voila ce que je fais :

SqlDataAdapter SqlDA;

SqlCommand SqlCmd;

DataTable SqlTable;








 // Récupération de l'ID du Client sélectionné dans la liste précédente

  idCli = cboxClient.SelectedValue.ToString();





SqlTable =




new



DataTable
(

"TEST"
);
SqlCmd =

new



SqlCommand
(

"Select distinct(T_DEV_PRODUIT.ID),T_DEV_PRODUIT.LIBELLE FROM T_DEV_PRODUIT WHERE T_DEV_PRODUIT.ID_CLIENT = "
+ idCli ,

maConnexion);SqlDA =


new



SqlDataAdapter
(SqlCmd);SqlDA.Fill(SqlTable);

cboxProduit.DataSource = SqlTable;

cboxProduit.ValueMember =


"ID"
;

//Sa c'est le champs clé

cboxProduit.DisplayMember=




"LIBELLE"
;

//Sa c'est la valeur affichée

Jusqu'ici tout se passe bien, je fais exactement la meme manipulation pour remplir le combo Pièce à partir de l'ID du produit récupéré mais lorsque je fais : idProd = cboxProduit.SelectedValue.ToString();

j'ai le droit à la jolie erreur : "Une référence d'objet n'est pas définie à une instance d'un objet" mais c'est un string et il n'y a pas lieu de l'instancier meme si je l'initialise à rien cela ne fonctionne pas. J'aimerais savoir comment récupérer l'ID dans ma base (SQL Server 2005 Express) de la valeur sélectionnée dans le combo produit SVP AU SECOURS !!!!

Si quelqu'un à une solution ou un autre moyen de filtrer mes combos en cascadeje suis preneur.

Merci à tous

2 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Vraisemblablement que SelectedValue est null, donc si tu appelles toString dessus, ça coince...
Autre remarque, pour les requêtes paramétrées, jettes un oeil ici:

http://www.csharpfr.com/tutoriaux/COMMENT-FAIRE-REQUETE-PARAMETREE-DANS-BASE-DONNEE_710.aspx

http://www.csharpfr.com/tutoriaux/UTILISATION-REQUETES-PARAMETREES-AVEC-ADO-NET_709.aspx

<hr />
-My Blog-
Messages postés
2
Date d'inscription
mardi 29 janvier 2008
Statut
Membre
Dernière intervention
30 janvier 2008

Merci pour ton aide, j'ai essayé d'utiliser les requêtes paramétrées car en effet le code est plus sûr et je trouve cela plus propre. Maintenant le SelectedValue renvoie System.Data.DataRowView donc sa valeur est null.
Voici mon code :

public

void FiltreProduit(){

string maChaine =
"//Ici se trouve ma chaine de connexion";

SqlConnection maConnexion =
new
SqlConnection(maChaine);

//Préparation des paramètres

SqlParameter paramID =
new
SqlParameter(
"@id",
SqlDbType.BigInt);paramID.Value = cboxClient.SelectedValue;

MessageBox.Show(
"Valeur du paramètre :" + paramID.Value); // La valeur renvoyée ici est la bonne car mon premier combo(cboxClient) est rempli directement par le gestionnaire des Tâches de VS 2005

//Préparation de la commande

String sql =
string.Format(
"Select distinct(T_DEV_PRODUIT.ID),T_DEV_PRODUIT.LIBELLE FROM T_DEV_PRODUIT WHERE T_DEV_PRODUIT.ID_CLIENT = @id",paramID.ParameterName);

SqlCommand cmd =
new
SqlCommand(sql.ToString(), maConnexion);

//Ajout des paramètre à la commandecmd.Parameters.Add(paramID);

//Ouverture de la connection et exécution de la commandemaConnexion.Open();

SqlDataAdapter SqlDA;

DataTable SqlTable;

SqlTable =

new
DataTable(
"TEST");SqlDA =

new
SqlDataAdapter(cmd);SqlDA.Fill(SqlTable);

cboxProduit.DataSource = SqlTable;

cboxProduit.ValueMember =

"ID";
//Cela c'est ton champs clécboxProduit.DisplayMember=

"LIBELLE";
//Cela c'est le text"

}

Cela fonctionne normalement mais je voudrais savoir si le fait de remplir mon combo(cboxProduit) de la façon décrite ci-dessus ne m'empeche pas de pouvoir récupérer la valeur sélectionnée??

Sinon je fais cela ensuite :

public

void FiltrePiece()

{

string maChaine =
"//Ici se trouve ma chaine de connexion";

SqlConnection maConnexion =
new
SqlConnection(maChaine);

//Préparation des paramètres

SqlParameter paramID =
new
SqlParameter(
"@id",
SqlDbType.BigInt);paramID.Value = cboxProduit.SelectedValue; // C'est ici que je n'arrive pas à sélectionner la valeur

MessageBox.Show(
"Valeur du paramètre :" + paramID.Value);

//Préparation de la commande

String sql =
string.Format(
"Select DISTINCT(T_DEV_PIECE.ID),T_DEV_PIECE.LIBELLE FROM T_DEV_PIECE,T_DEV_PRODUIT WHERE T_DEV_PIECE.ID_PRODUIT = @id",paramID.ParameterName);

SqlCommand cmd =
new
SqlCommand(sql.ToString(), maConnexion);

//Ajout des paramètre à la commandecmd.Parameters.Add(paramID);

//Ouverture de la connection et exécution de la commandemaConnexion.Open();

SqlDataAdapter SqlDA;

DataTable SqlTable;SqlTable =

new
DataTable(
"TEST");SqlDA =

new
SqlDataAdapter(cmd);SqlDA.Fill(SqlTable);

cboxPiece.DataSource = SqlTable;

cboxPiece.ValueMember =

"ID";
//Cela c'est le champs clécboxPiece.DisplayMember =

"LIBELLE";
//Cela c'est le text"}

J'avais essayé avant d'utiliser un dataAdapter et un dataTable d'utiliser un dataReader mais sans résultat non plus. Donc concretement comment récupérer cette valeur sélectionnée dans le combo (cboxProduit)??

J'espère avoir été clair et je suis désolé si ce n'est pas le cas.

Merci de m'apporter votre aide svp si vous en avez le pouvoir