首页 > 解决方案 > 在运行时更改字体真棒图标类

问题描述

我有一个包含文本框和按钮的用户控件。我在 main.aspx 页面中使用 for 循环重复了这个用户控件 n 次

for (int i = 0; i < 5; i++)
    {
            testcontrol newControl = (testcontrol)LoadControl("~/testcontrol.ascx");
            newControl.ID = "myControl-" + i.ToString();


            HtmlButton btnGenerateReport =newControl.FindControl("btnGenerateReport") as HtmlButton;
            btnGenerateReport.ID = "button_generate-" + i.ToString();
            btnGenerateReport.ServerClick += BtnGenerateReport_Click;


      }

我的 testcontrol.ascx 看起来像这样

  <div class="row">
     <div class="col-md-8 blockMe">
        <input runat="server" class="form-control" />
     </div>
    <div class="col-md-4">
       <button type = "button" id="btnGenerateReport"  class="btn btn-default btnGenerateReport" aria-label="Left Align" runat="server">
           <span class="fa fa-cog" runat="server" id="gennerateReportSpan" aria-hidden="true"></span>
       </button>

<br />
</div>

在 ButtonClick 上,我试图显示旋转图标,以便我可以执行一些后台进程。我已经订阅了 mainpage.aspx 中的 HtmlButton OnServerClick 方法

private async void BtnGenerateReport_Click(object sender, EventArgs e)
    {
        System.Web.UI.HtmlControls.HtmlControl tt = ((System.Web.UI.Control)sender).Parent.FindControl("gennerateReportSpan") as System.Web.UI.HtmlControls.HtmlControl;
        tt.Attributes.Clear();
        tt.Attributes.Add("class", "fas fa-spinner fa-spin");
       
        Task taskA = Task.Factory.StartNew(() =>
        {
            Task.Delay(5000).Wait();

        }).ContinueWith((x) =>
        {

            tt = ((System.Web.UI.Control)sender).Parent.FindControl("gennerateReportSpan") as System.Web.UI.HtmlControls.HtmlControl;

            tt.Attributes.Add("class", "fa fa-cog");

        });
            

    }

我正在尝试通过更改 htmlelement 的属性来实现旋转效果。我可以设置新的类,即旋转,但一旦任务完成,我就无法重置它。有没有更好的方法呢?

标签: c#asp.net

解决方案


这样,您将永远无法使其恢复为非旋转状态,因为当您的线程完成时,您无法通知客户您制作它的方式。

我可以思考和建议两种方法

第一种方式 - ajax 调用

好的,这是最常见的方法,对 aspx 文件进行 ajax 调用并等待返回。你可以找到很多这样的例子......

第二种方式 - 你的方式

在长时间运行的函数之前使用刷新在页面内进行计算调用- 当计算完成时,页面将继续呈现其余部分并更改回图标。

这是一个工作示例。

在 aspx 页面上

<form id="form1" runat="server">
    <div>
        <h1 id="changeme" style="color:blue">Header Test</h1>
    </div>
</form>

<%Response.Flush();%>
<%GenerateReport();%>            

<script>
    document.getElementById("changeme").style.color = "red";
</script>

在后面的页面上

public void GenerateReport()
{
    // simulate the delay
    Thread.Sleep(5000);
}

最后的话

避免此网页上的异步,不是您不想保留用户界面呈现的桌面编程。这里用户在另一台计算机上,默认情况下对您的调用是一个新线程,是另一台计算机的线程。所以这一切都是在没有任何额外的新线程创建的情况下完成的。


推荐阅读