2009-06-11 37 views
16

簡単な質問ですね。なぜDataBind()メソッドが必要ですか?

私は、ASP.NETコントロールをプログラムでデータバインドするときに、長い間、(おそらく)共通のパターンに盲目的に従ってきました。つまり:私は、DataSourceIDプロパティを経由してデータソース制御にバインドするために私のGridViewを設定した場合

gridView1.DataSource = someList; 
gridView1.DataBind(); 

はしかし、DataBindを()の呼び出しは不要です。すなわち:

gridView1.DataSourceID = LinqDataSource1; 

で十分です。あなたはASPXマークアップでDataSourceプロパティを設定しようと

さらに、次のように迎えています

あなたは宣言DataSourceプロパティを設定することはできません。

これらは関連していると思われますが、私はまだDataBind()が必要な理由については困惑しています。 DataSourceとDataSourceIDの違いは二次的です - 私はそこで起こっている魔法を理解することができます。実際の質問はです。DataSourceのプロパティセッターがデータバインディングを自動的に引き起こさないのはなぜですか? DataSourceを設定してバインドしないシナリオはありますか?

答えて

16

ASP.Netでは、ページライフサイクルの特定の時点で特定のデータを利用できるようにしておくことが重要です。たとえば、選択したインデックスをあとでそのリストに設定できるようにするには、ドロップダウンリストに早期にバインドする必要があります。または、その大きなグリッドをバインドするために少し待って、その接続をアクティブにしておく時間を減らしたり、データをメモリに保持することができます。

.DataBind()メソッドを明示的に呼び出すと、スペクトルの両端でシナリオをサポートすることができます。

+2

後でメモリ内のデータを保つのに短い時間の原因とどのように結合説明できますか?私はシンプルなコレクションのメモリ(上記のようにsomeListはList の場合)に保存されていることを前提としていますが、違いはありませんが、もっと複雑な方法ではどうすれば動作しますか?評価が遅れていますか?良い例があります。 – JoshJordan

+0

ソースとしてdatareaderを使用することを考えてください。すぐにバインドすると、リーダーを繰り返してその内容を記憶に残します。ページのライフサイクルの後半を待っている場合は、短い時間でハングアップします。 –

+1

説明をありがとう、しかし、私はどのようにこれが 'あなたがその接続をアクティブにしている時間を減らすのですか?接続は、OnDataBindingイベントからExecuteSelect()が呼び出されたときにのみ開かれます。 ExecuteSelect()が終了すると、 'dbConnection.Close();'が呼び出され、接続はもはやアクティブではありません。何か不足していますか? – BornToCode

2

DataSourceは、BaseDataBoundControlクラスのプロパティです。 DataSourceIDは、BaseDataBoundControlを継承し、ASP.NET 2.0より前に存在しなかったDataBoundControlクラスのプロパティです。

DataBoundControlは明示的にリストまたは表形式でデータを表示するため、BaseDataBoundControlはその前提を行うことができないため、コントロールの種類がデータの構造と一致しない可能性があるためDataSourceが設定されていると自動的にバインドされません。

もちろん、これはMSDNのドキュメントに基づいていると思いますので、私は間違っている可能性があります。

0

私は、コードのこのセクションに示すように何も私のGridViewに表示されないことにDataBind()を使用することなく、私はいつもそれが含まれていることに気づい:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    ' TableAdapter object. 
    ' Provide communication between this application and the database. 
    '----------------------------------------------------------------- 
    Dim suppliersAdapter As New SuppliersTableAdapter 

    ' Get the data from the TableAdapter into the GridView. 
    '------------------------------------------------------ 
    GridView1.DataSource = suppliersAdapter.GetSuppliers() 

    ' Display the result set from the TableAdapter in the GridView. 
    '-------------------------------------------------------------- 
    GridView1.DataBind() 
End Sub 

私もだとしてコメント余分ご容赦下さいまだASP.Netを学んでいますが、そのコメントは私が「何で、なぜ」特定のステートメントを使うのが良いかを学ぶのに役立ちます。

0

はこれを試してみてください:

if (GridView1.EditIndex == e.Row.RowIndex) 
{    
    TextBox t2 = (TextBox)e.Row.FindControl("TextBox2"); 
    DateTime dt2; 
    if (DateTime.TryParse(t2.Text, out dt2)) 
    { 
     t2.Text = dt2.ToString("yyyy-MM-dd"); 
    } 
} 
関連する問題