簡體   English   中英

在Model-View-Presenter中使用DataGridView

[英]Using DataGridView in Model-View-Presenter

情況
我正在使用Model-View-Presenter結構設計Windows窗體應用程序。 這意味着每個Form后面都有一個Presenter-class,負責處理用戶輸入。 除此之外,我正在使用存儲庫結構,這意味着我希望將所有SQL查詢放在單獨的類中。
對於我的一種表單,我希望使用DataGridView來顯示數據庫中的某些數據。

我想要的是
用戶按下某個按鈕后,我希望從DataGridView中的數據庫中加載數據。 換句話說,我希望將DataGridView1.DataSource綁定到BindingSource,該BindingSource通過SQL查詢從數據庫中獲取數據。
但是,由於我的DataGridView是私有的,所以無法從演示者或存儲庫類訪問其數據源。

我的問題
綜上所述,我的問題是是否可以將BindingSource從存儲庫實例(完成SQL連接和查詢的地方)傳遞給我的演示者,再傳遞給我的WinForm,后者將使用它來填充DataGridView。
如果這不可能,是否有其他方法可以保持我的MVP和存儲庫結構,保持我的DataGridView私有並仍用數據庫數據填充它?

如果問題不清楚,請詢問詳細信息。 提前致謝!

找到了可行的解決方案。 對於那些感興趣的人:

綁定源的數據源是一個數據表。 使用執行SqlCommands的DataAdapter填充此DataTable。 可以將DataTable作為參數傳遞。 我這樣構造了演示者功能,當用戶按下按鈕時會調用該功能:

public void load_tableData()
    {
        FactuurRepository repository = new FactuurRepository();
        DataTable table = repository.getDataTable();
        screen.load_tableData(table);
    }

存儲庫函數getDataTable將如下所示:

try
        {
            String selectCommand = "Enter selectcommand here";
            String connectionString = "Enter connectionString here";
            SqlDataAdapter adapter = new SqlDataAdapter(selectCommand, connectionString);
            DataTable table = new DataTable();
            adapter.Fill(table);
            return table;
        }

最后,表單中的代碼如下所示:

public void load_tableData(DataTable table)
    {
        BindingSource binding = new BindingSource();
        binding.DataSource = table;
        dataGridView.DataSource = binding;
        dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
    }

實現MVP的方法有很多種,說一個是對的,另一個是錯是很愚蠢的。 但是,主要思想是您的View和Presenter僅通過界面彼此了解。 然后,這種松散的耦合使我們可以對表示層(有時是模型層)進行單元測試。

您實現的方式對於MVP來說看起來非常不錯,並且與我之前的MVP代碼看起來非常相似。 目前,我正在嘗試減少View中的代碼,並盡可能使MVP與MVVM更加相似。 這些天通常用於設置控制數據源,我只是公開一個簡單的屬性。 由於大多數網格都接受DataTable作為源,因此它可能看起來像這樣:

public Object CustomerGridDataSource
{
    get
    {
        return CustomerGrid.DataSource;
    }
    set (Object value)
    {
        CustomerGrid.DataSource = value;
    }
}

當然,仍然需要配置網格列和其他接口任務,但是即使如此,我也已經從View移出了可以處理常見配置步驟的類的配置系統。

無論如何,請為您的解決方案做好工作。 我只是想在討論中添加一些其他想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM