如何在MVP模式中使用模型填充数据网格视图

4
在一个win窗体应用程序中,界面中有一个网格视图需要显示客户的分支机构详情。大约有50个分支机构。所以DataService类中的GetBranchDetails()方法返回一个DataSet对象,而Presenter类将该DataSet传递给UI的BindData()方法,在该方法中,网格视图的datasource属性被设置为该DataSet对象,如代码所示。
问题是DataService没有返回模型,而是返回DataSet。能否告诉我如何在此处使用BranchOffice模型,而不是使用DataSet?因此Model应从DataService返回,然后presenter将传递该Model到UI,在那里Model将作为网格视图的datasource设置。请注意,总会有多个分支机构! DataService类:
        public DataTable GetBranchDetails()
        {
            string selectStatement = "SELECT ID, branch_name + ', ' + branch_add AS Branch,       area, sm, atten_status FROM Branch WHERE Status='Active'";
            using (SqlConnection sqlConnection = new   SqlConnection(db.GetConnectionString))
            using (SqlCommand sqlCommand = new SqlCommand(selectStatement, sqlConnection))
            using (SqlDataAdapter da = new SqlDataAdapter(sqlCommand))
            using (DataSet ds = new DataSet())
            using (DataTable dt = new DataTable())
           {
              ds.Tables.Add(dt);    
              sqlConnection.Open();
              da.Fill(dt);
              return dt;
           }
        }

Presenter Class

private void _View_ShowBranches(object sender, EventArgs e)
{
    ShowBranches();
}

private void ShowBranches()
{
    var dt = DataService.GetBranchDetails();
    this._View.BindData(dt);
}

视图 / 用户界面

public partial class frmAttendancePoints : Form, IView
{
    public frmAttendancePoints()
    {
        InitializeComponents();
    }

    public void BindData(DataSet dt)
    {
        dgAttendancePoints.DataSource = dt;
    }
}

你的 Json 有用吗? - Yakov R.
我还没有尝试过Json,因为我完全不熟悉它。但实际上,既然这是一个C# Win表单应用程序,那么相对于返回ado.net DataSet,它是否是更好的解决方案呢? - CAD
1个回答

1
使用此方法将 ADO.NET DataTable 转换为可以在 MVP 视图中呈现的 JSON:
 string GetJson(DataTable table)
    {
        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        Dictionary<string, object> row = null;
        foreach (DataRow dataRow in table.Rows)
        {
            row = new Dictionary<string, object>();
            foreach (DataColumn column in table.Columns)
            {
                row.Add(column.ColumnName.Trim(), dataRow[column]);
            }
            rows.Add(row);
        }
        return serializer.Serialize(rows);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接