如何将 DataTable 从一个类传递到另一个类?

3

目前我正在学习MySQL,抱歉我的问题有点基础。以下是我的问题:

我有两个类,第一个是Windows窗体,另一个只是一个类,我希望它包含所有来自SQL的过程。这是我在SQL类中的代码:

public void SampleQuery(string tablename)
    {
        DataTable dataTable;

        string query = "SELECT * FROM " + tablename;

        //Open connection
        if (this.OpenConnection() == true)
        {
            adapter = new MySqlDataAdapter(query,connection);

            dataTable =  new DataTable();
            adapter.Fill(dataTable);

            //close Connection
            this.CloseConnection();
            return;
        }

我想要做的是用DataGridView显示来自SQL的数据。 是否可以在SQL类中编写datagridview?还是必须在Windows Form部分编写?
如果必须在Windows Form中编写,那么如何将现在保存所有数据的dataTable传递给Windows Form类?
非常感谢您的帮助。如果我的问题听起来很荒谬,请问我。
5个回答

2
你可以使用 DataGridDataSource 属性。
示例代码演示了这个想法:
class MyForm : Form
{
   public MyForm()
   {
      InitializeComponent();
      DataAccess  dataAccess = new DataAccess();
      m_dataGrid.DataSource = DataAccess.SampleQuery("MyTable");
   }
}

class DataAccess 
{
   public DataTable SampleQuery(string tablename)
   {
      DataTable dataTable;
      // 
      // Your Code
      // ..
      return dataTable;
   }
}

我认为Form Load事件处理程序是加载数据的好地方(而不是构造函数;)如我上面所示。您还可以实现一些缓存(每次打开表单时都加载数据表不是很有效:))

第一部分是在类形式中吗?第二部分是在 SQL 类中吗? - Reza
是的,MyForm 是您的表单类,DataAccess 是您的数据访问层。 - Kamil Lach
谢谢大家...顺便问一下,为什么我的SampleQuery下面有红色波浪线,并且显示“并非所有路径代码都返回一个值”呢? - Reza
可能是因为你的返回语句在if语句内部 => 你应该在if外部返回。 - Kamil Lach
是的,我已经尝试过了,但返回的dataTable显示类似于“未分配变量的使用”。但是在顶部我已经声明了它。 - Reza
数据访问是一个类(或一组类),它直接与您的数据存储(数据库)通信,您的UI与该类通信而不是直接与数据库通信。例如,当您更改数据库引擎时(仅在DAL类内部更改代码),UI保持不变。 - Kamil Lach

1
让你的SampleQuery方法返回dataTable:
public DataTable SampleQuery(string tablename) {
    // Fill dataTable...
    return dataTable
}

然后在您的表单中调用该方法,并将 dataTable 绑定到 dataGridView

dataGridView.DataSource = SampleQuery("MyTable");

1
在这种情况下,您应该将方法更改为返回 DataTable 而不是空值 (void),并以此结束。
return dataTable;

然后在调用时捕捉它:

DataGridView.BindingSource = yourDal.SimpleQuery("Foo");

个人建议使用基于类的对象,而不是 DataTable,但 DataTable 也能够胜任。

1
请指定 DataTableSampleQuery 方法的返回类型。
//Instance method
public class Test
{
 public DataTable SampleQuery(string tablename)
 {
    DataTable dataTable=null;
    ....
    return dataTable;
 }
//or design a static method
 public static DataTable StaticSampleQuery(string tablename)
 {
    DataTable dataTable=null;
    ....
    return dataTable;
 }
}

在 Winform 中,使用静态或实例方法。
//Instance method
Test obj=new Test();
dataGridView1.Datasource=obj.SampleQuery("tableName");

//Static method
dataGridView1.Datasource=Test.StaticSampleQuery("tableName");

1

从sqlclass返回Datatable,并将该Datatable分配为网格的数据源

     public DataTable SampleQuery(string tablename)
            {
                DataTable dataTable;

                string query = "SELECT * FROM " + tablename;

                //Open connection
                if (this.OpenConnection() == true)
                {
                    adapter = new MySqlDataAdapter(query,connection);

                    dataTable =  new DataTable();
                    adapter.Fill(dataTable);

                    //close Connection
                    this.CloseConnection();
                    return dataTable;
                }
              return dataTable;
            }

将数据表分配为数据源

dataGridView.DataSource = SampleQuery("tablename");

数据网格视图是否应该使用("表名")调用示例查询?因为表名只是已经在数据表中的表的名称。 - Reza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接