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.
Il me manque une question, un problème qui doit être résolu. – Oded
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? –
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. –