如何从asp.net Webform中的GridView优化“ foreach”事件?

丹尼斯·索托(Denis Soto)

EventTextBoxc#.net中文本更改时,我有一个开始Event越过一GridView排。GridView与来自DB信息创建的。GridView有八个TemplateFields,七个带有TextBox和一个带有DropDownList控件。

问题在于此事件耗时26至27秒。

对于每行,它应该:

  • 检查[4]列的内容是否等于“ BATCH”,如果为true,则用不同的颜色绘制整个行。
  • 从[0]列中提取ID。
  • 使用此ID和from中的DateTextBox进行查询,查询将查找数据库中是否已存在该记录。
  • 如果记录存在,则应将其打印到TextBoxDropDownListTemplateField
  • 如果数据库中的某些记录为空,则有一些记录TextBox不应该打印。

附加信息:

  • 所述GridView与从DB数据创建,使用QUERY内部的SqlDataSource这在同一事件中发生。QUERY包含一些INNER JOIN,数据没有存储在同一数据库表中:

    SELECT Dealer.IDDealer, Batch.IDBatch, Lpars.Nombre, Dealer.DealerCodigo, Batch.Nombre AS Expr1, Batch.CTStart AS Expr2 FROM Lpars INNER JOIN Dealer ON Lpars.IDLpar = Dealer.IDLpar INNER JOIN Batch ON Dealer.IDDealer = Batch.IDDealer INNER JOIN [1Monday] ON Batch.IDBatch = [1Monday].IDBatch WHERE (Batch.Status = 'Enabled') ORDER BY Batch.CTStart

  • 响应时间问题不是因为SQL QUERY顶部。我单独尝试过,此查询的SQL Server响应时间少于2秒。

  • DATETIME我从数据库中提取了一些数据。因此,在将其打印到之前TextBox,我需要根据自己的需要更改DATETIME格式。这就是为什么我在打印之前将提取的数据存储到变量中的原因。

这是我的代码:

