C# 继承数据表对象

C# 继承数据表对象,c#,class,object,inheritance,C#,Class,Object,Inheritance,我正在研究一个C#解决方案,我有一个表单,我正在填充我的txtboxs,使用一个DataTable对象,然后从行号中检索信息,问题是,我有导航按钮,下一个和上一个,我注意到当我调用我的函数PopulateView()时;按下此按钮后,我重新进行DB连接、SQLite查询和datatable填充 我感到惭愧,但是,我真的不知道应该把这个函数放在什么地方,这样我的其他函数才能接收这些对象 我的代码: namespace X_Project{ public partial class Cad_Prod

我正在研究一个C#解决方案,我有一个表单,我正在填充我的txtboxs,使用一个DataTable对象,然后从行号中检索信息,问题是,我有导航按钮,下一个和上一个,我注意到当我调用我的函数PopulateView()时;按下此按钮后,我重新进行DB连接、SQLite查询和datatable填充

我感到惭愧,但是,我真的不知道应该把这个函数放在什么地方,这样我的其他函数才能接收这些对象

我的代码:

namespace X_Project{
public partial class Cad_Prod : Form
{
    System.Data.SQLite.SQLiteConnection conn1 = new System.Data.SQLite.SQLiteConnection("data source=X.s3db");
    int prodstart = 0;
    public Cad_Prod()
    {
        InitializeComponent();
    }

    public void Cad_Prod_Load(object sender, EventArgs e)
    {

    }

