【发布时间】: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