2016-12-02 88 views
0

我有一个GridView与80个行中的每一个中的几个文本框,下拉菜单和复选框以及绑定到网格的OnRowEdit和OnRowDataBound事件。 这是我做的更新网格:c#很慢的Gridview更新。

  1. 的ImageButton单击行切换到编辑模式(7秒),并填充每行的复选框,根据所选行已与他人的关系
  2. 的ImageButton单击行中保存编辑后的数据(13秒),
    • 行:单击事件收集的控制数据和行数据保存到SQL
    • 列:在所有行中循环,得到一个复选框的状态并将其保存到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连接三次(updatetrigger,rowdatabound和UpdateMilesStones)。请避免这一点。只尝试在一个操作中完成。

2)使用使用块SQL连接check this link

3)您也可以使用索引来代替的FindControl如果列订单将被固定。

4)你也可以将数据保存在内存/缓存中,最后你将所有数据保存在SQL中。

请试试这些东西。它肯定会提高性能。

+0

很多输入!谢谢。 1)实际上,SQL连接更经常地构建:i)填充每行需要一个连接的复选框ii)删除旧值iii)在保存期间为每一个检查的行(!)iv)保存GridRow数据...也许填充由SQLDataSource提供的DropDownLists也是重要的。所以你告诉我把所有进入或者去往SQL连接的数据放到一个存储为会话参数的DataTable中?2)我会尝试3)我认为我在任何地方都可以使用索引,但是我会再次检查它4)这与点1) – Barnabeck

+0

将所有更新操作打包到单个SQL连接中改进了很多。但我找不到任何明确指出Rows [index] .Cells [0] .Controls [1]在Rows [index] .cells [0] .FindControl(“TOTAL”)上的性能的参考。 – Barnabeck

+0

关于索引,可能忽略不计的性能改进,但显然它会比findcontrol更快,因为它会遍历所有控件。如果你看起来不错,你能否接受答案? –