    private void PopulateView()
    {
        string query = "SELECT * FROM Cad_Prod";
        string query2 = "SELECT * FROM Cat";
        try
        {
            using (SQLiteCommand comm = new SQLiteCommand(query, conn1))
            using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(comm))
            using (SQLiteCommand comm2 = new SQLiteCommand(query2, conn1))
            using (SQLiteDataAdapter adapter2 = new SQLiteDataAdapter(comm2))
            {
                conn1.Open();
                DataTable produtos = new DataTable();
                adapter.Fill(produtos);
                DataTable categoria = new DataTable();
                adapter2.Fill(categoria);

                int auxCat = int.Parse(produtos.Rows[prodstart].ItemArray[4].ToString()) - 1;

                txtProdutoNome.Text = produtos.Rows[prodstart].ItemArray[1].ToString();
                txtProdutoPreco.Text = produtos.Rows[prodstart].ItemArray[2].ToString();
                txtProdutoQtd.Text = produtos.Rows[prodstart].ItemArray[3].ToString();
                cbbCategoria.Text = categoria.Rows[auxCat].ItemArray[1].ToString();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void btnAvancar_Click(object sender, EventArgs e)
    {
        prodstart = prodstart + 1;
        PopulateView();
    }

    private void btnVoltar_Click(object sender, EventArgs e)
    {
        prodstart = prodstart - 1;
        PopulateView();
    }
}
上面的代码可以工作,但不是我想要的方式,我真正想做的是:

namespace X_Project\
{

public partial class Cad_Prod : Form
    {

    System.Data.SQLite.SQLiteConnection conn1 = new System.Data.SQLite.SQLiteConnection("data source=X.s3db");
    int prodstart = 0;
    public Cad_Prod()
    {
        InitializeComponent();
    }

    public void Cad_Prod_Load(object sender, EventArgs e)
    {

        string query = "SELECT * FROM Cad_Prod";
        string query2 = "SELECT * FROM Cat";
        try
        {
            using (SQLiteCommand comm = new SQLiteCommand(query, conn1))
            using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(comm))
            using (SQLiteCommand comm2 = new SQLiteCommand(query2, conn1))
            using (SQLiteDataAdapter adapter2 = new SQLiteDataAdapter(comm2))
                {
                conn1.Open();
                DataTable produtos = new DataTable();
                adapter.Fill(produtos); // I would like this to be inherited
                DataTable categoria = new DataTable();
                adapter2.Fill(categoria); // I would like this to be inherited
                }
        }
        catch (Exception ex)
        {
            MessageBox.Show(this, ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    private void PopulateView()
    {


                int auxCat = int.Parse(produtos.Rows[prodstart].ItemArray[4].ToString()) - 1;

                txtProdutoNome.Text = produtos.Rows[prodstart].ItemArray[1].ToString();
                txtProdutoPreco.Text = produtos.Rows[prodstart].ItemArray[2].ToString();
                txtProdutoQtd.Text = produtos.Rows[prodstart].ItemArray[3].ToString();
                cbbCategoria.Text = categoria.Rows[auxCat].ItemArray[1].ToString();

    }

    private void btnAvancar_Click(object sender, EventArgs e)
    {
        prodstart = prodstart + 1;
        PopulateView();
    }

    private void btnVoltar_Click(object sender, EventArgs e)
    {
        prodstart = prodstart - 1;
        PopulateView();
    }
}

将数据表放在使用“惰性初始值设定项”模式的表单级属性变量中,也就是说,在其中对它们进行编码,以便它们只调用数据库一次,并在第一次使用数据表填充静态私有变量;每次连续调用只读取私有变量并跳过数据库调用

public partial class Cad_Prod : Form
{
   private static readonly SQLiteConnection conn1 =
         new SQLiteConnection(("data source=X.s3db");
   private static DataTable produtos;
   private static DataTable produtos;
   private static DataTable AutoDataTable => 
      produtos?? (produtos = GetAutos());           
   private static DataTable CategoryDataTable => 
      categoria ?? (categoria = GetCategories());            

   int prodstart = 0;
   public Cad_Prod() { InitializeComponent(); }

   public void Cad_Prod_Load(object sender, EventArgs e)  {  }
   private static DataTable GetAutos()
   {
      string query = "SELECT * FROM Cad_Prod";
      try
      {
          using (SQLiteCommand comm = new SQLiteCommand(query, conn1))
          using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(comm))
          {
            conn1.Open();
            DataTable produtos = new DataTable();
            adapter.Fill(produtos); 
            return produtos;
          }
      }
      catch (Exception ex)
      {
          MessageBox.Show(this, ex.Message, "Erro", 
          MessageBoxButtons.OK, MessageBoxIcon.Error);
          throw;
      }
   }
   private static DataTable GetCategories()
   {
      string query2 = "SELECT * FROM Cat";
      try
      {
         using (SQLiteCommand comm2 = new SQLiteCommand(query2, conn1))
         using (SQLiteDataAdapter adapter2 = new SQLiteDataAdapter(comm2))
            {
            conn1.Open();
            DataTable categoria = new DataTable();
            adapter2.Fill(categoria);
            return categoria;
            }
      }
      catch (Exception ex)
      {
          MessageBox.Show(this, ex.Message, "Erro", 
          MessageBoxButtons.OK, MessageBoxIcon.Error);
          throw;
      }
  }

  private void PopulateView()
  {
     int auxCat = int.Parse(produtos.Rows[prodstart]
            .ItemArray[4].ToString()) - 1;

     txtProdutoNome.Text = produtos.Rows[prodstart]
            .ItemArray[1].ToString();
     txtProdutoPreco.Text = produtos.Rows[prodstart]
            .ItemArray[2].ToString();
     txtProdutoQtd.Text = produtos.Rows[prodstart]
            .ItemArray[3].ToString();
     cbbCategoria.Text = categoria.Rows[auxCat]
            .ItemArray[1].ToString();
  }

  private void btnAvancar_Click(object sender, EventArgs e)
  {
    prodstart = prodstart + 1;
    PopulateView();
  }

  private void btnVoltar_Click(object sender, EventArgs e)
  {
    prodstart = prodstart - 1;
    PopulateView();
  }
}

嘿,查尔斯,我对C#很陌生,但我相信你给我的代码有一些错误,你能复习一下你的答案吗?另外,我在GetCategories和GetAutos中收到错误,首先是在私有静态DataTable CategorityDataTable=>categoria??(categoria=GetCategories());visual studio表示,非静态。。。。在私有数据表GetAutos()或GetCategories()中;catch不返回任何值,c#希望我返回某种类型的datatable。再次感谢