如何连接适配器从视图到模型在MVP

本文关键字:视图 模型 MVP 适配器 何连接 连接 | 更新日期: 2023-09-27 18:04:10

我不知道该怎么做。我有点困惑,在我的项目c# winforms我使用MVP模式桌面应用程序。

我有datagridview,其中我显示产品gorup。选择产品组的数据库查询存储在模型中,选择方法返回DataTable。接下来,演示者调用该模型函数进行选择并将其传递给视图。考虑到我把DataTable放在BindingSource和gridview中作为数据源传递绑定源。

这个工作很好,但是当我尝试在网格中添加新行并尝试保存新行时怎么办?

如果我想编辑现有行并将该记录更新到数据库。

如果我想从数据库中create/update记录,我需要访问适配器并调用update。问题是因为我的适配器在model而不是在view

我不知道如何从视图访问适配器和数据集到模型。

检查我的代码选择:

模型:

public DataTable SelectAll()
{
            using (MySqlConnection conn = new MySqlConnection(Properties.Settings.Default.ConnectionString))
            {
                try
                {
                    conn.Open();
                    string query = "SELECT Naziv, Opis FROM grupe";
                    using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn))
                    {
                        dt = new DataTable();
                        ds = new DataSet();
                        adapter.Fill(ds, "grupe");
                        dt = ds.Tables["grupe"];
                    }
                    conn.Close();
                }
                catch(MySqlException ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
           return dt;
        }

推荐者:

public DataTable SelectAll()
{
    return _model.SelectAll();
}

视图:

private void GrupeArtikala_Load(object sender, EventArgs e)
{
    bs = new BindingSource();
    bs.DataSource = _presenter.SelectAll();
    groupDataGridView.DataSource = bs;     
}

所以现在当我想保存更改到数据库,我需要访问模型数据库适配器,但我不知道如何。

private void saveToolStripButton_Click(object sender, EventArgs e)
{
    changes = ds.GetChanges(); // DatSet changes is in model but i must access here but dont know how
    if (changes != null)
    {
        int updatedRows = dataAdapter.Update(changes); // Adapter is in model and i need him here 
        ds.AcceptChanges();
    }
}

我不知道如何将此连接到模型,以避免在视图表单中混合数据库查询。

任何人都可以给我示范一下。

如何连接适配器从视图到模型在MVP

如果我理解正确,您需要调用属于您的模型的对象上的函数,但您不希望您的视图有对您的模型的引用。对吗?如果是这样,您可以遵循使用SelectAll函数的模式:

bs.DataSource = _presenter.SelectAll();

您正在呼叫_presenter。在视图中SelectAll,但最终从模型中获取返回值。调用ds。你可以给你的演示器添加一个GetDataSetChanges函数:

public DataSet GetDataSetChanges()
{
  return _model.GetDataSetChanges();
}

在适配器上调用update也是同样的事情。给演示器添加一个函数:

public int UpdateAdapter(DataSet dataSet)
{
  return _model.UpdateAdapter(dataSet);
}