--

 //WHEN THE TEXT FROM TEXTBOX CHANGES:
        protected void TextDate_TextChanged(object sender, EventArgs e)
        {
            //THE GRIDVIEW IS CREATED:
            GridView1.DataSourceID = DatosLunes.ID;
            GridView1.DataBind();

            //A) I CREATE VARIABLES TO CHARGE THE DATA THAT CAMES FROM THE DATABASE WHEN PROCEED WITH THE QUERY
            string VarsDateGV;
            string VarsStartGV;
            string VarsScchkGV;
            string VarsEndGV;
            string VarsDurationGV;
            string VarsBeforeGV;
            string VarsAfterGV;

            //B) FOREACH ROW, THE PROCESS START TO:
            foreach (GridViewRow row in GridView1.Rows)
            {
                //B.1) IDENTIFY EACH CONTROL INTO ROW COLUMNS:
                TextBox DateGV = row.FindControl("DateGV") as TextBox;
                TextBox StartGV = row.FindControl("StartGV") as TextBox;
                TextBox ScchkGV = row.FindControl("ScchkGV") as TextBox;
                TextBox EndGV = row.FindControl("EndGV") as TextBox;
                TextBox DurationGV = row.FindControl("DurationGV") as TextBox;
                HiddenField DedicatedGV = row.FindControl("DedicatedGV") as HiddenField;
                HiddenField NotDedicatedGV = row.FindControl("NotDedicatedGV") as HiddenField;
                DropDownList DropDownGV = row.FindControl("DropDownGV") as DropDownList;
                TextBox BeforeGV = row.FindControl("BeforeGV") as TextBox;
                TextBox AfterGV = row.FindControl("AfterGV") as TextBox;
                DateTime FechaCT1 = DateTime.Parse(TextDate.Text, CultureInfo.InvariantCulture);

                //B.2) IF THE [4] COLUMN STRING IS EQUAL TO "BATCH", THE ROW IS PAINTED
                if (row.RowType == DataControlRowType.DataRow)
                {
                    string NombreBatch = row.Cells[4].Text;

                    if (NombreBatch == "BATCH")
                    {
                        row.BackColor = System.Drawing.Color.NavajoWhite;
                    }
                }

                //B.3) THE QUERY STARTS
                if (row.RowType == DataControlRowType.DataRow)
                {
                    // B.3.1) EXTRACTS THE ROW ID FROM [0] COLUMN
                    string IDBatch = row.Cells[0].Text;

                    //B.3.2) USE A DATATABLE TO CHARGE DATA FROM THE QUERY "TRAEFILAHO"
                    CADCATOPS.DSCATOPS.BatchDatos1DataTable Fila = CADCATOPS.CADBatchHandoff.TraeFilaHO(Convert.ToInt32(IDBatch), Convert.ToString(FechaCT1));

                    //B.3.3) FOREACH ROW IN THE DATATABLE, THE DB INFORMATION IS SAVED INTO THE VARIABLES CREATED BEFORE (IN THE "A" ITEM).
                    foreach (DataRow row1 in Fila.Rows)
                    {
                        VarsDateGV = row1["FechaBatch"].ToString();
                        VarsStartGV = row1["Inicio"].ToString();
                        VarsScchkGV = row1["FinDedicado"].ToString();
                        VarsEndGV = row1["FinNoDedicado"].ToString();
                        VarsDurationGV = row1["DuracionBatch"].ToString();
                        DropDownGV.Text = row1["Estado"].ToString();
                        VarsBeforeGV = row1["DuracionBefore"].ToString();
                        VarsAfterGV = row1["DuracionAfter"].ToString();

                        /********* FROM NOW ON:
                         B.3.3.1) I VALIDATE IF THE DATETIME DATA EXTRACTED FROM THE DB EXISTS FOR A FEW ITEMS. IF EXISTS, THE FORMAT IS CHANGED FOR MY NEEDS, AND PRINTED.

                         MAYBE YOU ARE ASKING WHY I VALIDATE IT FOR SEPARATED AND NOT ALL TOGETHER, THIS IS BECAUSE I NEED TO CHECK IT SEPARATELLY. 
                         IF "THIS" DATA DOESN'T EXISTS, DON'T BRING IT TO THE GRIDVIEW, BUT IF "THIS OTHER" DATA EXISTS, I NEED TO SHOW IT.
                         *********/
                        if (VarsDateGV != "")
                        {
                            DateTime VardDateGV = DateTime.Parse(VarsDateGV, CultureInfo.InvariantCulture);
                            DateTime VardStartGV = DateTime.Parse(VarsStartGV);
                            DateGV.Text = VardDateGV.ToString("MM/dd/yyyy");
                            StartGV.Text = VardStartGV.ToString("HH:mm");
                        }

                        if (VarsEndGV != "")
                        {
                            DateTime VardEndGV = DateTime.Parse(VarsEndGV);
                            DateTime VardDurationGV = DateTime.Parse(VarsDurationGV);
                            EndGV.Text = VardEndGV.ToString("HH:mm");
                            DurationGV.Text = VardDurationGV.ToString("HH:mm");
                        }

                        if (VarsScchkGV != "")
                        {
                            DateTime VardScchkGV = DateTime.Parse(VarsScchkGV);
                            ScchkGV.Text = VardScchkGV.ToString("HH:mm");
                        }

                        if (VarsBeforeGV != "")
                        {
                            DateTime VardBeforeGV = DateTime.Parse(VarsBeforeGV);
                            BeforeGV.Text = VardBeforeGV.ToString("HH:mm");
                        }

                        if (VarsAfterGV != "")
                        {
                            DateTime VardAfterGV = DateTime.Parse(VarsAfterGV);
                            AfterGV.Text = VardAfterGV.ToString("HH:mm");
                        }
                    }
                }
            } //FOREACH LOOP IS COMPLETED.
        }

您是否有建议来优化此事件?

更新:ConnorsFan帮助我检测到该问题(谢谢)。

问题是查询,因为它运行了50次(或GridView长度)。我尝试避免它,并且响应时间不到4秒。问题是我需要它来处理查询。有没有一种方法可以为其优化代码?

康纳斯·范

我认为那TextDate是在GridView之外。据我了解,您的内部查询返回一条记录。您可以修改它以返回循环内所需的所有记录(包括IDBatch字段),并在进入循环之前运行它。在循环中,你会发现与主键(如所指出的特定记录在这里)。

protected void TextDate_TextChanged(object sender, EventArgs e)
{
    ...

    CADCATOPS.DSCATOPS.BatchDatos1DataTable AllFila = CADCATOPS.CADBatchHandoff.AllTraeFilaHO(Convert.ToString(FechaCT1));
    AllFila.PrimaryKey = new DataColumn[] { AllFila.Columns["IDBatch"] };

    foreach (GridViewRow row in GridView1.Rows)
    {
        ....
        if (row.RowType == DataControlRowType.DataRow)
        {
            string IDBatch = row.Cells[0].Text;
            DataRow foundRow = AllFila.Rows.Find(IDBatch);
            ...
        }
    }
}

如果查询返回的DataTable中的记录的排序方式与GridView中的排序方式相同,则可以使其更快。行索引将匹配,并且您无需在DataTable中找到该行。

更新

如果可以直接从填充GridView的数据源获取TextBox数据,则可以消除foreach循环(以及所有相关处理)。您可以使用的第二个参数Eval来格式化数据:

<asp:TextBox ID="DateGV" runat="server" Text='<%# Eval("FechaBatch", "{0:MM/dd/yyyy}") %>' ... />
<asp:TextBox ID="StartGV" runat="server" Text='<%# Eval("Inicio", "{0:HH:mm}") %>' ... />

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Gridview 表未显示在 asp.net webform 中

