0

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

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

4

3 回答 3

3

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

public class AnotherClass
{
    private DataSet m_dataSet;

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

创建新的AnotherClass使用实例时:

AnotherClass ac = new AnotherClass(m_dataSet);

wherem_dataSet又是一个引用数据集的成员变量——要么传递给构造函数中的调用类,要么(在主类的情况下)在代码中的某处创建。

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

另一种方法是使用单例类来保存数据集的实例。然后可以从许多不同的对象访问单例。

非线程安全示例将是:

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;访问它

于 2013-01-28T14:08:38.373 回答
0

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

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

于 2013-01-28T14:16:12.837 回答
0

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

var something = new Something(dataset)
于 2013-01-28T14:06:04.390 回答