Xavier Coelembier
Comment intégrer une liste déroulante dans un Datagrid ?
Ce dataGrid est généré à partir du modèle relationnel suivant :
Il serait intéressant que lorsque l’utilisateur se positionne dans le champ CodeGarage, qu'il obtienne une liste déroulante qui contienne toutes les RaisonSocialeGarage possibles.
Cela permettra à l'utilisateur d'être guidé en cas de modification du garage dans lequel l'intervention se déroule.
Ajouter un comboBox (nommer le cmbGarage) sur votre formulaire n’importe où,
donner la valeur False à la propriété Visible,
créer un dataAdapter pour lister la table Garage (codeGarare,RaisonSociale) puis générer le groupe de données (monDS),
déposer un Dataview (nommer le dvGarage) dans le formulaire et renseigner la propriété Table (du comboBox cmbGarage) en l'associant à monDS.Garage :
Afficher votre combo box lorsque l’utilisateur se positionne sur la 7 ème colonne (colonneGarage) :
pour cela, vous devez coder la procédure événementielle (méthode) dgInterventions_CurrentCellChanged qui est déclenchée lorsque l’utilisateur change de colonne sur le datagrid.
Elle doit contenir le code suivant :
// l'utlisateur est-il positionné sur la colonne CodeGarage (8ème colonne mais numéro 7 car la numérotation commence à zero)
if(dgInterventions.CurrentCell.ColumnNumber==7)
{
// Remplir le dataset monDs la DataTable s'appelle "GARAGE"
adapterGarage.Fill(monDs, "GARAGE");
// la largeur du comboBox = largeur de la colonne CodeGarage
cmbGarage.Width=dgInterventions.GetCellBounds(dgInterventions.CurrentCell).Width;
// on positionne le comboBox cmbGarage sur la cellule courante
cmbGarage.Left=dgInterventions.Left+dgInterventions.GetCellBounds(dgInterventions.CurrentCell).Left;
cmbGarage.Top=dgInterventions.GetCellBounds(dgInterventions.CurrentCell).Top+dgInterventions.Top;
// on récupère le numéro de ligne du datagrid correspondant à la cellule sélectionnée
int numLigne=dgInterventions.CurrentRowIndex;
// on récupère la valeur du CodeGarage contenue dans la colonne sélectionnée du datagrid
string numGarage=Convert.ToString(dgInterventions[numLigne,7]);
//on sélectionne la valeur du combo correspondant à la valeur contenue dans CodeGarage
cmbGarage.SelectedValue=numGarage;
//le combo box est rendu visible
cmbGarage.Visible=true;
// le curseur est positionné dans le combo box
cmbGarage.Focus();
}
else
{
// si on est pas sur la colonne CodeGarage, le combo box est invisible
cmbGarage.Visible=false;
}
Pour Récupérer la valeur sélectionnée dans le combo box par l’utilisateur ,
vous devez coder la procédure événementielle (méthode) cmbGarage_SelectionChangeCommitted qui est déclenchée lorsque l’utilisateur choisit un élément dans la combo box.
Le traitement est le suivant :
On récupère le numéro de la ligne courante (n° ligne sur laquelle on est positionné,
La 8 ème cellule de la ligne courante (le CodeGarage) reçoit la valeur sélectionnée dans la combo ·
On rend invisible la combo box ·
On se positionne sur la cellule suivante ( le champ LibelléIntervention)private void cboSexe_SelectionChangeCommitted(object sender, System.EventArgs e)
{
// On récupère le numéro de la ligne courante dans la variable
numLig int numLig= dgInterventions.CurrentRowIndex;
// La 8 ème cellule de la ligne courante du datagrid (le CodeGarage) reçoit la valeur sélectionnée
// dans la combo box
dgInterventions[numLigne,7]=Convert.ToInt32(cmbGarage.SelectedValue);
// On rend invisible la liste déroulante
cmbGarage.Visible = false ;
// On se positionne sur une autre cellule ( le champ DetailIntervention)
dbGrdEmploye.CurrentCell=new DataGridCell(dbGrdEmploye.CurrentCell.RowNumber,2);
}
Vous obtiendrez :
![]()
En utilisant le même principe présenté pour la liste déroulante, vous pouvez intégrer un monthCalendar pour pouvoir modifier la date d'intervention dans le datagrid en étant guidé par un calendrier :
Ajouter un monthCalendar (nommer le monthCalendar1) sur votre formulaire n’importe où,
donner la valeur False à la propriété Visible :
Afficher votre Calendrier (objet monthCalendar) lorsque l’utilisateur se positionne sur la 2 ème colonne (colonne DateIntervention) :
pour cela, vous devez coder la procédure événementielle (méthode) dgInterventions_CurrentCellChanged qui est déclenchée lorsque l’utilisateur change de colonne sur le datagrid.
Elle doit contenir le code suivant :
if(dgInterventions.CurrentCell.ColumnNumber==1)
{
monthCalendar1.Width=dgInterventions.GetCellBounds(dgInterventions.CurrentCell).Width;
monthCalendar1.Left=dgInterventions.Left+dgInterventions.GetCellBounds(dgInterventions.CurrentCell).Left; monthCalendar1.Top=dgInterventions.GetCellBounds(dgInterventions.CurrentCell).Top+dgInterventions.Top;
int numLigne=dgInterventions.CurrentRowIndex;
DateTime uneDate=Convert.ToDateTime(dgInterventions[numLigne,1]);
monthCalendar1.SelectionStart=uneDate;
monthCalendar1.Visible=true;
monthCalendar1.Focus();
}
else
{
monthCalendar1.Visible=false;
}
Pour Récupérer la valeur sélectionnée dans le calendrier par l’utilisateur ,
vous devez coder la procédure événementielle (méthode) monthCalendar1_DateSelected qui est déclenchée lorsque l’utilisateur choisit une date dans le calendrier.
Le traitement est le suivant :private void monthCalendar1_DateSelected(object sender, System.Windows.Forms.DateRangeEventArgs e)
{
int numLig= dgInterventions.CurrentRowIndex;
DateTime dateSaisie = Convert.ToDateTime(monthCalendar1.SelectionStart.ToShortDateString());
dgInterventions[numLig,1] = dateSaisie;
// On rend invisible la liste déroulante
monthCalendar1.Visible = false ;
// On se positionne sur la cellule suivante ( le champ detailIntervention)
dgInterventions.CurrentCell=new DataGridCell(dgInterventions.CurrentCell.RowNumber,2);
}Vous obtiendrez :