J'ai cette base de données, pas de ma conception, mais je dois travailler avec elle, contenant une table comme: la propriété d'état fait référence à une énumération où P> Lorsque j'affiche ceci dans une lecture en lecture seule, j'aimerais que l'utilisateur affiche le nom de l'ENUM (Dev, ACTIVE, ...) ou une description au lieu du numérique valeur. Le DataGridView est lié à un jeu de données issu d'un dal, à nouveau non de ma conception, donc je ne peux donc pas vraiment changer le jeu de données. La seule façon dont j'ai trouvé comment faire est en écoutant l'événement DataGridView.celling où je mets ce code: p> Cela fonctionne bien, sauf que si j'ai environ 1k (pas beaucoup) ou plus d'articles, il faut pour toujours ...
Y a-t-il une meilleure façon de faire cela? P> --- Edit --- Y a-t-il une meilleure façon que d'utiliser l'événement cellique? Ou existe-t-il un moyen d'ajouter l'événement cellique à une seule colonne? Ou quoi? P> P>
Cela fonctionne bien comme c'est le cas, mon problème est que s'il ya plus de 1000 rangées dans le type de données, cela prend pour toujours. Le problème est que l'événement de commande cellulaire déclenche pour chaque colonne, même ceux qui n'en ont pas besoin. Disons que j'affiche 15 colonnes et il y a 1000 lignes, alors cet événement incendie 15 000 fois ... p>
6 Réponses :
Actuellement, je ne comprends pas bien ce que vous entendez par 1k articles em>. Mais, tout ce que vous avez à faire est de créer l'énum pour vous-même comme: p> e.Value = Enum.GetName(typeof(States), e.Value).Description;
Désolé si je n'étais pas clair ... Il n'y a que 6 statut différent, ce que je voulais dire était quand il y a plus de 1000 colonnes dans le DataTable, il est vraiment lent ... aussi, la solution que vous avez fournie est ce que je fais actuellement avec La méthode GetenumStringValue, mais je veux savoir s'il y a un meilleur moyen que les incendies de sorcière des événements de formatage pour chaque colonne, même ceux qui n'ont pas besoin de former ... je vais éditer mon post pour rendre les choses plus claires
Je ne le ferais pas sur CellFormatting. J'attaquerais le datatable lui-même. J'ajouterais une ligne qui a le type d'énum, et la boucle à travers la table et ajoutez les valeurs. Quelque chose comme ceci: puis, dans votre DataGridView, masquez la colonne qui a la représentation entière de votre énumé. P> P>
Ouais, j'ai appris à ce sujet, mais mon problème est que le jeu de données ne vient pas de moi, et j'ai peur de ce qui pourrait arriver plus tard dans le code si j'ajoute une colonne ... aussi, le ferait comme ça vraiment accélérer les choses?
Oui, cela accélérerait les choses car cela se produirait avant de se lier, et vous n'avez pas besoin de vous gâcher avec tous les événements de formatage. Vous pouvez essayer de cloner le jeu de données avant de le faire, de cette façon, l'original n'est pas gâché. Je pense toujours que ce serait plus rapide. Donner un coup de feu.
Je vais essayer ça ... clone the DataTable, ajoutez une nouvelle colonne, faites tout autre formatage, puis lié-le au DGV ... merci
Depuis que vous dites que ce DGV est "en lecture seule", vous pouvez lire la table de données dans une liste d'un type personnalisé qui effectue la conversion en place.
Vous pouvez vous débarrasser de la prise de travail et de votre méthode personnalisée et simplement écrire: p> si la valeur ne pars pas, il sera affiché comme valeur entière. Cela accélérera les choses un peu. P> p>
J'ai utilisé la réponse bfree mais avec votre façon de jeter la valeur pour vous débarrasser de l'essai..Catch pour accélérer les choses. Merci pour votre anwser
Je viens de réaliser que la distribution n'était même pas nécessaire.
Oups, vous avez besoin du casting si le type de la table de données est entier. J'ai besoin de plus de café.
Dans quel événement?
Vous pouvez utiliser l'événement Rowpostpaint de DataGridView. Vous pouvez faire comme suit. Dans cette méthode, vous devez rechercher la valeur que vous souhaitez mettre à jour sinon cela vous jette en boucle infinie pour mettre à jour la ligne. Une fois la valeur mise à jour, vous devez éviter de la mettre à jour à nouveau. Cette solution n'est applicable que si ceci est une cellule réadonnée. P> Je suggérerais d'accéder à la solution de BFREE, si cela n'est pas possible, vous pouvez penser à cela. P> P>
Vous pouvez utiliser la propriété CellTemplate de la colonne correspondante. Donc, créez d'abord une classe pour le modèle de cellule, remplacement de GetformattedValue attribue ensuite de nouvelles instances aux modèles de cellule des colonnes. Notez que le changement ne prend effet que lorsque vous rafraîchissez la grille et c'est pourquoi je l'ai mis dans le constructeur: p>
(TL; DR) Personnellement, il suffit d'utiliser J'ai cherché cela parce que je ne savais pas quel type de gridviewData à utiliser pour afficher mon énumérum correctement et que les réponses m'ont amené à conclure qu'il était plus difficile que ce n'était en réalité. P> gridviewtoxtculcolumn code> avec
FieldName = "CurrentStatus" code> a fonctionné simplement (montré le nom Enum). P>
@Oliver, k = mille; 1k = 1000
Si les descriptions d'état sont définies dans une table séparée, vous pouvez vous joindre à ce tableau et renvoyer les descriptions dans le cadre des données que vous êtes censé afficher. C'est le genre de chose des bases de données à faire et je trouve étrange que les solutions proposées impliquent itérant sur les résultats renvoyés par la base de données. Bien sûr, ce commentaire devient discuté si les données requises ne sont pas dans la base de données ou vous ne pouvez pas l'insérer vous-même.
non ... Malheureusement, les valeurs du statut ne sont pas dans la DB (pas de mon design)
Pouvez-vous contrôler le SQL utilisé pour récupérer les données? Parce que si vous pouvez le faire, vous pouvez ajouter une colonne à l'ensemble de résultats qui utilisait une instruction de cas pour générer les noms Enum des valeurs de la colonne d'état.