0

データ バインドされたテンプレート列を持つグリッドビューがあります。ここに XML コード全体を貼り付けるわけではありませんが、基本的には各列の内訳を次に示します。

  • アイテム ID (DataBound 列)
  • 項目カテゴリ (DataBound 列)
  • 項目のサブカテゴリ (DataBound 列)
  • アイテム (DataBound 列)
  • 注文数量 (テキストボックス - 無制限のテンプレート フィールド)
  • サプライヤー (DropDownList 無制限のテンプレート フィールド)**
  • 品目原価 (テキストボックス - 無制限のテンプレート フィールド)
  • 有料 (チェックボックス - 無制限のテンプレート フィールド)

グリッドビューは、すべてのレコードを取得し、選択したカテゴリによってのみフィルター処理します (したがって、カテゴリごとに約 70 レコードのみをプルするため、それほど大きくはありません)。

SSMS では、実行に 0 秒かかります。

ASP.net では約 20 秒かかります。

さらに悪いことに、サプライヤのドロップダウンは現在空白のフィールドです。ただし、実際にこのコードをソースに追加すると:

<ItemTemplate>
<asp:DropDownList ID="ddSupplier" runat="server" DataSource="<%# PopulateControls() %>"  
                   DataTextField="SupplierName"  DataValueField="SupplierName" />
</ItemTemplate>
<ControlStyle BorderStyle="Solid" />
<HeaderStyle HorizontalAlign="Left" VerticalAlign="Middle" />
<ItemStyle BorderStyle="None" HorizontalAlign="Left" VerticalAlign="Middle" 
           Width="50px" />
 </asp:TemplateField>

その後、すべての値を取得するのに約 60 秒かかります。

私の質問:

  1. グリッドビューで基本的な選択スクリプトを介して値を取得するより高速な方法はありますか?
  2. バインドされたフィールドを持つテンプレートが 1 つ以上あることに問題はありますか? データバインドされた列のみを含む他のデータグリッドがあり、それらは非常に迅速に実行されます。

ヘルプ?

4

1 に答える 1

0

あなたのコードビハインドを見ることなく、私はこれだけしか言えません。しかし、すでにいくつかの問題があります。

グリッドビューの 70 行は小さくありません。グリッドは、ViewState に多くのデータを格納します。可能であれば、データをページ分割します。そうでない場合は、ViewState のセッションを使用してみてください。

のデータソースddSupplierはおそらく同じです。オンに設定RowDataBound

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
   if (gv.EditIndex == e.Row.RowIndex && 
       e.Row.RowType==DataControlRowType.DataRow) 
   {       
       DropDownList ddSupplier= (DropDownList)e.Row.FindControl("ddSupplier"); 
       //bind the control
       //MySuppliers would be read and kept in Session on first page load
       ddSupplier.DataSource = MySuppliers;
   }
}

テンプレートにバインドされたフィールドは問題ではありません。

コードをプロファイリングして、その 20 秒が実際にどこで使用されているかを確認することで、問題をよりよく理解できます。

于 2012-09-10T04:31:09.777 に答える