2017-04-14 8 views
0

私はこのコードを手に入れました。しかし、はいつもです。 OK、おそらく40秒ですが、それはオンラインアプリケーションでは永遠です。GridViewにDropDownListsを配置する最も効率的な方法は?

protected void DataGrid_Open_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    OracleConnection conn = GetConnection(); 
    try 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      DataRowView drv = e.Row.DataItem as DataRowView; 

      //********************************************** 
      //************* Auditor Names **************** 
      //********************************************** 

      OracleCommand cmd4 = new OracleCommand(); 
      cmd4.CommandType = CommandType.StoredProcedure; 
      cmd4.CommandText = "CSTAPP_O.CST_AMR_AUDITORNAMES"; 
      cmd4.Connection = conn; 

      cmd4.Parameters.Add("cursor_", OracleType.Cursor).Direction = ParameterDirection.Output; 

      var SearchAdapter4 = new OracleDataAdapter(cmd4); 
      var ds4 = new DataTable(); 
      SearchAdapter4.Fill(ds4); 

      DataView view = new DataView(ds4); 
      DataTable distinctValues = new DataTable(); 
      distinctValues = view.ToTable(true, "Auditor_Name", "AuditorID"); 

      DropDownList ddl = e.Row.FindControl("EI_Open_AuditorName") as DropDownList; 

      ddl.DataSource = distinctValues; 
      ddl.DataTextField = "Auditor_Name"; 
      ddl.DataValueField = "AuditorID"; 
      ddl.DataBind(); 
      ddl.SelectedValue = drv["Auditor_Name"].ToString(); 

      //********************************************** 
      //***************** Status ******************* 
      //********************************************** 

      OracleCommand cmd5 = new OracleCommand(); 
      cmd5.CommandType = CommandType.StoredProcedure; 
      cmd5.CommandText = "CSTAPP_O.CST_AMR_AUDITSTATUS"; 
      cmd5.Connection = conn; 

      cmd5.Parameters.Add("cursor_", OracleType.Cursor).Direction = ParameterDirection.Output; 

      var SearchAdapter5 = new OracleDataAdapter(cmd5); 
      var ds5 = new DataTable(); 
      SearchAdapter5.Fill(ds5); 

      DataView view5 = new DataView(ds5); 
      DataTable distinctValues5 = new DataTable(); 
      distinctValues5 = view5.ToTable(true, "StatusName", "StatusID"); 

      //    DataRowView drv = e.Row.DataItem as DataRowView; 
      DropDownList ddl5 = e.Row.FindControl("EI_Open_AuditStatus") as DropDownList; 

      ddl5.DataSource = distinctValues5; 
      ddl5.DataTextField = "StatusName"; 
      ddl5.DataValueField = "StatusID"; 
      ddl5.DataBind(); 
      ddl5.SelectedValue = drv["Overall_Audit_Status"].ToString(); 

     } 
    } 
    catch (Exception ex) 
    { 

    } 
} 

もっと効率的な方法がありますか?私はGridViewのすべてのレコードのストアドプロシージャを再実行することがDropDownListを埋める最善の方法だとは信じられません。そして、私は2つのDropDownListsを埋めています。

答えて

1

DataTableを使用すると、データとDataTableにデータを取得して再利用する方法を一時的に格納して、すべてのDataBoundアイテムでデータベースにヒットしないようにすることができます。

DataTable dt; 

protected void DataGrid_Open_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    //check if the current row is a datarow 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //check if the datatable already exists, if not get it from the LoadDataFromDB method 
     if (dt == null) 
     { 
      dt = LoadDataFromDB(); 
     } 

     DropDownList ddl = e.Row.FindControl("EI_Open_AuditorName") as DropDownList; 

     ddl.DataSource = dt; 
     ddl.DataTextField = "Auditor_Name"; 
     ddl.DataValueField = "AuditorID"; 
     ddl.DataBind(); 
    } 
} 

//method for loading data into a datatable and return it as such 
public DataTable LoadDataFromDB() 
{ 
    string query = "CSTAPP_O.CST_AMR_AUDITORNAMES"; 
    DataTable dt = new DataTable(); 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection)) 
    { 
     try 
     { 
      adapter.Fill(dt); 
     } 
     catch 
     { 
     } 
    } 

    return dt; 
} 
+0

投稿したのは約20秒前です。 :o)将来のすべての訪問者にとって、このメソッドはチャンピオンのように機能しました。 –

関連する問題