OVH Cloud OVH Cloud

Assigner un style a une colonne fille d'un datagrid.

4 réponses
Avatar
Quetzal
Bonjour,

J'ai un dataset rempli a l'aide d'un fichier XML. J'ai des hierarchies et
donc dans le dataset des relations parent-enfant.

J'ai cree un datagrid et j'ai assigne un datastyle puis ensuite des
gridcolumnstyle pour chaque colonnes au niveau du parent.
J'ai aussi cree un datastyle pour chaque relation fille (et aussi des
gridcolumnstyle).

Quand je lance mon programme, j'ai donc a cote de chaque ligne un petit +.
Quand je clique dessus pour voir les relations filles et j'en choisis une,
je leve une exception:

System.InvalidOperationException: The '' DataGridColumnStyle cannot be used
because it is not associated with a Property or Column in the DataSource.

J'ai une grosse croix rouge en diagonale dans mon datagrid et, bizarrement,
il y a quand meme un element affiche.

Voici mon code pour le datagrid
--
this.dataGrid.AlternatingBackColor = System.Drawing.Color.LightBlue;
this.dataGrid.DataMember = "";
this.dataGrid.DataSource = this.datasetTestCases.automated_test_case;
this.dataGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid.Location = new System.Drawing.Point(5, 65);
this.dataGrid.Name = "dataGrid";
this.dataGrid.PreferredColumnWidth = 80;
this.dataGrid.Size = new System.Drawing.Size(685, 330);
this.dataGrid.TabIndex = 2;
this.dataGrid.TableStyles.AddRange(new
System.Windows.Forms.DataGridTableStyle[] {
this.DataGridTableStyleMain,
this.dataGridTableStyleXCS,
this.dataGridTableStyleDB,
this.dataGridTableStyleOpt});
--

Les dataGridTableStyleXCS, dataGridTableStyleDB, dataGridTableStyleOpt sont
pour chaque relation fille.

Voici un exemple d'un d'entre eux:
--
this.dataGridTableStyleXCS.AlternatingBackColor =
System.Drawing.SystemColors.ControlText;
this.dataGridTableStyleXCS.DataGrid = this.dataGrid;
this.dataGridTableStyleXCS.GridColumnStyles.AddRange(new
System.Windows.Forms.DataGridColumnStyle[] {
this.dataGridTextBoxColumnXCS1,
this.dataGridTextBoxColumnXCS2,
this.dataGridTextBoxColumnXCS3});
this.dataGridTableStyleXCS.HeaderForeColor =
System.Drawing.SystemColors.ControlText;
this.dataGridTableStyleXCS.MappingName = "automated_test_case_xcs";
this.dataGridTableStyleXCS.ReadOnly = true;
--

Le mapping name correspond effectivement au nom de la relation dans la table
fille. D'ailleurs j'ai utilise l'IDE pour faire ces affectations. Je ne
comprends donc pas ce qui se passe...

L'exception ne donne pas le nom du datastyle, puisqu'il dit uniquement ".
Est-ce une piste?

Merci pour votre aide.

4 réponses

Avatar
Paul Bacelar
Peut-on avoir la StackTrace lors de l'exception.
--
Paul Bacelar

"Quetzal" wrote in message
news:
Bonjour,

J'ai un dataset rempli a l'aide d'un fichier XML. J'ai des hierarchies et
donc dans le dataset des relations parent-enfant.

J'ai cree un datagrid et j'ai assigne un datastyle puis ensuite des
gridcolumnstyle pour chaque colonnes au niveau du parent.
J'ai aussi cree un datastyle pour chaque relation fille (et aussi des
gridcolumnstyle).

Quand je lance mon programme, j'ai donc a cote de chaque ligne un petit +.
Quand je clique dessus pour voir les relations filles et j'en choisis une,
je leve une exception:

System.InvalidOperationException: The '' DataGridColumnStyle cannot be


used
because it is not associated with a Property or Column in the DataSource.

J'ai une grosse croix rouge en diagonale dans mon datagrid et,


bizarrement,
il y a quand meme un element affiche.

