可以跨类使用DataSet吗?

时间:2013-01-28 14:03:22

标签: c# winforms dataset

我正在使用VS 2010和C#窗体。 我需要用户输入他有多少个对象以及每个权重。 然后我需要处理每一个。我通常用于行集合中的每个数据行。

问题是我试图清理我的一些非常讨厌的代码(这是我的第一个真正的项目btw)我有一个主要类在〜5000行代码,并希望将特定的模块集分解为自己的类。问题是,当用户输入信息时,我必须在主窗体(DSObjects)上设置数据集,并将表格网格视图和带有添加按钮的几个输入框链接到该窗口,以便用户可以添加所需的数据。我遇到的问题是当我运行代码并将类分解为子类时,每个新类都会消除数据集。

3 个答案:

答案 0 :(得分:3)

不要在每个类中创建数据集的新实例,而是传递一个实例,例如:

public class AnotherClass
{
    private DataSet m_dataSet;

    public AnotherClass(DataSet ds)
    {
        m_dataSet = ds;
    }
}

创建AnotherClass的新实例时使用:

AnotherClass ac = new AnotherClass(m_dataSet);

其中m_dataSet再次是引用数据集的成员变量 - 要么传递给构造函数中的调用类,要么(在主类的情况下)在代码中的某处创建。

仅创建一次数据集,例如在主类中。

另一种方法可能是使用一个包含数据集实例的单例类。然后可以从许多不同的对象访问单身人士。

non-threadsafe sample将是:

public class DataHolder
{
    private DataSet m_dataSet;
    private static DataHolder m_instance;

    private DataHolder()
    {
        m_dataSet = ... // Fill/Create it here
    }

    public static DataHolder Instance
    {
        get
        {
            if (m_instance = null)
                m_instance = new DataHolder();
            return m_instance;
        }
    }

    public DataSet Data
    {
        get { return m_dataSet; }
    }
}

然后,使用DataHolder.Instance.Data;

访问它

答案 1 :(得分:0)

您可以尝试将数据集传递到每个类的构造函数

var something = new Something(dataset)

答案 2 :(得分:0)

请记住,DataSet实际上是内存中的一个小(但完整)数据库。虽然大多数应用程序只是使用它来将数据从数据库服务器传输到应用程序中的对象,但它具有完整数据库的所有部分:多个表,可以连接成关系,可以对它们运行查询。

考虑到这一点,正如您不会为每个类都有单独的数据库,而是为整个应用程序使用全局数据库,同样合理地让应用程序中的所有对象共享一个DataSet。 / p>