GridView、およびそれを使用するもの(パート2、大)

最後の入門編では、フォームに表形式の情報を表示することを目的としたGridView要素に慣れていない人を紹介しました。 私は、GridView(便宜上、この要素をどこでもgridviewと呼びます)をデータソースに関連付けることができるという事実について話しました。 ソースにはいくつかの種類があります。 私の例では、ObjectDataSourceはソースとしてどこでも使用されます。







したがって、先ほど言ったように、ObjectDataSourceを使用します。 この部分は彼に捧げられます。 以下では、データを返すメソッドを定義し、将来視覚環境から開発するときに役立つshtriksを追加し、すべての手順を繰り返しますが、今回は分離コードページを使用します。



開発にVS 2008を使用することに同意し、スタジオを開き、ASP.NET WebSiteなどの新しいプロジェクトを作成します。開発言語はC#です。 Default.aspxページを分割モードまたはデザインモードで開きます。 gridviewの形式でスローします。 グリッドビューの右上隅にある矢印をクリックし、データソース-新しいデータソースを選択します。 ソースタイプはオブジェクトです。 さらに進んで、ビジネスオブジェクトを選択するように求められるフォームを確認します。 画像

オブジェクトがまだないため、何も選択できません。 したがって、私たちはビジネス施設を作り始めます。



将来のオブジェクトの開発を加速するには、抽象クラスを作成します。 このクラスには、クラスのすべての祖先に共通の少なくとも2つのパブリックメソッドが含まれます。 最初-Selectと呼びましょう-オブジェクトの配列を返します。2番目-SelectCountと呼び-要求を満たすすべての要素の数を返します。 伝播を忘れないため、Selectメソッドの必須パラメーターとして、2つの入力パラメーターint maximumRows、int startRowIndexを示します。 これらのデフォルト名は、選択する行の数と選択を開始するインデックスをメソッドに渡すためにObjectDataSourceによって使用されます。 SelectCountメソッドの場合、パラメーターはまだ指定されていません。



[System.ComponentModel.DataObject]

public abstract class BusinessObject<T>

{

protected T[] _objs;

private int maximumRows, startRowIndex;



[System.ComponentModel.DataObjectMethodAttribute

(System.ComponentModel.DataObjectMethodType.Select, true )]

public virtual T[] Select( int maximumRows, int startRowIndex)

{

this .maximumRows = maximumRows;

this .startRowIndex = startRowIndex;



List <T> arr = new List <T>();

int to = startRowIndex + maximumRows;

if (to > _objs.Length)

to = _objs.Length;

for ( int i = startRowIndex; i < to; i++)

{

arr.Add(_objs[i]);

}

return arr.ToArray();

}



public int SelectCount()

{

return _objs.Length;

}

}



* This source code was highlighted with Source Code Highlighter .






クラスをより詳細に検討してください。 クラス名の後にあるものは説明しません。 知らない人はジェネリックについてグーグルで検索できます。 型Tの配列変数_objsはクラス内で宣言されていますが、デフォルトでは、相続人の各クラス内に、指定した型を含む変数があることがわかります(以下を参照)。 クラス見出しの属性とSelectメソッドがなぜ必要なのかは説明しませんが、それらがコードに影響を与えることはないと言うことしかできず、それらなしで行うことはかなり可能です。

Selectメソッドを仮想化して、後継クラスで再定義できるようにします。 SelectCountメソッドは、Selectメソッドの要素の総数を返します。 私のプロジェクトでは、オブジェクトの配列を返すselectごとに、レコードの数を返すメソッドがあることに同意しました。 このメソッドの名前は、常にselectメソッドの名前とサフィックスCountで構成されます。 つまり SelectByIdメソッドがある場合、そのためのSelectByIdCountメソッドが必要です。 SelectByIdメソッドの場合、要素の数を返す必要はありません。なぜなら、このメソッドは常に1つの要素のみを返すからです。 したがって、この場合、SelectByIdCountメソッドを定義しない場合があります。



先に進み、抽象的なBusinesObjectクラスに基づいてビジネスクラスを作成します。



[System.ComponentModel.DataObject]

public class SimpleBusinesObject:BusinessObject<Person>

{

private int cnt = 0;



public SimpleBusinesObject()

{

List <Person> p = new List <Person>();

for ( int i = 0; i < 24; i++)

{

p.Add( new Person( "John " + i.ToString(), i, "Lenina str., " + i.ToString()));

}

p.Add( new Person( "Misha" , "123-4567" , "Kremlin" ));

_objs = p.ToArray();

}



[System.ComponentModel.DataObjectMethodAttribute

(System.ComponentModel.DataObjectMethodType.Select, false )]

public Person[] SelectByName( int maximumRows, int startRowIndex, String name)

{

List <Person> p = new List <Person>();

for ( int i = 0; i < _objs.Length; i++)

{

if (_objs[i].Name.IndexOf(name))

p.Add(_objs[i]);

}

cnt = p.Count;

return p.GetRange(startRowIndex, maximumRows).ToArray();

}



public int SelectByNameCount( String name)

{

return cnt;

}

}




* This source code was highlighted with Source Code Highlighter .








人物クラス:



public class Person

{

private String _name;

private String _phone;

private String _address;



public String Name

{

get { return _name; }

set { _name = value ; }

}



public String Phone

{

get { return _phone; }

set { _phone = value ; }

}



public String Address

{

get { return _address; }

set { _address = value ; }

}



public Person()

{

_name = "No Name" ;

_phone = "555-5555" ;

_address = " " ;

}



public Person( String name, String phone, String address)

{

_name = name;

_phone = phone;

_address = address;

}

}