Voici mon code pour le datagrid
--
this.dataGrid.AlternatingBackColor = System.Drawing.Color.LightBlue;
this.dataGrid.DataMember = "";
this.dataGrid.DataSource = this.datasetTestCases.automated_test_case;
this.dataGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid.Location = new System.Drawing.Point(5, 65);
this.dataGrid.Name = "dataGrid";
this.dataGrid.PreferredColumnWidth = 80;
this.dataGrid.Size = new System.Drawing.Size(685, 330);
this.dataGrid.TabIndex = 2;
this.dataGrid.TableStyles.AddRange(new
System.Windows.Forms.DataGridTableStyle[] {
this.DataGridTableStyleMain,
this.dataGridTableStyleXCS,
this.dataGridTableStyleDB,
this.dataGridTableStyleOpt});
--

Les dataGridTableStyleXCS, dataGridTableStyleDB, dataGridTableStyleOpt


sont
pour chaque relation fille.

Voici un exemple d'un d'entre eux:
--
this.dataGridTableStyleXCS.AlternatingBackColor > System.Drawing.SystemColors.ControlText;
this.dataGridTableStyleXCS.DataGrid = this.dataGrid;
this.dataGridTableStyleXCS.GridColumnStyles.AddRange(new
System.Windows.Forms.DataGridColumnStyle[] {
this.dataGridTextBoxColumnXCS1,
this.dataGridTextBoxColumnXCS2,
this.dataGridTextBoxColumnXCS3});
this.dataGridTableStyleXCS.HeaderForeColor > System.Drawing.SystemColors.ControlText;
this.dataGridTableStyleXCS.MappingName = "automated_test_case_xcs";
this.dataGridTableStyleXCS.ReadOnly = true;
--

Le mapping name correspond effectivement au nom de la relation dans la


table
fille. D'ailleurs j'ai utilise l'IDE pour faire ces affectations. Je ne
comprends donc pas ce qui se passe...

L'exception ne donne pas le nom du datastyle, puisqu'il dit uniquement ".
Est-ce une piste?

Merci pour votre aide.


Avatar
Quetzal
Bonjour,

Merci pour ta reponse.

Je ne sais pas exactement comment avoir la stack trace. Peux tu m'en dire
plus s'il te plait?

En fait, je ne sais pas exactement ou placer les breakpoints (ou alors je
fais fausse route?): je suppose que pas dans InitializeComponents()...

Voici par contre les details de l'exception. Je ne pense pas que cela soit
vraiment clair, mais peut-etre que c'est ce que tu voulais ire...

************** Exception Text **************
System.InvalidOperationException: The '' DataGridColumnStyle cannot be used
because it is not associated with a Property or Column in the DataSource.
at
System.Windows.Forms.DataGridColumnStyle.CheckValidDataSource(CurrencyManager
value)
at
System.Windows.Forms.DataGridColumnStyle.GetColumnValueAtRow(CurrencyManager
source, Int32 rowNum)
at System.Windows.Forms.DataGridParentRows.GetColDataBoxWidth(Graphics g,
Int32 colNum)
at System.Windows.Forms.DataGridParentRows.PaintParentRows(Graphics g,
Rectangle bounds, Boolean alignToRight)
at System.Windows.Forms.DataGridParentRows.Paint(Graphics g, Rectangle
visualbounds, Boolean alignRight)
at System.Windows.Forms.DataGrid.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,
Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase: file:///c:/winnt/microsoft.net/framework/v1.1.4322/mscorlib.dll
----------------------------------------
AutoDBTester
Assembly Version: 1.0.1949.13920
Win32 Version: 1.0.1949.13920
CodeBase:
file:///C:/Documents%20and%20Settings/christophem/My%20Documents/Extended%20Systems/Project%20test%20environment/AutoDBTester/AutoDBTester/bin/Debug/AutoDBTester.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll
----------------------------------------
System
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
----------------------------------------
System.Xml
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.xml/1.0.5000.0__b77a5c561934e089/system.xml.dll
----------------------------------------
System.Data
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.data/1.0.5000.0__b77a5c561934e089/system.data.dll
----------------------------------------
System.Drawing
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.2032
CodeBase:
file:///c:/winnt/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll
----------------------------------------
Accessibility
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase:
file:///c:/winnt/assembly/gac/accessibility/1.0.5000.0__b03f5f7f11d50a3a/accessibility.dll
----------------------------------------

"Paul Bacelar" wrote:

