理论上我该怎么做。
short winded:使用自定义集合存储数据,例如使用可变数量的字段和列...只要行是一致的。
啰嗦:
2或3个类:字段,行,可选:表
通常我会做List<Person> myList = new List<Person>;
之类的事情
然后该列表可以绑定到datagridview,并且列将基于Person类的属性。
要查看的代码:
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;
理论输出:
| |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"));
}
}
现在这是表单的代码。
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;
}
}
如果你把代码变成一个项目......你会看到第一个绑定....将一些内置的东西从绑定列表中拉入grid1。当我希望它们是水平的时,Grid2会垂直列出我的字段。
网格3显示了我想要输出的确切方式.....但我无法通过我将模仿dataTable的集合结构实现它....(在代码中提供)
声明: 关于我需要研究这个问题的关键词,我很缺乏。我找不到多少。我发现的最接近的事情是linq和pivotots。但他们的产出似乎与我所描述的不同。
我在整个地方都使用自定义集合,因此我希望保持代码非常相似,而不是使用数据表。这是我第一次需要我的收藏品以这种方式行事。
答案 0 :(得分:0)
一旦从数据库加载数据,听起来就像是在寻找要在内存中使用的对象集合。您可以在内置的System.Data对象上进行计算等,但它很麻烦,并且对大量数据的效果不佳。
我们大量使用System.Data对象来呈现数据。我们稍后尝试在数据库中进行计算,并将结果显示为DataSet,因此客户端不必进行任何数据操作。
我们的一些模块需要更复杂的数据处理。在一种情况下,我们使用了一组对象,这些对象代表了即时按摩的大量数据。这些列是固定的,因此它们很容易实现为每个对象的属性。当应用程序显示此数据时,它会生成一个小的摘要DataSet以显示在网格中。
我们有另一个模块,其中有可以包含值的字段,或者它们也可以基于其他字段进行计算。对于此模型,我们选择使用依赖于其他对象的对象,这些对象构成了一种计算网络。更改一个值,ValueChanged事件通知任何需要计算它们的依赖字段,这些字段会更改这些值等等。(这是一个粗略的简化。)
如果我必须提供可变数量的列,我会认真考虑坚持使用System.Data.DataSet。如果这对您不起作用,您可以考虑将列名映射到该列的行值集合的哈希表。我相信System.Data.DataTable是如何实现的;它按列存储值,而不是按行存储。然后行对象将知道其行索引以及如何从列集合中获取值。