2013-01-15 3 views
0

En théorie, comment ferais-je cela. À court terme: stocker des données comme une base de données en utilisant des collections personnalisées, ayant une quantité variable de champs et de colonnes ... tant que les lignes sont cohérentes.Datable comme collection personnalisée dans C#

verbeux:

2 ou 3 classes: champ, ligne, le cas échéant: table

Normalement, je ferais quelque chose comme List<Person> myList = new List<Person>; Ensuite, cette liste pourrait être lié à une datagridview et les colonnes reposerait hors des propriétés de la classe Person.

Code pour regarder:

List<row> table = new List<row>; 
List<field> row0 = new List<field>; 
row0.Add(new field(col1,"value1")); 
row0.Add(new field(col2,"value2")); 
row0.add(new field(col3,"value3")); 
table.Add(row0); 


dataGridView1.DataSource = table; 

sortie théorique:

| |col 1 | col 2| col 3| 
___________________________ 
|row0|value1|value2|value3| 



public class cField 
{ 
    public string Name { get; set; } 
    public string Content { get; set; } 
    public cField() 
    { 
    } 

    public cField(string name, string content) 
    { 
     Name = name; 
     Content = content; 
    } 
} 

public class cRow:BindingList<cField> 
{ 
    public cRow() 
    { 
    } 
} 
public class tables:BindingList<cRow> 
{ 

    public tables() 
    { 
     fillTestData(); 
    } 

    private void fillTestData() 
    { 
     for (Int32 i = 0; i < 10; i++) 
     { 
      cRow tRow = new cRow(); 

       for (Int32 x=0; x < 3; x++) 
       { 
        cField f1 = new cField("ColumnName" + x.ToString(), "content" + x.ToString()); 
        tRow.Add(f1); 
       } 
       base.Items.Add(tRow); 
     }       
    } 
} 

//example class which shows the output of what I'd like. 
public class eField 
{ 
    public string ColumnName0 { get; set; } 
    public string ColumnName1 { get; set; } 
    public string ColumnName2 { get; set; } 

    public eField(string colName0, string colName1, string colName2) 
    { 
     ColumnName0 = colName0; 
     ColumnName1 = colName1; 
     ColumnName2 = colName2; 
    } 
} 

public class eTable : BindingList<eField> 
{ 
    public eTable() 
    { 
     base.Add (new eField ("content","content", "content")); 
     base.Add(new eField("content", "content", "content")); 
     base.Add(new eField("content", "content", "content")); 
    } 
} 

maintenant Voici le code pour la forme.

public partial class Form1 : Form 
{ 

    tables t; 

    public Form1() 
    { 
     InitializeComponent(); 


    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     t = new tables(); 

     dataGridView1.DataSource = t; 

     dataGridView2.DataSource = t[0]; 

     eTable table3 = new eTable(); 

     dataGridView3.DataSource = table3; 

    } 
} 

Si vous faites ce code dans un projet ... vous verrez la première liaison de .... tire un peu construit dans des choses de la BindingList dans grid1. Grid2 liste mes champs verticalement quand je les veux horizontaux.

Grille 3 montre exactement comment je veux que ma sortie soit ..... mais je ne peux pas y arriver avec la structure de collection je vais imiter un dataTable .... (fourni dans le code)

Avis de non-responsabilité: Je suis à court de mots-clés dont j'aurais besoin pour rechercher ce problème. Je n'ai pas trouvé beaucoup. La chose la plus proche que j'ai trouvée était liée à linq et aux pivots. Mais pas de leurs sorties semblait être comme je l'ai décrit. J'utilise des collections personnalisées partout, donc je voudrais garder mon code très similaire au lieu d'utiliser un datatable. C'est la première fois que j'ai besoin que mes collections se comportent de cette manière.

+2

Il me manque une question, un problème qui doit être résolu. – Oded

+0

On ne sait pas non plus ce que vous voulez réaliser (ou éviter) même si vous avez essayé d'expliquer en détail. Vous savez que vous pouvez lier un 'List ' à un contrôle de base de données, alors que savez-vous? –

+0

la question est "comment puis-je structurer certaines classes personnalisées ensemble, pour le faire fonctionner comme un objet datatable". Les réponses pourraient être théoriques. L'exemple de code que j'ai donné ne s'affiche pas sur une grille comme un datatable avec n quantité de colonnes à déterminer une fois que les lignes ont les objets de champ ajouté à eux. –

Répondre

0

Il semble que vous cherchiez une collection d'objets à utiliser en mémoire une fois que vous avez chargé les données d'une base de données. Vous pouvez effectuer des calculs et autres dans les objets System.Data intégrés, mais cela est fastidieux et ne fonctionne pas correctement avec une grande quantité de données. Nous utilisons beaucoup les objets System.Data pour présenter les données. Nous essayons de faire des calculs dans la base de données plus tard et de présenter les résultats sous forme de DataSet, de sorte que le client n'a pas à manipuler de données.

Certains de nos modules nécessitent un traitement de données plus sophistiqué. Dans un cas, nous avons utilisé un tableau d'objets représentant une grande quantité de données à masser à la volée. Les colonnes ont été fixées, elles étaient donc faciles à implémenter en tant que propriétés sur chaque objet. Lorsque l'application a présenté ces données, elle a généré un petit DataSet récapitulatif à afficher dans une grille.

Nous avons un autre module dans lequel il y a des champs qui peuvent avoir des valeurs, ou ils peuvent aussi avoir des calculs basés sur d'autres champs. Pour ce modèle, nous avons choisi d'utiliser des objets qui ont des dépendances sur d'autres objets qui ont fait une sorte de web de calculs. Changez une valeur, et l'événement ValueChanged notifie tous les champs dépendants qu'ils doivent calculer, qui les modifie, etc. (Ceci est une simplification grossière.)

Si je devais présenter un nombre variable de colonnes, sérieusement envisager de coller avec un système.Data.DataSet. Si cela ne fonctionne vraiment pas pour vous, vous pouvez envisager une table de hachage qui mappe un nom de colonne à une collection de valeurs de ligne pour cette colonne. Je crois que c'est ainsi que le System.Data.DataTable est implémenté; Il stocke les valeurs par colonne et non par ligne. Ensuite, un objet row connaîtrait son index de ligne et comment extraire les valeurs des collections de colonnes.

+0

Merci, il semble que vous compreniez ce que j'essayais d'obtenir. Le dernier paragraphe est une bonne information. Merci. Je vais essayer de faire une implémentation de la table de hachage. Aussi, je pense que pour ce projet immédiat je travaille sur ... Je vais juste construire une base de données de mes collections imbriquées pour la sortie sur la grille. –

Questions connexes