[英]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.