【问题标题】:Datagridview and MVP layer in C# winformC# winform 中的 Datagridview 和 MVP 层
【发布时间】:2021-12-29 01:50:16
【问题描述】:

我正在尝试将数据库中的数据链接到 Datagridview。当我将 MVP 应用到我的项目时,出现了一些问题。请帮我解决这个问题。我已经分为 3 个文件夹(模型、视图、演示者)。它看起来像这样:

ConnectDB会通过查询连接数据库并获取数据:

namespace Doan.Model
{
    public class ConnectDB
    {
        SqlConnection connect;

        public ConnectDB()
        {
            this.connect = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=ComesticDB;Integrated Security=True");
        }

        public DataTable GetData(string sqlquery)
        {
            SqlDataAdapter sqldata = new SqlDataAdapter(sqlquery, this.connect);
            DataTable dataTable = new DataTable();
            sqldata.Fill(dataTable);
            return dataTable;
        }
    }
}

这是模型类:

public class Product
{
    public int Product_id;
    public string ProductName;
    public float Price;
    public string Unit;
    public string Description;
    public string Original;
    public int ProductType;

    public DataTable GetProductData()
    {
        ConnectDB connect = new ConnectDB();
        string sqlQuery = "select * from Product";
        return connect.GetData(sqlQuery);
    }
}

这是我的界面

public interface IProduct
{
    int ProductID { get; set; }
    string ProductName { get; set; }
    float Price { get; set; }
    string Unit { get; set; }
    string Description { get; set; }
    string Original { get; set; }
    string ProductType { get; set; }
    string message { get; set; }
    DataGridViewRowCollection gvData { get; }
}

这是演讲者:

public class ProductPresenter
{
    IProduct productview;
    Product product = new Product();

    public ProductPresenter(IProduct view)
    {
        productview = view;
    }

    public bool GetProduct()
    {
        foreach(DataRow row in product.GetProductData().Rows)
        {
            productview.gvData.Add(row);
        }

        return true;
    }
}

这是我在表单中所做的:

namespace Doan.View.Product
{
    public partial class ProductForm : Form, IProduct
    {
        public ProductForm()
        {
            InitializeComponent();
        }

        int IProduct.ProductID 
        { 
            get { return Int32.Parse(txtProductId.Text); } 
            set { txtProductId.Text = value.ToString(); }
        }

        string IProduct.ProductName 
        {
            get { return txtProductName.Text; }
            set { txtProductName.Text = value; } 
        }

        float IProduct.Price
        {
            get { return float.Parse(txtPrice.Text); }
            set { txtPrice.Text = value.ToString(); }
        }

        string IProduct.Unit
        {
            get { return cbUnit.Text; }
            set { cbUnit.Text = value; }
        }

        string IProduct.Description
        {
            get { return txtDescription.Text; }
            set { txtDescription.Text = value; }
        }

        string IProduct.Original
        {
            get { return txtOriginal.Text; }
            set { txtOriginal.Text = value; }
        }

        string IProduct.ProductType
        {
            get { return cbProductType.Text; }
            set { cbProductType.Text = value; }
        }

        private string _message;
        string IProduct.message
        {
            get { return _message; }
            set { _message = value; }
        }

        public DataGridViewRowCollection gvData 
        {
            get { return dtgvProduct.Rows; } 
        }

        private void ProductForm_Load(object sender, EventArgs e)
        {
            ProductPresenter productPresenter = new ProductPresenter(this);
            productPresenter.GetProduct();
        }
    }
}

这是我收到的

非常感谢!

【问题讨论】:

  • DataGridView 在哪里?是否有某些原因您没有将网格DataSource 设置为查询返回的DataTable?从图片上看,代码似乎试图将“整个”DataRow 添加到每行的第一个单元格,但这是一个猜测。
  • 我在Form代码中将数据设置为datagridview(public DataGridViewRowCollection gvData)
  • 而 dtgvProduct 是我的 Datagridview 的名称
  • ProductPresenter.GetProduct() 方法中……您是否尝试将网格DataSource 设置为从productGetProductData() 返回的DataTable? ... 示例... 而不是循环遍历 DataTable 的行并手动添加行... 执行类似... dtgvProduct.DataSource = product.GetProductData();
  • 我要指出的是,您的代码“似乎”是“手动”将 DataTable 中的行添加到网格行集合中,这不是必需的。通常,代码会设置网格DataSource,并且会自动创建行。这同样适用于列。如果您手动将列添加到网格中,可能在设计器中,那么您需要设置每列DataPropertyName 以匹配其DataSource 的列名称/属性名称。

标签: c# winforms interface mvp presenter


【解决方案1】:

您将如何在 ProductPresenter 类中保存返回的数据表?您需要先将数据表保存在 Datatable 中,然后运行查询。然后就可以使用foreach循环查看数据了。

public class ProductPresenter
    {
        IProduct productview;
        Product product = new Product();
        DataTable dt = new DataTable();
        dt = product.GetProductData();
        public ProductPresenter(IProduct view)
        {
            productview = view;
        }
        public bool GetProduct()
        {
            foreach(DataRow row in dt.Rows)
            {
                productview.gvData.Add(row);
            }
            return true;
        }
    }

您的 DataGridView 对象在哪里?您需要将 datagridview 对象的数据源分配给数据表,或者您可以添加行。我根据给定的细节回答了。

【讨论】:

  • 我在Form代码(public DataGridViewRowCollection gvData)中将数据设置为datagridview,dtgvProduct是DataGridview的名称。
  • 您是否将数据保存在另一个数据表中,该数据表是通过执行 GetData() 函数接收到的?
猜你喜欢
  • 2012-01-09
  • 2011-09-06
  • 1970-01-01
  • 2019-02-21
  • 2010-10-10
  • 2012-01-15
  • 1970-01-01
  • 2013-11-27
  • 2016-11-04
相关资源
最近更新 更多