【问题标题】:How to pass DataTable from one class to the other class如何将 DataTable 从一个类传递到另一类
【发布时间】:2012-01-01 20:53:37
【问题描述】:

目前我正在学习 MySQL,对不起我的新手问题。这是我的问题

我有 2 个类,第一个是 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 窗体部分?

如果必须是windows窗体,如何将现在保存所有数据的dataTable丢给windows窗体类?

非常感谢您帮助我。如果我的问题听起来很荒谬,尽管问我。

【问题讨论】:

    标签: c# mysql datagridview


    【解决方案1】:

    您可以使用DataGrid DataSource 属性。

    示例代码演示想法:

    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类的第二部分?
    • 是的,MyForm 是您的 Form 类,DataAccess 是您的数据访问层。
    • 非常感谢大家...顺便说一句,为什么我的 SampleQuery 带有红色下划线,并显示“并非所有路径代码都返回值”?
    • 可能是因为你返回的是内部 if 语句 => 你应该返回外部 if。
    • 是的,我已经尝试过了,但是返回的 dataTable 说的是,使用未分配的变量。但在顶部我已经声明了它。
    【解决方案2】:

    让您的SampleQuery 方法返回dataTable

    public DataTable SampleQuery(string tablename) {
        // Fill dataTable...
        return dataTable
    }
    

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

    dataGridView.DataSource = SampleQuery("MyTable");
    

    【讨论】:

      【解决方案3】:

      在这种情况下,您将更改方法以返回 DataTable 而不是什么都没有(void),并以

      return dataTable;
      

      然后当你调用它时捕获它:

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

      我个人建议使用基于类的对象而不是 DataTable,但 DataTable 可以。

      【讨论】:

        【解决方案4】:

        指定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");
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • datagridview 是否应该使用 ("tablename") 调用示例查询?因为 tablename 只是 dataTable 中内容已经存在的表的名称
          猜你喜欢
          • 2013-03-16
          • 1970-01-01
          • 1970-01-01
          • 2014-01-03
          • 2015-07-04
          • 2019-10-15
          • 2017-10-30
          • 1970-01-01
          相关资源
          最近更新 更多