【问题标题】:Share DataSet between Forms在表单之间共享数据集
【发布时间】:2014-07-15 01:44:26
【问题描述】:

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

我按照@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));
    }
}

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

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();
}

但是当类别表单加载我的datagridview时dgvCategory不显示类别表标题

【问题讨论】:

    标签: c# datagridview datatable dataset


    【解决方案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();
    }
    

    }

    【讨论】:

    • 这似乎不起作用。 Category 表是我的 dsMain 数据集中的第三个表,所以我尝试了 3"Category" 但没有任何区别。 private void frmCategory_Load(object sender, EventArgs e) { dgvCategory.DataSource = ds2.Tables[3]; dgvCategory.DataMember = "Category"; dgvCategory.Refresh(); }
    • 删除代码 dgvCategory.DataMember = "Category";
    【解决方案2】:

    这是我如何将Dataset 从一种形式传递到另一种形式的简单方法。我使用 Visual Studio 2012 C# WPFPostgreSQL 作为数据库。

            //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
    

    然后,点击Project>>Add Class>>并将其重命名为myModule.cs

    然后在class 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!
        }
    

    就是这样,编码愉快! ^_^

    【讨论】:

      【解决方案3】:

      好的,我想通了。我从我的家庭表单中错误地传递了数据集。这是最终为我工作的代码。

      在我的 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 数据集中远程查看和管理表的表单--

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

      在我的 Category 表单中,我通过了在我的 home 表单中声明的​​ dsMain,我声明了一个新的公共 DataSet ds2 并使其等于 dsMain em>。

      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();
      

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

      【讨论】:

        猜你喜欢
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-02
        • 2011-01-13
        相关资源
        最近更新 更多