来自分类Dev

如何为复选框添加事件单击Asp.net Gridview列中

来自分类Dev

如何在gridview RowDataBound中创建按钮单击事件c#asp.net

来自分类Dev

列出Asp.Net中GridView事件的顺序

来自分类Dev

ASP.net如何在TextChanged事件中无效

来自分类Dev

如何在asp.net中确认onclick事件?

来自分类Dev

如何在asp.net(WebForm)中包含GoogleMap?

来自分类Dev

如何使用 foreach 在 ASP.NET 中呈现我的数据?

来自分类Dev

如何在C#Webform中跟踪asp.net的按钮按下事件?

来自分类Dev

如何在ASP.NET C#WebForm中的文本框和下拉列表的GridView页脚行中获取值

来自分类Dev

当我单击gridview中的“编辑”按钮时,如何调用“删除行”事件?asp.net C#

来自分类Dev

如何在同一Visual Studio解决方案中设置ASP Classic和ASP.NET WebForm-在ASP.NET WebForm中重写ASP Classic页面

来自分类Dev

ASP.NET:如何使Webform移动响应?

来自分类Dev

ASP.NET WebForms中的异步事件

来自分类Dev

ASP.NET中TextBox的KeyPress事件

来自分类Dev

如何在asp.net的gridview中创建链接

来自分类Dev

如何在asp.net中清除GridView?

来自分类Dev

如何知道在asp.net gridView中单击按钮的位置

来自分类Dev

如何在asp.net中清除GridView?

来自分类Dev

ASP .Net 如何识别 GridView 中的删除按钮?

来自分类Dev

如何在 Asp.Net 中制作 GridView 多列

来自分类Dev

如何在 ASP.NET 中的 GridView 中计算总价

来自分类Dev

如何从ASP.NET MVC中的JSON在FullCalendar中呈现事件?

来自分类Dev

如何在JavaScript中的OnUnload事件中清除asp.net会话值

来自分类Dev

如何在asp.net中的页面加载中调用选定的索引更改事件

来自分类Dev

Asp.net Keydown事件并非总是在GridView中触发

来自分类Dev

如何在ASP.NET后面的代码中为ImageButton的ClickI()事件连接

来自分类Dev

如何使用ASP.net在Listview Itemdatabound事件中获取输入类型Button?

来自分类Dev

如何在ASP.NET C#中触发事件的OnChange类型

Related 相关文章

  1. 1

    Gridview 表未显示在 asp.net webform 中

  2. 2

    如何为复选框添加事件单击Asp.net Gridview列中

  3. 3

    如何在gridview RowDataBound中创建按钮单击事件c#asp.net

  4. 4

    列出Asp.Net中GridView事件的顺序

  5. 5

    ASP.net如何在TextChanged事件中无效

  6. 6

    如何在asp.net中确认onclick事件?

  7. 7

    如何在asp.net(WebForm)中包含GoogleMap?

  8. 8

    如何使用 foreach 在 ASP.NET 中呈现我的数据?

  9. 9

    如何在C#Webform中跟踪asp.net的按钮按下事件?

  10. 10

    如何在ASP.NET C#WebForm中的文本框和下拉列表的GridView页脚行中获取值

  11. 11

    当我单击gridview中的“编辑”按钮时,如何调用“删除行”事件?asp.net C#

  12. 12

    如何在同一Visual Studio解决方案中设置ASP Classic和ASP.NET WebForm-在ASP.NET WebForm中重写ASP Classic页面

  13. 13

    ASP.NET:如何使Webform移动响应?

  14. 14

    ASP.NET WebForms中的异步事件

  15. 15

    ASP.NET中TextBox的KeyPress事件

  16. 16

    如何在asp.net的gridview中创建链接

  17. 17

    如何在asp.net中清除GridView?

  18. 18

    如何知道在asp.net gridView中单击按钮的位置

  19. 19

    如何在asp.net中清除GridView?

  20. 20

    ASP .Net 如何识别 GridView 中的删除按钮?

  21. 21

    如何在 Asp.Net 中制作 GridView 多列

  22. 22

    如何在 ASP.NET 中的 GridView 中计算总价

  23. 23

    如何从ASP.NET MVC中的JSON在FullCalendar中呈现事件?

  24. 24

    如何在JavaScript中的OnUnload事件中清除asp.net会话值

  25. 25

    如何在asp.net中的页面加载中调用选定的索引更改事件

  26. 26

    Asp.net Keydown事件并非总是在GridView中触发

  27. 27

    如何在ASP.NET后面的代码中为ImageButton的ClickI()事件连接

  28. 28

    如何使用ASP.net在Listview Itemdatabound事件中获取输入类型Button?

  29. 29

    如何在ASP.NET C#中触发事件的OnChange类型

热门标签

归档