Peut-on avoir la StackTrace lors de l'exception.
--
Paul Bacelar




Desole d'etre lourd!
Avatar
Paul Bacelar
"Quetzal" wrote in message
news:
Bonjour,

Merci pour ta reponse.

Je ne sais pas exactement comment avoir la stack trace. Peux tu m'en dire
plus s'il te plait?




C'est parfait ;-)

En fait, je ne sais pas exactement ou placer les breakpoints (ou alors je
fais fausse route?): je suppose que pas dans InitializeComponents()...




InitializeComponents() n'est pas forcement libre de bug.

N'oubliez pas que vous spécifiez des choses avec les Designer qui peuvent
êtres fausses en fonction des données à l'exécution.


Voici par contre les details de l'exception. Je ne pense pas que cela soit
vraiment clair, mais peut-etre que c'est ce que tu voulais ire...

************** Exception Text **************
System.InvalidOperationException: The '' DataGridColumnStyle cannot be


used
because it is not associated with a Property or Column in the DataSource.
at



System.Windows.Forms.DataGridColumnStyle.CheckValidDataSource(CurrencyManage
r
value)



La trace montre que la méthode CheckValidDataSource a déterminé que la
source de données ne correspondait pas car le paramètre "value" de la
méthode n'a pas les bonnes propriétés.

at



System.Windows.Forms.DataGridColumnStyle.GetColumnValueAtRow(CurrencyManager
source, Int32 rowNum)
at System.Windows.Forms.DataGridParentRows.GetColDataBoxWidth(Graphics


g,
Int32 colNum)
at System.Windows.Forms.DataGridParentRows.PaintParentRows(Graphics g,
Rectangle bounds, Boolean alignToRight)
at System.Windows.Forms.DataGridParentRows.Paint(Graphics g, Rectangle
visualbounds, Boolean alignRight)
at System.Windows.Forms.DataGrid.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs


e,
Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)


...

Commencez par configurer votre VS.NET pour interrompre la session de
debugging dès le lancement d'une exception
"System.InvalidOperationException" (Menu Debuguer->Exceptions->Common
Language Runtime Exception->System->System.InvalidOperationException)

Après avoir configurer VS.NET, lancer une session de debugging (F5), VS.NET
affichera une boite de dialogue dès que l'exception sera lancé (avant même
qu'elle soit catché).

Configurer votre vue de la pile d'appel (Menu Debuguer->Fenêtres->Piles des
Appels) pour afficher les appels de la CLR (en gris clair).

Dans la vue de la pile d'appel, click sur la ligne
"System.Windows.Forms.DataGridColumnStyle.CheckValidDataSource(CurrencyManag
er " en haut de la pile. Vous serez dans le contexte de cette méthode lors
de l'évaluation des expressions saisies dans les fenêtres espions (Menu
Debuguer->Fenêtres->Espion->Espion 1).

Tapez "value" dans la vue Espion, vous aurez la valeur du paramètre "value"
lors de l'exception.

Tapez "this" pour avoir l'ensemble des membres de l'objet de type
"System.Windows.Forms.DataGridColumnStyle" et ainsi voir les anomalies.

Un outils comme Reflector(http://www.aisto.com/roeder/dotnet/) permet
d'avoir le source de la méthode et ainsi de connaître précisément la
vérification qui déclenche l'exception et par déduction, le problème dans
votre source.


Desole d'etre lourd!


On a tous commencés comme ça ;-)
--
Paul Bacelar
Avatar
Quetzal
Je suis degoute,

Je viens de perdre un long message que j'avais ecrit pour repondre a votre
post. Tant pis!

Si je poste a cette heure tardive, cest parce que je fais un stage aux US.
Mon post sur le forum americain ne m'avait donne aucune reponse...

En resume, merci enormement pour votre aide. J'ai beaucoup appris grace a
votre billet.

Je n'ai pas pu resoudre mon probleme car il y avait trop d'informations
(plein de + emboites) et je soupconne fortement que mon initialisation des
styles des tables filles se soit mal passe.

Bref, mon chef m'a dit qu'il preferait avoir pas de style du tout pour que
je fasse autre chose. J'ai donc efface ma datagrid et recree une nouvelle qui
marche...

Ce n'est pas grave, je vous remercie de tout le temps que vous m'avez
consacre!

Cordialement