2009-08-11 8 views
1

Dans mon application, je charge une petite base de données à partir d'une base de données et utilise la datatable pour lier une colonne à une liste déroulante de liste déroulante.winforms save datatable localement

Chaque fois que la zone de liste déroulante est affichée, ibelieve extrait des données de la base de données, ce qui semble inutile car les données changent à peine.

Existe-t-il un moyen de charger la datatable une fois en mémoire lorsque l'application s'ouvre et de l'utiliser encore et encore dans un formulaire?

Veuillez expliquer la mécanique de base de la façon dont cela fonctionnerait.

Répondre

1

Vous pouvez utiliser des variables/objets partagés pour stocker les données dans des winforms.

0

Faites votre datatable comme une propriété à votre principale forme comme ça:

private DataTable _dataSource; 
private DataTable DataSource 
{ 
    get 
    { 
    if (_dataSource == null) 
    { 
     // Fill your _dataSource 
    } 

    return _dataSource; 
    } 
} 

Et utiliser cette propriété pour lier votre dropdownlist. _dataSource sera une variable globale qui se trouve avec l'instance de formulaire principale.

0

J'utilise la classe statique pour ce cas:

public static class OraProvider 
    { 
     private static Dictionary<string, DataTable> _cachedDateTable; 
     ... 
     public static DataTable GetTable(string Table, bool cache) 
     { 
      if (cache && _cachedDateTable.ContainsKey(Table)) 
      { 
       return _cachedDateTable[Table]; 
      } 
      if (Connection.State == ConnectionState.Open) 
      { 
       DataTable dt = new DataTable(Table); 

       commonCommand.CommandText = "SELECT * FROM " + Table; 
       commonCommand.Connection = Connection; 
       commonDataAdapter.Fill(dt); 
       if (cache) 
       { 
        _cachedDateTable.Add(Table, dt); 
       } 
       else 
       { 
        if (_cachedDateTable.ContainsKey(Table)) 
        { 
         _cachedDateTable.Remove(Table); 
         _cachedDateTable.Add(Table, dt); 
        } 
       } 
       return dt; 
      } 
      else 
      { 
       return null; 
      } 
     } 
... 
} 
0

Il y a deux (sinon plus) les moyens possibles:

On est d'ajouter un ensemble de données dactylographié à votre projet et créer manuellement un table avec les colonnes respectives. Ensuite, créez un code pour remplir cette table et ajoutez-le en tant que source de données à votre colonne à l'aide d'une BindingSource.

Vous pouvez également utiliser une source de données objet

déclarer une classe (par exemple MyDataClass) qui contient les membres du public (doit être une lecture/écriture propriété IIRC. Si cela ne fonctionne pas, créer des variables membres du public) pour ID et valeur Déclarer une liste générique dans votre formulaire comme

private List<MyDataClass> m_dataSource = new List<MyDataClass>();

Cette liste sera utilisée comme source de données pour la colonne. Remplissez la liste avec une instance de MyDataClass pour chaque valeur que vous souhaitez afficher dans la zone de liste déroulante. Puis créez une nouvelle source de données d'objet dans votre projet pour la classe MyDataClass. J'utilise un VS2008 allemand, donc je ne connais pas les noms exacts des éléments du menu. Ce devrait être "Data> Show DataSources" et dans la fenêtre de l'outil de source de données: Ajouter une nouvelle source de données. Dans la boîte de dialogue suivante, sélectionnez "Objet" et sélectionnez la classe MyDataClass.

Vous obtiendrez alors une nouvelle source de données qui contient des membres pour les propriétés déclarées ci-dessus. Ajoutez une BindingSource à votre formulaire et une instance de la source de données d'objet. Attribuez-le à BindingSource (afin que vous puissiez utiliser le concepteur pour sélectionner les champs, etc.). Affectez le BindingSource en tant que DataSource pour votre colonne et sélectionnez les propriétés ValueMember et DataMember en conséquence.

Puis, dans le code, après le chargement des données dans la liste générique, attribuer m_dataSource à la propriété DataSource du BindingSource:

bindingSource.DataSource = m_dataSource;

S'il vous plaît me souviens que j'écris ceci de ma mémoire - il peut y avoir plus d'étapes impliquées, mais cela devrait fonctionner de manière similaire à ce que j'ai décrit.