Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Databinding : mise à jour automatique d'un contrôle. [ Windows / Formulaire / Winforms / Controls ] (mathmax)

mercredi 14 novembre 2007 à 00:07:09 | Databinding : mise à jour automatique d'un contrôle.

mathmax

Bonjour,

J'ai un problème un peu compliqué concernant le databinding. Je cherche à faire une classe qui servira d'intermédiaire entre la propriété Datasource d'un contrôle et la collection auquel celui-ci est bindé. Je vais ici donner un exemple d'une classe qui ne sert à rien mais qui à le mérite de simplifier aux maximum les choses tout en montrant mon problème. L'exemple reste un peu long à cause de l'implémentation de IBindingList dans SourceView<T> mais est facilement lisible. Voici mon problème :

J'intercale une instance de Source<string> entre une listbox et une collection BindingList<string>. Je souhaite être notifié des changements quand je modifie la collection BindingList<string>. Pour vérifier cela, je supprime un élément de cette collection et je regarde si le contrôle est mis à jour.

Le problème est que mon contrôle n'est pas mis à jour dans mon exemple ci dessous. En revanche, si je modifie la propriété List de la classe SourceView<T> pour qu'elle soit réévaluée à chaque fois comme ceci :

Code :

public IBindingList List
{
get
{
DataSource.ListChanged += new ListChangedEventHandler(List_ListChanged);
returnnew BindingList<T>(new List<T>((IEnumerable<T>) DataSource));
}
set{ _List = value; }
}
alors mon contrôle est bien mis à jour. J'ai d'ailleurs remarqué que c'est la propriété AllowNew (renvoyant List.AllowNew) qui pose le problème. Au moment du Binding, elle est appelé plusieurs fois et si List n'est pas réévaluée à chaque appel alors le contrôle n'est plus notifié des changements de la datasource. Sauriez-vous m'expliquer pourquoi ?

Voici l'exemple complet.
Code :
 
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
 
privatevoid Form1_Load(object sender, EventArgs e)
{
BindingList<string> s = new BindingList<string> {"aaa", "bbb", "ccc"};
 
Source<string> source = new Source<string>();
 
source.DataSource = s;
 
listBox1.DataSource = source;
 
s.RemoveAt(1);
 
}
}
 
publicclass Source<T> : IListSource
{
public IBindingList DataSource {get; set; }
 
#region IListSource Members
 
publicbool ContainsListCollection
{
get{returntrue; }
}
 
public System.Collections.IList GetList()
{
returnnew SourceView<T>(DataSource);
}
 
#endregion
}
 
