2016-12-02 14 views
0

私はGridviewをいくつかのTextBoxes、ドロップダウンメニューとチェックボックスをそれぞれの80行に配置し、OnRowEditイベントとOnRowDataBoundイベントをグリッドに関連付けました。 これは私がグリッド更新するために何をすべきかである:選択された行は、他の人と有する関係によれば、エディットモード(7秒)の行スイッチにC#非常に遅いGridviewアップデート。

  1. のImageButtonをクリックして、各行のチェックボックスを移入
  2. 、すべての行をループチェックボックスの状態を取得する:クリックイベントは、制御データを収集し、SQLに行データを保存し
  3. コラム:
  4. のImageButton編集したデータ(13秒)
    • 行が保存されます行をクリックSQL
    • に保存します。

私は自己啓発であり、改善する可能性が最も高いものがあります。誰かが見て、クリティカルな時間のかかる操作が何であるか、そして物事をスピードアップする方法を指摘してください。 - おかげで、マーティン

OnRowEdit:

protected void OnRowEditing(object sender, GridViewEditEventArgs e) 
    { 
     Gridview_Milestones.SelectedIndex = -1; 
     int rowIndex = e.NewEditIndex; 
     SelectedMSRow.Text = Convert.ToString(rowIndex); 
     SelectedMSRowValue.Text = Convert.ToString(Gridview_Milestones.DataKeys[rowIndex].Value); 
     CheckBox CheckedOrNot = Gridview_Milestones.Rows[rowIndex].FindControl("checkboxCustomerRequired") as CheckBox; 
     LabelCRD.Text = Convert.ToString(CheckedOrNot.Checked); 
    } 

OnRowDataBound:

protected void OnRowDataBoundMS(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      CheckBox CBTr = e.Row.FindControl("CheckboxTriggers") as CheckBox; 
      if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
      { 
       if (LabelCRD.Text == "True") 
       { 
        TextBox TBresult1 = e.Row.FindControl("TextBoxDefaultDays") as TextBox; 
        TBresult1.Visible = false; 
       } 
       else 
       { 
        TextBox TBresult1 = e.Row.FindControl("TextBoxDefaultDays") as TextBox; 
        TBresult1.Visible = true; 
       } 
       DropDownList DDL1 = e.Row.FindControl("DDOwnerGroup") as DropDownList; 
       DropDownList DDL2 = e.Row.FindControl("DDOwner") as DropDownList; 
       Label LBL1 = e.Row.FindControl("LabelDefaultOwnerGroupEdit") as Label; 
       Label LBL2 = e.Row.FindControl("LabelDefaultOwnerEdit") as Label; 
       DDL1.SelectedValue = Convert.ToString(LBL1.Text); 
       DDL2.DataBind(); 
       DDL2.SelectedValue = Convert.ToString(LBL2.Text); 
       CBTr.Visible = false; 
      } 
      if (!string.IsNullOrEmpty(SelectedMSRow.Text)) 
      {      
       DataRowView rowView = (DataRowView)e.Row.DataItem; 
       int myDataKey = Convert.ToInt32(rowView["ID"]); 
       CBTr.Checked = SetCheckBoxTrigger(myDataKey); 
      } 
     } 
    } 

保存する行データ:

protected void UpdateMilesStones(Object sender, EventArgs e) 
    { 
     UpdateTriggers(); 
     int rowIndex = Convert.ToInt32(SelectedMSRow.Text); 
     Label DataKey = Gridview_Milestones.Rows[rowIndex].FindControl("LabelEditID") as Label; 
     DropDownList DDL1 = Gridview_Milestones.Rows[rowIndex].FindControl("DDOwnerGroup") as DropDownList; 
     CheckBox CKB1 = Gridview_Milestones.Rows[rowIndex].FindControl("checkboxCustomerRequiredEdit") as Checkbox; 
     TextBox TB1 = Gridview_Milestones.Rows[rowIndex].FindControl("TextBoxDefaultDays") as TextBox; 
     SqlConnection objConn = new SqlConnection("XXXXX"); 
     SqlCommand objCommand = new SqlCommand(@"Update ...", objConn); 
     objCommand.Parameters.Add(".....") 
     objConn.Open(); 
     objCommand.ExecuteNonQuery(); 
     objConn.Close(); 
     Gridview_Milestones.DataBind(); 
     Gridview_Milestones.EditIndex = -1;    
    } 

保存列データ:

protected void UpdateTriggers() 
    { 
     DeleteOldTriggers(); 
     foreach (GridViewRow row in Gridview_Milestones.Rows) 
     { 
      string DataKey = Gridview_Milestones.DataKeys[row.RowIndex].Value.ToString(); 
      if (((CheckBox)row.FindControl("CheckboxTriggers")).Checked) 
      { 
       SqlConnection objConn = new SqlConnection("XXXXXX"); 
       SqlCommand objCommand = new SqlCommand(@"Insert into EPC_Triggers (MilestoneID, triggeredBy) Values (@IDMS,@IDRow)", objConn); 
       objCommand.Parameters.Add("@IDMS", SqlDbType.Int).Value = Convert.ToInt32(SelectedMSRowValue.Text); 
       objCommand.Parameters.Add("@IDRow", SqlDbType.Int).Value = Convert.ToInt32(DataKey); 
       objConn.Open(); 
       objCommand.ExecuteNonQuery(); 
       objConn.Close(); 
      } 
     } 
     Gridview_Milestones.Columns[13].Visible = false; 
    } 
+0

クラシックasp.netまたはmvcを使用していますか? –

+0

ddl2のデータソースは何ですか? – TZHX

+0

なぜそれはとても難しいですか?データベースプロバイダにDataAdapterを使用してみてください。 – GrApDev

答えて

1

変更の可能性があります。

1)SQL接続を3回開く(updatetrigger、rowdatabound、UpdateMilesStones)。それを避けてください。 1回の操作でのみ実行してください。

2)列の順序を固定しようとしている場合は、インデックスの代わりにFindControlを使用することができるSQL接続check this link

3)用のブロックを使用して使用してください。

4)データをメモリ/キャッシュに保存し、最後にすべてのデータをSQLに保存します。

これらを試してください。間違いなくパフォーマンスが向上します。

+0

たくさんの入力!ありがとうございました。 1)実際にはSQL接続がより頻繁に構築されます:i)行ごとに1つの接続を必要とするチェックボックスを設定するii)古い値を削除するiii)保存中にチェックされた各行について(!)iv)GridRowデータを保存する...また、SQLDataSourceによって供給されるDropDownListsを投入することもできます。だから、あなたは、セッションのパラメータとして格納されている1つのDataTableに行く、またはSQL接続に行くすべてのデータをパックするように私に言っている?2)試してみる3)できる限りどこでもインデックスを使うと思ったが、もう一度それをチェックする4)これはポイント1になる – Barnabeck

+0

すべてのアップデート操作を1つのSQLコネクションにパッキングすることが多くなった。しかし、Rows [index] .Cells [0] .Controls [1]がRows [index] .cells [0] .FindControl( "TOTAL")でパフォーマンスを上回っていることを明確に示すリファレンスは見つかりません。 – Barnabeck

+0

インデックスに関しては、パフォーマンスの向上はごくわずかですが、findcontrolはすべてのコントロールを繰り返し実行するため、findcontrolが高速になることは明らかです。それがあなたによく見えるなら、あなたは答えを受け入れることができますか? –