Event
当TextBox
c#.net中的文本更改时,我有一个开始。在Event
越过一GridView
排。在GridView
与来自DB信息创建的。它GridView
有八个TemplateFields
,七个带有TextBox
和一个带有DropDownList
控件。
问题在于此事件耗时26至27秒。
TextBox
进行查询,查询将查找数据库中是否已存在该记录。TextBox
和DropDownList
中TemplateField
。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] 删除。
我来说两句