[C#] Mise en forme Datagrid... Question pas facile [Résolu]

Signaler
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
7 février 2007
-
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
-
Bonjour,

voilà j'ai trouvé un code bien pratique me permettant de colorier une case d'un datagrid en fonction de la valeur d'une autre case.

Pour ce faire lorsque je crée mon datagrid j'ajoute ceci :



FormattableTextBoxColumn dgFormatColStyle =
new FormattableTextBoxColumn();


dgFormatColStyle.HeaderText = "Global Risk";


dgFormatColStyle.MappingName = "Global_Risk";


dgFormatColStyle.DisplayProgressBar =
true ;


dgFormatColStyle.ProgressBarStyle = EProgressDataGridStyle.e3DSet;


dgFormatColStyle.ProgressColor = Color.Lavender;


dgFormatColStyle.SetCellFormat +=
new FormatCellEventHandler(dgFormatColStyle_SetCellFormat);




dgStyleOrder.GridColumnStyles.Add(dgFormatColStyle);

et cela me revoit à ceci :


private
void dgFormatColStyle_SetCellFormat(
object sender, DataGridFormatCellEventArgs e)


{


FormattableTextBoxColumn ftbcTemp = (FormattableTextBoxColumn) sender;


DataGrid tmpDataGrid = ftbcTemp.DataGridTableStyle.DataGrid;



try


{



int test = Convert.ToInt16(tmpDataGrid[e.Row,16]);





switch (test)


{


case 100 :


e.BackBrush = RedBrush;


break;


case 50 :


e.BackBrush = OrangeBrush;


break;


case 33 :


e.BackBrush = GreenBrush;


break;


}


}



catch (Exception ex)


{


MessageBox.Show(ex.Message);;


}


}

Bon désolé pour le code, mais ca me semble indispensable pour comprendre.
Donc lorsque ma cellule est créée, si la valeur de la cellule de ma colonne 16 est égale à 100 il me la peint en rouge si 50 en orange et si 33 en vert.

Jusque là super ca fonctionne.

Mon problème est que dans mon datagrid, j'ai deux tables, et donc une ligne de mon datagrid me permette de voir en cliquant dessus ses lignes qui lui sont liées. (fonctionnalités basiques des datagrids remplis avec un dataset contenant deux tables liées).

Maintenant lorsque je vois les lignes filles, je peux au dessus apercevoir la ligne mère. OK le gros problème est que la cellule possède toujours l'évènement. mains dans ce cas-ci il essaie de colorier la case de mes cellules filles. Ce qui fait tout planter, étant donné que dans mon exemple, mes lignes filles n'ont que 8 cases. Il ne trouve donc pas la 16ème et j'ai une exception.

Avez-vous une idée me permettant de rendre cet évènement uniquement actif lorsque je suis dans l'affichage des lignes mères ?

Avez-vous une autre façon de procéder pour colorier une case ?

MErci

Bibicool

3 réponses

Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
sinon il y a un moyen de contourner ton pb...

tu affiche les données filles dans un autres datagrid....

datagrid_mere.Datasource = Ton_dataset.Tables["TABLE_MERE"];
datagrid_fille.Datasource = Ton_dataset.Tables["TABLE_FILLE"];

et tu fais en sorte que seul les lignes filles correspondant a ta mere s'affiche (rowfilter, chargement a la volée, datarelation, ...)
ou tu fais un

try
{
int test = Convert.ToInt16(tmpDataGrid[e.Row,16]);
}
catch
{
test = 0;
}

tu rajoute un catch qui evite que tout ton programmae plante...
l'exeption sera leve mais traiter avec le test=0, du coup pur les filles il ne fera rien...


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
7 février 2007
1
Je vais investiguer dans ta solution... en tout cas merci.

Sinon j'avais plus ou moins contourné le problème en ajoutant à la colonne 16 dans mes lignes filles le champs testés dans ma ligne parent. Ca fonctionne mais pas très propre je trouve, je dois ajouter 8 colonnes pour résoudre le problème.

Ton idée de deux datagrid pourrait être pas mal, c'est vrai.

Merci en tout cas pour ton aide.

Bibicool
Messages postés
1182
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
13
plutot que de rajouter tes x colonne dans ta table fille trap l'erreur avec le bout de code que je t'ai file au dessus...
c plus propre...je pense...que rajouter des colonnes...
ou test le nb de colonnes...avant de faire int test = Convert.ToInt16(tmpDataGrid[e.Row,16]);


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."