c# - 在运行时更改字体真棒图标类
问题描述
我有一个包含文本框和按钮的用户控件。我在 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 的属性来实现旋转效果。我可以设置新的类,即旋转,但一旦任务完成,我就无法重置它。有没有更好的方法呢?
解决方案
这样,您将永远无法使其恢复为非旋转状态,因为当您的线程完成时,您无法通知客户您制作它的方式。
我可以思考和建议两种方法
第一种方式 - 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);
}
最后的话
避免此网页上的异步,不是您不想保留用户界面呈现的桌面编程。这里用户在另一台计算机上,默认情况下对您的调用是一个新线程,是另一台计算机的线程。所以这一切都是在没有任何额外的新线程创建的情况下完成的。
推荐阅读
- reactjs - 如何使用用户 id 令牌 React Native 和 Firebase 对应存储数据?
- javascript - 数组解构中的 SPREAD 运算符
- apache-spark - Spark UI Executors 选项卡中 --executor-memory 的内存不正确
- python - MySQLdb 在本地工作,但在部署时没有
- python - 如何在 for 循环中只打开一次浏览器?
- kubernetes - Terraform,为什么要使用 Kubernetes 作为额外的层?
- php - 从具有 2 个条件和 3 个表的表中检索信息
- python - 使用 ElementTree 解析 XML 数据(NONE 或无数据)
- java - 如何使用内部区域?
- javascript - 如何制作具有该功能的滑块(html、css、js)