Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
わんくま同盟東京勉強会 #3
えムナウ (児玉宏之)
“delegate+generics”汎用化による量産の技術(俺流なので要注意!!!)
http://mnow.wankuma.com/
http://blogs.wankuma.com/mnow/
http://www.ailight.jp/blog/mnow/
わんくま同盟東京勉強会 #3
アジェンダ
• データベースとADO.NET
• ラッパーカスタムコントロールのすすめ
• 画面要素のユーザーコントロール化
• 3段継承
• Genericで汎用化
• コントローラを作成してMVCパターン化
• Delegateを使おう
わんくま同盟東京勉強会 #3
データベースとADO.NET
• SQLサーバーならJOINやCASE WHENやサブクエリーは当たり前。
• ビューを元にユーザーと表示イメージや印刷イメージを固められるほどにつめる。
わんくま同盟東京勉強会 #3
データベースとADO.NET
• ストアドプロシージャを作る
• Fillは中心となるテーブルのAdd/Update/Deleteを考慮
• VIEWの表示項目を網羅して手間が少なく
• 用意するストアドの例
Fill/ Add/Update/Delete
GetByKeys/Search
わんくま同盟東京勉強会 #3
データベースとADO.NET
• メソッドの例
void FillTable(DataTable table);
void UpdateTable(DataTable table);
void FillTableByKeys(DataTable table,
DataTableKeys keys);
DataTableKeys GetKeys(DataRow row);
void FillTableBySearch(DataTable table,
SearchCondition condition);
わんくま同盟東京勉強会 #3
データベースとADO.NET
• TableAdapterをFormのContainerに参加させる。
• TableAdapterは partial class で拡張する
• TableAdapterの資源をDisposeする
• StoredProcedure の戻り値を取得する
• CommandTimeout を指定する
http://mnow.wankuma.com/cs2005_mnow
control3.html
わんくま同盟東京勉強会 #3
ラッパーコントロールのすすめ
• 使用するコントロールはラッパーを作って、
それを使用すると一括で変更できて便利
• Enter時に背景色
を変える。
• エラーが発生して
いたら背景色を赤
にする
わんくま同盟東京勉強会 #3
カスタムコントロールのすすめ
• 例:データベース参照のコンボボックス
• インスタンスを一つだけ作るシングルトンパターンでデータセットを作成する。
• データベースの読み込みはDesignModeがfalseのときだけにしよう。
• DesignModeが有効になるのはInitLayout()
かISupportInitializeのEndInit()がおすすめ。
ソースを見ましょう。
わんくま同盟東京勉強会 #3
画面要素のユーザーコントロール化
• 画面で一般的に何をしますか?
• 検索一覧詳細のパターンは多いでしょうか?
• 検索と一覧と詳細を一つ一つユーザーコントロールにしましょう。
• 検索一覧詳細の入力Formだけではなく、一覧選択Form・コードと名称から詳細Fromを見れたり応用が効きます。
わんくま同盟東京勉強会 #3
画面要素のユーザーコントロール化
• 検索一覧詳細の入力画面でも別々の3画面でも使うユーザーコントロールは一緒です。
• 検索一覧詳細の入力画面ではデータセットのインスタンスは共通で使えます。
• 別々の3画面ではデータセットのインスタンスは別に用意でします。もちろん詳細は一レコードだけ読み込みます。
デモを見ましょう。
わんくま同盟東京勉強会 #3
3段継承
• FormやUserControlを継承し元になるクラスを作成し共通部分を書きます。
• 元になるクラスを継承したクラスを作成し目的の機能をすべて実装したFormやUserControlを作成します。
• 目的の機能を持ったFormやUserControlを継承してBindingSource、DataSet、TableAdapterを配置した実際に使うFormやUserControlを作成します。
わんくま同盟東京勉強会 #3
コントローラを作成してMVCパターン化
• MVC(Model-View-Controller)
• Modelはデータのことです。データを変更するビジネスルールも含みます。
• Viewはユーザにどのように見えるのかつまり画面のことです。
• Controllerはアプリケーションの制御を行います。 ViewとModelの橋渡しをするだけではなく、ViewとViewの橋渡しも担当します。
わんくま同盟東京勉強会 #3
コントローラを作成してMVCパターン化
• 画面はバインドする為にBindingSource、DataSet、TableAdapterを持ちます。
• このMVCパターンではデータを扱う処理はModelに書きますが、データそのものはView
に含まれています。
• Visual Studioの環境を便利に使って画面を作成するにはデータそのものはViewに含めたほうがいいからです。
わんくま同盟東京勉強会 #3
コントローラをGenericで汎用化
public class DetailBaseController<DS, DT, DR>
where DS : DataSet
where DT : DataTable
where DR : DataRow
• こんな定義をします、DS, DT, DRと仮に名前付けて実体を定義するときにDSはDataSet、DTはDataTable、 DRはDataRowを継承したものを当てはめてください、という意味合いです。
わんくま同盟東京勉強会 #3
コントローラをGenericで汎用化
• DSという仮の型で定義されたものはDataSet
で定義されている機能はすべて使えます。
• DetailBaseControllerというクラスではDSという型でDataSetの機能を使っておいて、継承したクラスで実際の型をあてはめればDetailBaseController側でDSに対してつかった機能は、継承したクラスで実際の型で使ったのと同じことになります。
わんくま同盟東京勉強会 #3
コントローラをGenericで汎用化
public class ユーザーDetailController :
DetailBaseController
<ユーザーDataSet,ユーザーDataTable,
ユーザー DataRow>
• こんな定義をするとユーザーDetailController
はDetailBaseController側でDSに対してつかった機能は、継承したクラスでユーザーDataSetで使ったのと同じことになります。
わんくま同盟東京勉強会 #3
コントローラをGenericで汎用化
• つまり、 Genericを使って抽象化や汎用化ができるようになります。
• これでいろんなものが抽象化できてGeneric
を使えばコントローラを作成でき、ばんばいざいですよね。
• じゃ作ることを考えてみましょう。
わんくま同盟東京勉強会 #3
コントローラをGenericで汎用化
• コントローラはBindingSource、DataSet、TableAdapterの情報を理解する必要があります。
• BindingSourceはBindingSourceクラス
• 型付きDataSetの基底クラスはDataSet
• ではTableAdapterの基底クラスは何でしょう?
わんくま同盟東京勉強会 #3
Delegateを使おう
• はい、答えはComponentです。System.ComponentModel.Component
• TableAdapterはComponentModelから踏み外していることが一部で有名ですが、さらにひどいのはTableAdapterの特徴を説明する基底クラスを用意していないところです。
• つまり基底クラスのルールは守らないくせに基底クラスとしてルール付けして欲しいところはサポートしない、めちゃくちゃなやつです。
わんくま同盟東京勉強会 #3
Delegateを使おう
• そこで出番はdelegateです。
public delegate void
FillDelegate(DataTable table);
public delegate void
UpdateDelegate(DataTable table);
わんくま同盟東京勉強会 #3
Delegateを使おう
• Delegateって使ったことありますか?
• Delegateは簡単に言うとメソッドのポインタと考えてください。
• 定義してあるメソッドをDelegateを介して呼んでやります。
わんくま同盟東京勉強会 #3
Delegateを使おう
• イベントハンドラもデリゲートです。
private void xxx_Click(object sender,
EventArgs e)
public event EventHandler Click
public delegate void EventHandler ( Object
sender, EventArgs e )
わんくま同盟東京勉強会 #3
Delegateを使おう
public delegate void UpdateDelegate(DataTable table);
private UpdateDelegate _update;
public UpdateDelegate Update
{
get { return _update; }
set { _update = value; }
}
Update(DataTable);