我正在尝试将Row绑定到gridview,它不仅包含Category表的字段,还包含其他表。所以我为所有这些字段设置了属性。但由于表中的列可能经常更改,我还需要动态更改属性。我找到了以下一种方法(使用哈希表)。但是我无法将哈希表值绑定到gridview。
如何更好地解决这个问题?
public partial class Form1 : Form
{
public class Row
{
// properties
public Hashtable Properties = new Hashtable();
}
public Form1()
{
InitializeComponent();
DataClasses1DataContext context = new DataClasses1DataContext();
var st = from c in context.Categories
select c;
var p = from pr in context.Products
select p;
Row r = new Row();
//List<Row> listrow = new List<Row>();
foreach (var item in st)
{
r.Properties.Add(item.Description, item.Description);
}
this.gridControl1.DataSource = r.Properties.Values;
}
}
答案 0 :(得分:1)
Hashtable.Values
是ICollection
- 但您需要IList
来绑定数据。理想情况下,您确实需要类型列表。为什么要在这里使用Hashtable
?我怀疑你有足够的行需要它......
而是使用输入列表(List<T>
或BindingList<T>
)。请注意,您只能绑定到网格中的单个类型。我不清楚你想在网格中显示什么,因为目前你只是添加描述,但是最简单的是:
this.gridControl1.DataSource = context.Categories.ToList();
或(更好):
this.gridControl1.DataSource = context.Categories.ToBindingList();
这不会帮助您将Products
和Categories
放入单个网格中......但是,如果它们不是同一类型,那么 nothing 将会出现。 可能工作的一件事是公共属性的匿名类型:
var query = (from c in context.Categories
select new {Id = c.CategoryId, Name = c.Category,
Description = c.Description }).Concat(
from p in context.Products
select new {Id = p.ProductId, Name = p.Product,
Description = p.ProductDescription });
this.gridControl1.DataSource = query.ToList();
但请注意,匿名类型是不可变的(不可编辑) - 因此使用ToBindingList()
没有意义。另一种选择是为此目的声明自己的类,这意味着它也可以编辑。