2010-02-13 24 views
0

je suis tombé sur l » elegant and witty solutionMarc Gravell au problème posté par Matt (titre « C#/winforms: how to best bind a propertygrid and a System.Data.DataRow »), et ont utilisé même solution dans un de mes applications.À propos de RowWrapperDescriptor Marc Gravell pour la liaison System.Data.Rows à PropertyGrid

En utilisant des extraits du code de Marc:

DataTable table = new DataTable(); 
    table.Columns.Add("ID", typeof(int)); 
    table.Columns.Add("Foo", typeof(int)); 
    table.Columns.Add("Bar", typeof(string)); 
    table.Columns.Add("Audit", typeof(DateTime)); 

    table.Rows.Add(1, 14, "abc", DateTime.MinValue); 
    DataRow row = table.Rows.Add(2,13,"def", DateTime.MinValue); 
    table.Rows.Add(3, 24, "ghi", DateTime.MinValue); 

    RowWrapper wrapper = new RowWrapper(row); 
    wrapper.Exclude.Add("ID"); 
    wrapper.Exclude.Add("Bar"); 

j'ai pu faire en quelque sorte ce travail avec un DataGridView; DataGridView utilise la table comme source, tandis que chaque clic sur une ligne de DataGridView est défini en tant que SelectedObject pour la propriété propertyGrid1 (en utilisant RowWrapper de Marc), et cela fonctionne parfaitement. Vous pouvez demander pourquoi je fais cela, ce qui signifie utiliser DataGridView et PropertyGrid; En fait, les exigences commerciales et les politiques de gestion étroites d'esprit.

De toute façon, j'ai maintenant un autre dilemna; une des colonnes de la table, par exemple "Foo" (qui apparaît dans le PropertyGrid comme l'un des champs, par exemple), devrait être une sorte de liste déroulante dans le PropertyGrid. Ce que je veux dire, "Foo" devrait être une liste déroulante contenant une liste d'éléments dérivés d'un autre DataTable. En outre, existe-t-il un moyen d'inclure une sorte de description pour chaque élément de champ?

Est-ce que cela pourrait être fait? Marc Gravell a mentionné quelque chose comme "" Notez que vous pouvez faire d'autres choses dans cette zone pour rendre certaines propriétés non éditables (IsReadOnly), ou avoir une légende différente (DisplayName), ou category (Category) - en remplaçant les autres membres RowWrapperDescriptor "comme la note de fin à son poste, et je me demandais est il ya un moyen de le faire.

Tout conseil théorique est grandement apprécié. Merci beaucoup.

+0

Cela pourrait être une bonne idée de prendre du recul; quel est l'effet que vous essayez d'atteindre? Donc: vous avez un 'DataTable'; et vous voulez ...? [remplir en blanc ici ...]. –

+0

La "manière de faire ceci" est exactement comme mentionné; override 'IsReadOnly' ou' DisplayName' etc. Il n'y a pas de "catégorie" dans un 'DataGridView'. Pour la liste déroulante, je suppose que vous devrez le faire manuellement en changeant les propriétés 'DataGridView' sur la colonne (en ajoutant probablement la colonne manuellement comme une colonne déroulante); mais sans plus d'informations sur ce qui marche/ne fonctionne pas, il est difficile d'être plus précis. –

Répondre

0

Merci pour la réponse ... Marc

Il est comme ça; en supposant que nos besoins d'affaires a la configuration DataTable suivante:

DataTable table = new DataTable(); 

table.Columns.Add("ID", typeof(int)); 
table.Columns.Add("MedSequence", typeof(int)); 
table.Columns.Add("Prognosis", typeof(string)); 
table.Columns.Add("RBC", typeof(string)); 
table.Columns.Add("WBC", typeof(string)); 
table.Columns.Add("BP Normal", typeof(bool); 
table.Columns.Add("Histology", typeof(string)); 

DataRow row = table.Rows.Add(559,6845,"Progressive decline","54–62pcnt","6.1 million/uL",true,"Haematoxylin"); 

Je mis la source de données de dataGridView1 à « table », tandis que sur tous les cellcontentclick pour le datagridview, le selectedObject de propertyGrid1 est réglé sur le « courant » ligne sélectionnée dans datagridview. Dans un sens, l'exigence était que dataGridView1 affiche seulement 2 colonnes: MedSequence et pronostic, alors que le reste des colonnes de la table DataTable est invisible pour l'utilisateur. Toutefois, propertyGrid1 doit afficher toutes les colonnes de la table en tant que propriétés.

Par conséquent, l'effet prévu était pour le DataGridView simplement comme un moyen d'affichage (des colonnes MedSequence et Pronostic), tandis que l'édition des autres valeurs de table est gérée par propertyGrid1.

Comme je l'ai dit dans mon post, à l'heure actuelle, en utilisant votre classe RowWrapper, cela fonctionne parfaitement. Cependant, pour l'une des colonnes de table, "Histologie", propertyGrid1 doit afficher une liste déroulante modifiable contenant la liste suivante: {"Haematoxylin", "Eosin", "Toluidine blue", "Acide périodique-Schiff Stain" } Essentiellement, la direction pensait que cette liste déroulante serait peuplée de valeurs interrogées à partir d'une base de données (c'est probablement ce que nous ferons), mais mon problème est de faire en sorte que le champ "Histologie" dans propertyGrid1 devienne un drop- liste déroulante. Puisque propertyGrid1 utilise un wrapper pour ses champs dérivés des colonnes d'un datatable, je ne sais pas quoi faire.

Même si je changeais la colonne DataGridView pour Histology en une liste déroulante, cela n'aurait pas fonctionné car comme je l'ai dit, seulement 2 colonnes de la table seront affichées (MedSequence et Pronostic), alors que toutes les autres sont modifiable uniquement via propertyGrid1, l'histologie étant un cas particulier car elle doit apparaître sous la forme d'une liste déroulante dans la propriété propertyGrid1.