2

我正在从 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 应用程序。

4

1 回答 1

1

如果您正在使用DataGrid,是否有机会切换到DataGridView?它会更加灵活......

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

如果属性是固定的,但您不想显示所有列

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

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

然后就变得棘手了;你正在进入黑暗的角落System.ComponentModel;您可以使用DataGridViewvia ITypedList(允许每个列表实例有不同的定义)或TypeDescriptionProvider(允许每个类型或每个列表实例有不同的定义)来执行此操作 - 但其中仅TypeDescriptionProvider适用于BindingList<T>. 老实说,我不认为这就是你的意思;如果是的话,坚持下去会更简单DataTable(两者都很难正确实现)。


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

于 2009-07-23T19:28:20.513 回答