publicclass SourceView<T> : IBindingList
{
public IBindingList DataSource {get; set; }
 
private IBindingList _List;
 
public IBindingList List
{
get
{
if(_List == null)
{
DataSource.ListChanged += new ListChangedEventHandler(List_ListChanged);
_List = new BindingList<T>(new List<T>((IEnumerable<T>) DataSource));
}
return _List;
}
set{ _List = value; }
}
 
public SourceView(IBindingList datasource)
{
DataSource = datasource;
}
 
void List_ListChanged(object sender, ListChangedEventArgs e)
{
if(ListChanged != null)
ListChanged(this, e);
}
 
#region IBindingList Members
 
publicvoid AddIndex(PropertyDescriptor property)
{
List.AddIndex(property);
}
 
publicobject AddNew()
{
return List.AddNew();
}
 
publicbool AllowEdit
{
get{return List.AllowEdit; }
}
 
publicbool AllowNew
{
get{return List.AllowNew; }
}
 
publicbool AllowRemove
{
get{return List.AllowRemove; }
}
 
publicvoid ApplySort(PropertyDescriptor property, ListSortDirection direction)
{
List.ApplySort(property, direction);
}
 
publicint Find(PropertyDescriptor property, object key)
{
return List.Find(property, key);
}
 
publicbool IsSorted
{
get{return List.IsSorted; }
}
 
publicevent ListChangedEventHandler ListChanged;
 
publicvoid RemoveIndex(PropertyDescriptor property)
{
List.RemoveIndex(property);
}
 
publicvoid RemoveSort()
{
List.RemoveSort();
}
 
public ListSortDirection SortDirection
{
get{return List.SortDirection; }
}
 
public PropertyDescriptor SortProperty
{
get{return List.SortProperty; }
}
 
publicbool SupportsChangeNotification
{
get{return List.SupportsChangeNotification; }
}
 
publicbool SupportsSearching
{
get{return List.SupportsSearching; }
}
 
publicbool SupportsSorting
{
get{return List.SupportsSorting; }
}
 
#endregion
 
#region IList Members
 
publicvirtualint Add(object value)
{
return List.Add(value);
}
 
publicvirtualvoid Clear()
{
List.Clear();
}
 
bool IList.Contains(object value)
{
return List.Contains(value);
}
 
publicvirtualint IndexOf(object value)
{
return List.IndexOf(value);
}
 
publicvirtualvoid Insert(int index, object value)
{
List.Insert(index, value);
}
 
bool IList.IsFixedSize
{
get
{
return List.IsFixedSize;
}
}
 
bool IList.IsReadOnly
{
get
{
return List.IsReadOnly;
}
}
 
publicvirtualvoid Remove(object value)
{
List.Remove(value);
}
 
publicvirtualvoid RemoveAt(int index)
{
List.RemoveAt(index);
}
 
publicobjectthis[int index]
{
get{return List[index]; }
set{ List[index] = value;}
}
 
#endregion
 
#region ICollection Members
 
void ICollection.CopyTo(Array array, int index)
{
List.CopyTo(array, index);
}
 
publicint Count
{
get{return List.Count; }
}
 
bool ICollection.IsSynchronized
{
get
{
return List.IsSynchronized;
}
}
 
object ICollection.SyncRoot
{
get
{
return List.SyncRoot;
}
}
 
#endregion
 
#region IEnumerable Members
 
public IEnumerator GetEnumerator()
{
return List.GetEnumerator();
}
 
#endregion
 
}
 
 
merci d'avance pour votre aide.


Mathmax

****************************************




Cette discussion est classé dans : return, get, value, list, datasource


Répondre à ce message

Sujets en rapport avec ce message

Settings et Objets perso [ par Yxion ] Salut,Sur un projet, j'ai essayé d'utiliser le fichier setting pour enregistrer un objet perso. Mon pb, c'est que ca n'enregistre pas réellement : tan Problème dll sql server 2005. nouvelle dll en c#?? [ par ra2t ] Bonjour, je souhaiterais remplacer une dll du programme Microsoft Server 2005. En effet, mon client souhaite intégrer dans sa base de données des attr c# asp encapsulation [ par gatina ] bonjour voila je suis actuellement en stage et je doit utiliser les langage c# et asp mais je ne m'y conné pas du tous et je n'arrive pas a trouver de besoin daide - probleme de classe et renvoi dinformation [ par kev411 ] Bonjour je vous explique mon probleme , jai une bibliotheque de classe et dans cette bibliotheque je possede une classe Artiste une classe Artistes qu Dernier petit effort [ par aposfa ] Salut à tous Voici une fonction qui doit retourner un entier, sauf que dans certains cas, si les conditions ne sont pas satisfaites, je dois juste ef [C#] Web Service et type comlpex [ par jmengelle ] Bonjour, j'ai créé un webservice en C# et réussi à le déployer sur un serveur IIS. Je n'ai pas de souci pour l'utiliser avec des types simples, mais q Excel [ par Bidou ] Bonjour,J'ai besoin de faire une option export dans mon programme. J'aimerais exporter les données dans un format xls (Excel donc) mais je n'y arrive Besoin d'un avis (IsNumeric) [ par TTMan ] Bonjour à tous.Je souhaiterais avoir l'avis des experts sur  cette fonction "maison"Cette fonction devrait servir "d'équivalent" au IsNumeric de VB... Stack Overflow et propriétés... [ par nightlord666 ] Bonjour ! Je ne sais pas très bien utiliser les propriétés et j'ai essayé comme ça :public double NombreActuel{   get   {      return NombreActuel ListView problème pour trier les colonnes [ par emmanuel9 ] Bonjour à tous, J'ai un listview avec plusieurs colonnes qui contiennent chacunes des types differents DateTime, String, int etc.....Et j'aurais voulu


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,655 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.