2009-04-14 3 views
1

J'ai un formulaire qui sera rempli par un tas d'informations à partir d'un modèle, puis remis à l'utilisateur pour compléter le reste. Le fait est que le modèle et l'objet qui contient le résultat final sont DataRows, car tout va et vient dans une base de données (que je n'ai pas le contrôle du schéma), donc cela semble être un bon endroit pour lier tous les contrôles et aller de l'avant avec des choses plus importantes, non?La liaison de données est plus compliquée que je le voudrais

Je n'arrive pas à lier les contrôles correctement, et c'est en partie ma faute parce que je voulais juste lancer une ligne, faire en sorte que les colonnes de la rangée soient importantes, et garder les valeurs de celles-ci, donc je lance souvent des lignes qui n'ont pas toutes les colonnes attendues par les contrôles, et donc ils jettent une exception. Mais il est en partie je-ne-sais-qui est la faute parce que ce faisant:

inProductName.DataBindings.Add("Text", TemplateBinder, "ProductName"); 

où TemplateBinder est un objet BindingSource avec la propriété DataSource mis à DataRow Je veux couler dehors, jette une exception quand je vais pour montrer le formulaire. Pas vraiment sûr de ce que je devrais faire différemment - le TemplateBinder ne contiendra pas de DataSource jusqu'à ce que j'obtienne la ligne du template, et si je dois gérer les bindings moi-même au lieu de les paramétrer et les oublier en haut de la page je ne suis pas obtenir beaucoup de valeur hors de la liaison.

Et c'est juste un test pour voir si ce que j'essaie de faire est même faisable! J'essaie de transmettre à BindingSource une ligne contenant les valeurs que je veux propager dans le formulaire, suspendre la liaison, la remplacer par une ligne vide de la table afin que les valeurs que je propage restent dans les propriétés que j'ai liées, affichez le formulaire, laissez l'utilisateur le remplir et activez à nouveau la liaison de sorte que les propriétés liées dans les contrôles s'infiltrent dans la ligne vide que j'ai définie en tant que BindingSource DataSource. Je veux dire, il n'y a aucun moyen que cela fonctionne, parce que ce serait trop facile, mais ce serait bien si je pouvais le faire au lieu de mon ancienne façon qui impliquait une déclaration de changement de 30 cas.

Je ne veux pas aller trop loin dans le trou du lapin ici. Il y a un bouton de tentation dans Visual Studio qui dit qu'il va simplement tout configurer automatiquement, mais j'ai une expérience avec Visual Studio qui suggère qu'il n'aimerait pas l'idée que le schéma de la base de données ne sera pas modifié via Visual Studio. En outre, je ne sais pas comment obtenir la flexibilité que je (ou plutôt, mes clients) exige de cette configuration automagique de fantaisie (je ne peux même pas voir comment programmer par erreur la chaîne de connexion). Le code copié-collé que j'ai est probablement moins un péché que tuer des caractéristiques parce que j'ai fait un changement radical dans les coulisses qui arrive à rendre certaines fonctionnalités très pratiques incommodes. Copypasta peut être transformé en une fonction beaucoup plus rapidement que nécessaire pour réécrire l'application entière. Et puis, si la base de données change? Le code Automagic semble préférer lancer une exception au lieu d'avaler sa fierté et de ne rien faire s'il n'a pas assez d'informations pour faire quelque chose. Donc, Stack Overflow, le tl; dr: Je veux que la liaison de données fonctionne pour moi au lieu de me faire jeter tout ce que j'ai fait. Puis-je?

Répondre

1

Je m'attends à ce que pour que cela fonctionne, vous devez utiliser un DataRowView, pas un DataRow; essayez d'obtenir cela à partir du DataView plutôt que du DataTable. La vue par défaut est table.DefaultView.

Pour info; la raison pour laquelle cela fonctionne lorsque vous utilisez un DataTable comme la source de liaison est que DataTable implémente IListSource, et retourne (de GetList()) la vue par défaut - donc en fait, lorsque vous liez à un DataTable, vous actaully finissent par se lier à la valeur par défaut vue (DataView).

Questions connexes