在表单之间共享DataSet

时间:2014-07-15 01:44:26

标签: c# datagridview datatable dataset

我正在使用Visual Studio 2010 Express中的Windows窗体应用程序。我的主页表单有一个包含4个表的数据集。其中一个表称为“类别”,我想从一个名为Categories的单独表单中管理此表。

我按照@Harm van der Haas(Shared DataSet Over Multiple Forms C#)中列出的步骤进行了操作,但我无法正常工作。

在我的 Home 表单中,我有以下代码:

public partial class frmHome : Form
{
    public DataSet _dsMain;

    public frmHome(DataSet dsMain)
    {
        _dsMain = dsMain;
        InitializeComponent();
    }

在我的program.cs中,我有:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        DataSet DS = new DataSet();
        Application.Run(new frmHome(DS));
    }
}

在我的类别表单中,我有以下代码:

public partial class frmCategory : Form
{
    public DataSet ds2;
    public frmCategory(DataSet dsMain)
    {
        ds2 = dsMain;
        InitializeComponent();
    }

    private void frmCategory_Load(object sender, EventArgs e)
    {
        dgvCategory.DataSource = ds2;
        dgvCategory.DataMember = "Category";
        dgvCategory.Refresh();
    }
}

在这里,我启动表单类别:

private void btnStart_Click(object sender, EventArgs e)
{
    Globals.startTime = DateTime.Now;
    frmCategory frmC = new frmCategory(_dsMain);
    frmC.ShowDialog();
    //updateActiveTrans();
}

但是当Category表单加载我的datagridview dgvCategory时,不会显示Category表头

3 个答案:

答案 0 :(得分:1)

在frmCategory_Load事件中,为网格分配数据源时,需要指定所需的表。以下是示例代码:

public partial class frmCategory : Form
{
public DataSet ds2;
public frmCategory(DataSet dsMain)
{
    ds2 = dsMain;
    InitializeComponent();
}

private void frmCategory_Load(object sender, EventArgs e)
{
    dgvCategory.DataSource = ds2.Tables[0]; //you can use .Tables[1] or the desired table
    dgvCategory.DataMember = "Category";
    dgvCategory.Refresh();
}

}

答案 1 :(得分:1)

以下是关于如何将Dataset从一种形式传递到另一种形式的简单方法。我正在使用 Visual Studio 2012 C#WPF PostgreSQL 作为数据库。

        //ON MY FIRST FORM
        //this is my connection - add it anywhere you want
        //or change it according to your need
        NpgsqlConnection iConnect = new NpgsqlConnection("Server = " + myModule.Server + ";Port = " + myModule.Port + ";User ID = " + myModule.UserID + ";Password = " + myModule.Password + ";Database = " + myModule.Database);
        iConnect.Open();
        NpgsqlCommand iQuery = new NpgsqlCommand("Select * from Table1");
        iQuery.Connection = iConnect;
        NpgsqlDataAdapter iAdapter = new NpgsqlDataAdapter(iQuery);
        DataSet iDataSet = new DataSet();
        iAdapter.Fill(iDataSet, "SET");

        myModule.dtSet = iDataSet;//pass the dataset to myModule.cs

然后,点击项目&gt;&gt; 添加课程&gt;&gt;并将其重命名为 myModule.cs

然后在类myModule

中添加以下代码
        //This is the code for the DATASET shared
        static DataSet strDataset;
        //this is the catcher of DATASET info request...
        public static DataSet dtSet
        {
           get { return strDataset; }
           set { strDataset = value; }
        }

现在,您将在第二个表单中使用传递的数据集。

    //MY SECOND FORM
    public Form2()
    {
        InitializeComponent();

        DataSet iDataSet = new DataSet();//set the instance of Dataset
        iDataSet = myModule.dtSet;       //get the data from myModule and pass it to iDataSet

    //now, you can use it here!
    }

就是这样,快乐的编码! ^ _ ^

答案 2 :(得分:0)

好的,我明白了。我从我的家庭表单错误地传递了DataSet。这是最终为我工作的代码。

在我的home(main)表单中,我创建了这样的构造函数:

public partial class frmHome : Form
{
    public frmHome(DataSet dsMain)
    {
        InitializeComponent();
    }

在我的 Program.cs 中,我做了以下事情:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    DataSet DS = new DataSet();
    Application.Run(new frmHome(DS));

这就是我打开类别表单的方式。 - 我需要从我的dsMain DataSet远程查看和管理表的表单 -

    frmCategory frmC = new frmCategory(dsMain);
    frmC.ShowDialog();

在我的分类表单中,我传递了我的家庭表单中声明的​​ dsMain ,我声明了一个新的公共DataSet ds2 并使其等于 dsMain

public partial class frmCategory : Form
{
    public DataSet ds2;
    public frmCategory(DataSet dsMain)
    {
        ds2 = dsMain;
        InitializeComponent();
    }

最后在我的表单加载事件中,我将 ds2 绑定到我的dataGridView,如下所示:

private void frmCategory_Load(object sender, EventArgs e)
{
    dgvCategory.DataSource = ds2;
    dgvCategory.DataMember = "Category";
    dgvCategory.Refresh();

它现在就像一个魅力。我现在可以从我的类别表单中查看,编辑和保存我的主DataSet。感谢@CharlesMighty的帮助,它帮助了很多。