如何正确使用 asp:UpdatePanel?
How to use asp:UpdatePanel the right way?
asp:updatePanel 语句有点问题。
我在 public void 中创建了一个带有一些 sql 查询的 html 字符串,并将其设置为占位符并在 Page_Load 上执行此 void。
然后我有一个带有触发计时器的更新面板,但是当计时器第一次触发时,一个新的复制 html 字符串出现在我的主页上,而不是更新我在页面加载时创建的字符串。
之后每次定时器触发两个 html 字符串更新。
我也尝试过 asp:timer OnInit 和 OnLoad。我的问题仍然存在。
还尝试从页面加载中删除 Machinebox 然后我的 html 字符串等待计时器第一次触发。但是我没有得到任何重复。
有人对此有解决方案吗?
ASP:
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ViewStateMode="Enabled">
<ContentTemplate>
<asp:PlaceHolder ID = "MachineBoxHolder" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
<asp:Timer ID="Timer1" runat="server" Interval="3000" OnTick="MachineBox_Tick">
</asp:Timer>
页面加载:
protected void Page_Load(object sender, EventArgs e)
{
MachineBox();
}
机器箱:
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection(constr);
connection.Open();
SqlCommand sqlCmd = new SqlCommand("SELECT [MachineID], [MachineName], [Quality] FROM [dbo].[Machines] WHERE [Activated] = 1", connection);
SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
sqlDa.Fill(dt);
if (dt.Rows.Count >= 1)
{
//htmlstring.
StringBuilder html = new StringBuilder();
//Table start.
html.Append("<div class='row'>");
//Bygger Data rows.
foreach (DataRow row in dt.Rows)
{
SqlCommand sqlCmd1 = new SqlCommand("SELECT AVG(effectively) FROM [" + row.Field<Int32>("MachineID") + "] WHERE time >= dateadd(hh, -" + tid + ", getdate())", connection);
tempAvailability = (Int32)sqlCmd1.ExecuteScalar();
SqlCommand sqlCmd3 = new SqlCommand("SELECT MAX(counter) FROM [" + row.Field<Int32>("MachineID") + "] WHERE time >= dateadd(hh, -" + tid + ", getdate())", connection);
tempMaxCounter = (Int32)sqlCmd3.ExecuteScalar();
SqlCommand sqlCmd4 = new SqlCommand("SELECT MIN(counter) FROM [" + row.Field<Int32>("MachineID") + "] WHERE time >= dateadd(hh, -" + tid + ", getdate())", connection);
tempMinCounter = (Int32)sqlCmd4.ExecuteScalar();
SqlCommand sqlCmd2 = new SqlCommand("SELECT TOP (1) effectively FROM [" + row.Field<Int32>("MachineID") + "] ORDER BY time DESC", connection);
tempState = (Int32)sqlCmd2.ExecuteScalar();
tempPerformance = ((tempMaxCounter - tempMinCounter) / (tid * antal)) * 100;
tempOEE = (tempAvailability * tempPerformance * row.Field<Int32>("Quality")) / 10000;
if (tempState > 50)
{
HTML CODE
}
//Table slut.
html.Append("</div>");
//Placerar i placeholder.
MachineBoxHolder.Controls.Add(new Literal { Text = html.ToString() });
}
触发器:
protected void MachineBox_Tick(object sender, EventArgs e)
{
MachineBox();
}
我已将您的代码放入测试页。我只是写了一些文本来显示而不是数据库查询。
我也有同样的行为。
然后我修改了点击事件:
protected void MachineBox_Tick(object sender, EventArgs e)
{
// MachineBox();
}
那我没有得到重复的值
机器盒();无论如何在 Page_Load 被调用并且在 MachineBox_Tick 中有相同的将执行它两次。
正如上面评论中提到的,这在 Page_Load 事件中也应该有效。
if(!IsPostBack)
{
MachineBox();
}
asp:updatePanel 语句有点问题。 我在 public void 中创建了一个带有一些 sql 查询的 html 字符串,并将其设置为占位符并在 Page_Load 上执行此 void。 然后我有一个带有触发计时器的更新面板,但是当计时器第一次触发时,一个新的复制 html 字符串出现在我的主页上,而不是更新我在页面加载时创建的字符串。 之后每次定时器触发两个 html 字符串更新。
我也尝试过 asp:timer OnInit 和 OnLoad。我的问题仍然存在。
还尝试从页面加载中删除 Machinebox 然后我的 html 字符串等待计时器第一次触发。但是我没有得到任何重复。
有人对此有解决方案吗?
ASP:
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ViewStateMode="Enabled">
<ContentTemplate>
<asp:PlaceHolder ID = "MachineBoxHolder" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
<asp:Timer ID="Timer1" runat="server" Interval="3000" OnTick="MachineBox_Tick">
</asp:Timer>
页面加载:
protected void Page_Load(object sender, EventArgs e)
{
MachineBox();
}
机器箱:
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection(constr);
connection.Open();
SqlCommand sqlCmd = new SqlCommand("SELECT [MachineID], [MachineName], [Quality] FROM [dbo].[Machines] WHERE [Activated] = 1", connection);
SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
sqlDa.Fill(dt);
if (dt.Rows.Count >= 1)
{
//htmlstring.
StringBuilder html = new StringBuilder();
//Table start.
html.Append("<div class='row'>");
//Bygger Data rows.
foreach (DataRow row in dt.Rows)
{
SqlCommand sqlCmd1 = new SqlCommand("SELECT AVG(effectively) FROM [" + row.Field<Int32>("MachineID") + "] WHERE time >= dateadd(hh, -" + tid + ", getdate())", connection);
tempAvailability = (Int32)sqlCmd1.ExecuteScalar();
SqlCommand sqlCmd3 = new SqlCommand("SELECT MAX(counter) FROM [" + row.Field<Int32>("MachineID") + "] WHERE time >= dateadd(hh, -" + tid + ", getdate())", connection);
tempMaxCounter = (Int32)sqlCmd3.ExecuteScalar();
SqlCommand sqlCmd4 = new SqlCommand("SELECT MIN(counter) FROM [" + row.Field<Int32>("MachineID") + "] WHERE time >= dateadd(hh, -" + tid + ", getdate())", connection);
tempMinCounter = (Int32)sqlCmd4.ExecuteScalar();
SqlCommand sqlCmd2 = new SqlCommand("SELECT TOP (1) effectively FROM [" + row.Field<Int32>("MachineID") + "] ORDER BY time DESC", connection);
tempState = (Int32)sqlCmd2.ExecuteScalar();
tempPerformance = ((tempMaxCounter - tempMinCounter) / (tid * antal)) * 100;
tempOEE = (tempAvailability * tempPerformance * row.Field<Int32>("Quality")) / 10000;
if (tempState > 50)
{
HTML CODE
}
//Table slut.
html.Append("</div>");
//Placerar i placeholder.
MachineBoxHolder.Controls.Add(new Literal { Text = html.ToString() });
}
触发器:
protected void MachineBox_Tick(object sender, EventArgs e)
{
MachineBox();
}
我已将您的代码放入测试页。我只是写了一些文本来显示而不是数据库查询。
我也有同样的行为。
然后我修改了点击事件:
protected void MachineBox_Tick(object sender, EventArgs e)
{
// MachineBox();
}
那我没有得到重复的值
机器盒();无论如何在 Page_Load 被调用并且在 MachineBox_Tick 中有相同的将执行它两次。
正如上面评论中提到的,这在 Page_Load 事件中也应该有效。
if(!IsPostBack)
{
MachineBox();
}