在c#中创建动态属性并绑定哈希表

时间:2009-05-08 00:39:49

标签: c#

我正在尝试将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;
    }
}

1 个答案:

答案 0 :(得分:1)

Hashtable.ValuesICollection - 但您需要IList来绑定数据。理想情况下,您确实需要类型列表。为什么要在这里使用Hashtable?我怀疑你有足够的行需要它......

而是使用输入列表(List<T>BindingList<T>)。请注意,您只能绑定到网格中的单个类型。我不清楚你想在网格中显示什么,因为目前你只是添加描述,但是最简单的是:

this.gridControl1.DataSource = context.Categories.ToList();

或(更好):

this.gridControl1.DataSource = context.Categories.ToBindingList();

这不会帮助您将ProductsCategories放入单个网格中......但是,如果它们不是同一类型,那么 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()没有意义。另一种选择是为此目的声明自己的类,这意味着它也可以编辑。