C# rafraîchissante zone de texte à partir de BindingSource
J'ai de la difficulté rafraîchissante des contrôles windows forms qui sont à l'aide d'un BindingSource objet. Nous avons un CAB/MVP/SCSF client que j'ai (en fait “nous” car c'est un effort d'équipe) sont en développement qui interagissent avec les services WCF en cours d'exécution sur un serveur distant. (C'est notre première tentative à cet égard, nous sommes donc dans un mode d'apprentissage). L'un des appels (du Présentateur) pour le service retourne un DataSet qui contient 3 tables de données, appelé “Contrat”, “Prêt” et “Conditions”. Chaque table contient une ligne. Lorsque le service retourne le jeu de données, nous l'enregistrons dans le SmartPart/Afficher dans une variable de membre de classe, par l'appel d'une fonction dans la vue BindData() et en passant le jeu de données à la vue à partir de la classe presenter;
private System.Data.DataSet _ds = null;
public void BindData(System.Data.DataSet ds)
{
string sErr = "";
try
{
_ds = ds; //save to private member variable
//more code goes down here
}
}
Nous essayons de lier chacune des trois tables de données à un assortiment de Windows Forms zones de texte, MaskedEditBoxes, et Infragistics UltraComboEditor Déroulant comboboxes Nous avons créé trois BindingSource objets, un pour chaque Table de données à l'aide de la VS2008 IDE.
private System.Windows.Forms.BindingSource bindsrcContract;
private System.Windows.Forms.BindingSource bindsrcLoan;
private System.Windows.Forms.BindingSource bindsrcTerms;
Nous lient les valeurs comme ceci
if (bindsrcContract.DataSource == null)
{
bindsrcContract.DataSource = _ds;
bindsrcContract.DataMember = “contract”;
txtContract.DataBindings.Add(new Binding("Text", bindsrcContract, "contract_id", true));
txtLateFeeAmt.DataBindings.Add(new Binding("Text", bindsrcContract, "fee_code", true));
txtPrePayPenalty.DataBindings.Add(new Binding("Text", bindsrcContract, "prepay_penalty", true));
txtLateFeeDays.DataBindings.Add(new Binding("Text", bindsrcContract, "late_days", true));
}
if (bindsrcLoan.DataSource == null)
{
bindsrcLoan.DataSource = _ds;
bindsrcLoan.DataMember = “loan”;
mskRecvDate.DataBindings.Add(new Binding("Text", bindsrcLoan, "receive_date", true));
cmboDocsRcvd.DataBindings.Add(new Binding("Value", bindsrcLoan, "docs", true));
}
Cela fonctionne lorsque nous ne la première lecture de ce service et obtenir un dataset. L'information est affichée sur les contrôles du formulaire, nous pouvons le mettre à jour à l'aide de la forme, et puis “enregistrer” en passant la modification des valeurs de retour du service WCF.
Ici, c'est notre problème. Si vous sélectionnez un autre prêt de la clé et de faire le même appel pour le service et obtenir un nouveau jeu de données, à nouveau avec 3 tables avec une rangée de chacun, les contrôles (zones de texte, masked edit box, etc...) ne sont pas mis à jour avec les nouvelles informations. Notez que le smartPart/View n'est pas fermé ou quoi que ce soit, mais reste chargé dans entre les appels vers le service. Sur le second appel, nous ne sommes pas de reliaison les appels, mais simplement essayer d'obtenir les données pour actualiser à partir de la mise à jour du jeu de données.
Nous avons essayé tout ce que nous pouvons penser, mais clairement il nous manque quelque chose. C'est notre première tentative à l'aide du contrôle BindingSource. Nous avons essayé
bindsrcContract.ResetBindings(false);
et
bindsrcContract.ResetBindings(true);
et
bindsrcContract.RaiseListChangedEvents = true;
et
for (int i = 0; i < bindsrcContract.Count; i++)
{
bindsrcContract.ResetItem(i);
}
Ainsi que la réinitialisation de la propriété DataMember de nouveau.
bindsrcContract.DataMember = ”Contract”;
Nous avons regardé beaucoup d'exemples. De nombreux exemples font référence à la BindingNavigator mais depuis les tables de données seulement une ligne, nous ne pensions pas que nous avons besoin. Il y a beaucoup d'exemples de grilles, mais nous n'utilisons pas ici. Quelqu'un peut s'il vous plaît signaler où l'on va mal, ou de nous orienter vers des ressources qui vous fournir plus d'informations?
Nous sommes à l'aide de VisualStudio 2008, C# et .Net 2.0, client XP, W2K3 serveur.
Merci d'avance
wes
OriginalL'auteur | 2008-10-28
Vous devez vous connecter pour publier un commentaire.
J'ai eu un problème similaire aujourd'hui et a trouvé cela fonctionne.
OriginalL'auteur Jimmy V
Première chose: Ce post besoin d'une certaine organisation. Pease rappelez-vous que les réponses ne sont pas conservés dans l'ordre. L'ordre est déterminé par le vote.
Donc, si vous avez d'autres questions, il suffit de modifier votre question initiale (marque avec "Éditer" pour éviter la confusion).
Upvote réponses que vous trouvez utile.
Oh et en passant, merci d'utiliser le code-exemple de bouton (au-dessus de la modifier-fenêtre) lorsque y compris le code-échantillons. Qui vous donnera une belle mise en forme du code, y compris la syntaxe de mise en évidence.
Maintenant à la viande: Le problème sous-jacent à la fois à vos questions, c'est que la Liaison-Manager conserve les liens vers les objets d'origine.
Lorsque vous affectez _ds comme source de données, la Liaison-Manager analyse du jeu de données et agit en conséquence. Si vous attribuer certains autres DataSet à _ds, la Liaison-Manager a aucun moyen de le savoir. Il a toujours la référence sur le jeu de données original-objet. C'est ce qui explique pourquoi vous avez besoin de réinitialiser la base de données-propriété au nouveau jeu de données.
Il explique également pourquoi le retrait et l'ajout de la table n'a pas le résultat escompté. Encore une fois, la Liaison-Gestionnaire détient la référence à l'ancienne table (ou de la première ligne dans le tableau). La nouvelle table n'est jamais tenu. Dans ce cas également, la réaffectation de _ds n'aide pas, parce que _ds points pour le même ensemble de données-objet comme avant. La Liaison-Manager est assez intelligent pour remarquer que c'est le même objet et n'a pas de reliaison action.
Vous devez modifier le contenu de vos objets liés (qui tire un PropertyChanged-Événement pour lequel la Liaison-Manager souscrit) ou vous devez déclencher une complète relier par l'affectation d'un objet différent de la source de données-propriété.
C'est une description simplifiée de ce qui se passe réellement, mais j'espère que c'est assez pour expliquer et résoudre votre problème. Malheureusement, je n'ai pas encore trouvé une explication détaillée de WinForms de la liaison de données sur le web (ou d'ailleurs).
OriginalL'auteur TToni
À défaut de tout le reste, vous pouvez réattribuer la source de données chaque fois que vous recevez un nouveau jeu de données, de faire quelque chose comme ceci:
(En outre, l'initialisation DataMember d'abord et ensuite de source de données, vous donnera de meilleures performances.)
OriginalL'auteur Alan
Wes, je suis très content d'avoir pu aider. Je me souviens encore d'un problème très semblable à la vôtre me prendre des semaines à la figure dans la nature...
Concernant vos questions, voici tout ce que je sais:
Si vous définissez la source de données en premier, puis le DataMember, votre source de données va être analysé à deux reprises, depuis la création de la DataMember par suite d'une modification de l'existant (valide) de liaison. Si vous le faites dans l'autre sens, réglage DataMember première (avec la source de données est null ou mieux, typeof(YourData)), la liaison a lieu seulement une fois lorsque vous définissez la source de données.
Je pense que vous pouvez appliquer la même solution ici. Au lieu de simplement
dans votre dernière ligne, vous devez écrire
Désolé de te décevoir, mais j'ai appris tout ce que je sais à propos de la liaison de données à partir de MSDN ainsi que d'essais et d'erreurs. C'était assez douloureux. J'espère que quelqu'un d'autre peut le carillon avec un lien utile ou deux.
OriginalL'auteur Alan
d'essayer de combiner :
utiliser cela à chaque fois que vous écrivez quelque chose de contrôles.
OriginalL'auteur zeljko