如何正确使用 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();
}