* This source code was highlighted with Source Code Highlighter .






これで、default.aspxページを実行できます



画像

スクリーンショットでわかるように、作成したSimpleBusinessObjectビジネスオブジェクトを選択できます。 ビジネスオブジェクトを選択したリストの右側には、データコンポーネントのみを表示するチェックマークがあります。 それは何ですか、なぜ必要なのですか。 これから説明します。 クラスに指定した属性[System.ComponentModel.DataObject]を思い出してください。 この属性を使用して、データにアクセスするために使用するクラスをマークします。 想像してみて。 プロジェクトで100以上の異なるクラスが定義されている場合、必要なオブジェクトを見つけるのは困難です。 また、この属性とチェックマークの使用は、それらのクラスによってのみ除外されます。 必要なもの。 次のフォームでは、ビジネスオブジェクトを選択した後、選択に使用するメソッドを選択するよう求められます。 ここでは、[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select、true)]属性が再び役立ちます。

これでメソッドをマークします。 返されるデータ。 結局、trueであることがわかります。これは、このメソッドがメソッドのリストですぐに選択されることを意味します。 したがって、他のメソッドよりも頻繁に使用されるメソッドの1つをtrueに設定することは理にかなっています。 したがって、Selectメソッドの場合はtrue、SelectByNameメソッドの場合はfalseです。 したがって、リストの最初のメソッドを選択し、さらに進んで、パラメーターのリストがあることがわかります。 ここでは、まだ何も変更せず、pimpuを押して準備ができています。 生成されたhtmlコードを見てください:

< asp:GridView ID ="GridView1"

runat ="server"

AllowPaging ="True"

PageSize ="10"

AutoGenerateColumns ="False"

DataSourceID ="ObjectDataSource1" >

< Columns >

< asp:BoundField DataField ="Name" HeaderText ="Name" SortExpression ="Name" />

< asp:BoundField DataField ="Phone" HeaderText ="Phone" SortExpression ="Phone" />

< asp:BoundField DataField ="Address" HeaderText ="Address"

SortExpression ="Address" />

</ Columns >

</ asp:GridView >



< asp:ObjectDataSource ID ="ObjectDataSource1" runat ="server"

SelectMethod ="Select"

SelectCountMethod ="SelectCount"

EnablePaging ="true"

TypeName ="SimpleBusinesObject" >

</ asp:ObjectDataSource >



* This source code was highlighted with Source Code Highlighter .






必要なものはすべてここで調整し、ページングを整理しました。 手動で作成したページングが必要な場合(asp.netを使用して必要な要素をフィルタリングすることなく、必要なものと必要な量を選択します)、ObjectDataSourceからすべてのパラメーターをスローします(より正確には、すべてではありません)ただし、maximumRowsとstartRowIndexの2つだけです!) これは非常に重要なポイントです。 ここには、あらゆる種類の問題、脳の除去などがたくさんあります。 もう一度、私は注意します:



ページングが手動で構成されている場合:



プロジェクトを立ち上げ、すべてがうまく機能することを確認します。



ここで、名前に特定の部分文字列がある人のリストのみを表示します



< asp:GridView ID ="GridView2" runat ="server"

AllowPaging ="True"

PageSize ="10"

AutoGenerateColumns ="False"

DataSourceID ="ObjectDataSource2" >

< Columns >

< asp:BoundField DataField ="Name" HeaderText ="Name" SortExpression ="Name" />

< asp:BoundField DataField ="Phone" HeaderText ="Phone" SortExpression ="Phone" />

< asp:BoundField DataField ="Address" HeaderText ="Address"

SortExpression ="Address" />

</ Columns >

</ asp:GridView >

< asp:ObjectDataSource ID ="ObjectDataSource2" runat ="server"

SelectMethod ="SelectByName"

SelectCountMethod ="SelectByNameCount"

EnablePaging ="true"

TypeName ="SimpleBusinesObject" >

< SelectParameters >

< asp:QueryStringParameter DefaultValue ="John" Name ="name"

QueryStringField ="name" Type ="String" />

</ SelectParameters >

</ asp:ObjectDataSource >



* This source code was highlighted with Source Code Highlighter .






不要なものはすべて削除し、必要なものを追加しました。 打ち上げ、乾杯! 動作します。 ただし、「オフセットまたは長さが配列またはカウントの範囲外であったため、インデックスからソースコレクションの最後までの要素数よりも大きいため」最後のページを開くことができないことに注意してください。リストの最後には、ミシャという名前の人はいません。 そして今、あなたはタバコを吸うか、コーヒーを飲んでいるなら、煙に行くことができます、あなた自身を非常にクールなasp.netプログラマーと想像してくださいfor



そこで、単純なページングを見て、必要なものをすべて除外しました。 今、私はいくつかのコメントしかすることができません。 ORMを使用する場合、データベースが必要なデータの部分を返すように、Selectメソッドでsqlクエリをやり直さなければならない可能性があります。 また、SelectCountメソッドの場合、SQLクエリをやり直して、クエリを満たす要素の数以外は何も返さないようにする必要があります。 したがって、データベースサーバーとWebサーバーの間で転送されるデータの量を大幅に削減できます。



シムについては、私はお辞儀をし、将来、おそらく、整理し、新しい要素を挿入し、削除して更新します。 ただし、GridViewとObjectDataSourceの操作の基本は既にあるため、これは既にはるかに簡単です。



そして最後に、作成されたプロジェクトfiles.mail.ru/4UKA8Zを適用しましょう



PS A.ええ、はい。 結局忘れましたが、明日はコードビハインドからgridviewとdatasourceを設定します。



All Articles