从DataTable到BindingList

时间:2009-07-23 17:43:17

标签: c# inheritance datagrid bindinglist

我正在从DataTable切换到BindingList。我将DataTable绑定到DataGrid对象。

这就是我的困境:虽然我当然看到了切换的好处,但我的情况会让它变得有点复杂,我想知道切换是否值得。

我的情景: 我有一个显示化学样品的DataGrid。有5种样本类型,其中网格中的列对于每种类型都不同(有时在基于其他参数的相同类型内)。有些列保持不变,有些列有3种类型,有些列有4种等等。不完全是简单继承的情况。目前,我有一个DataTable,它很容易,因为我可以加载我想要的任何列,而不必拥有每个样本类型的属性,如果我使用BindingList,我将不得不这样做。但是,BindingList将使得更容易引用样本属性。

这是我第一次体验这个对象(BindingList)所以欢迎任何建议。据我所知,BindingList绑定到属性。如果我有:

public class Sample
{
    protected string m_seq;
    protected string m_id;
    protected string m_weight;
    protected string m_units;

    public Sample()
    {
    }

    public string Seq
    {
        get { return m_seq; }
        set { m_seq = value; }
    }

    public string Id
    {
        get { return m_id; }
        set { m_id = value; }
    }

    public string Weight
    {
        get { return m_weight; }
        set { m_weight = value; }
    }

    public string Units
    {
        get { return m_units; }
        set { m_units = value; }
    }

} //end of class

如果我有类似

的内容,网格将绑定到Sample类的属性
BindingList samples = new BindingList<Sample>();

这意味着我将有6种类型的样本,所有样本都定义了属性。最终的继承结构可能很复杂,所以我想知道它是否值得。欢迎任何反馈。

我正在使用c#2.0;它是一个Windows应用程序。

1 个答案:

答案 0 :(得分:1)

如果您使用DataGrid,是否有可能切换到DataGridView?它将更加灵活......

我不完全确定这个问题,但是:

如果属性已修复,但您不想显示所有列

然后在添加数据之前简单地设置AutoGenerateColumns = false,并自己添加所需的列;或者,保持启用状态,只需在您不想看到的列上设置.Visible = false

如果属性在运行时是动态的

然后它变得棘手;你进入了System.ComponentModel的黑暗角落;您可以使用DataGridView通过ITypedList(允许每个列表实例使用不同的定义)或TypeDescriptionProvider(允许每种类型或每个列表实例使用不同的定义)来执行此操作 - 但仅限TypeDescriptionProvider {1}}将与BindingList<T>一起使用。说实话,我不认为这就是你的意思;如果是的话,坚持使用DataTable会更简单(两者都很难正确实现)。


我希望有所帮助;我希望它像隐藏一些列一样简单!如果我错过了这一点,请告诉我。