我在代码后面创建了几个服务器HtmlButton
,如下所示:
HtmlButton button = new HtmlButton();
button.ID = idString + "_btnStart";
button.InnerHtml = "<i class=\"fa fa-play btn-green\"/></i>";
button.Attributes.Add("type", "button");
button.Attributes.Add("runat", "server");
button.Attributes.Add("class", "btn btn-link btn-xs");
button.Attributes.Add("title", "Start");
button.ServerClick += new EventHandler(BtnStart_Click);
ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(button);
每个按钮都有自己的UpdatePanel
:
UpdatePanel uPanel = new UpdatePanel()
{
ID = idString + "_uPanel",
UpdateMode = UpdatePanelUpdateMode.Conditional
};
uPanel.ContentTemplateContainer.Controls.Add(button);
现在,当点击按钮时,我想首先更改InnerHtml
事件中的Page_Load
:
private void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Control control = null;
string controlName = Request.Params.Get("__EVENTTARGET");
if (controlName != null && controlName != string.Empty)
{
control = FindControl(controlName);
if(control != null)
{
HtmlButton button = (HtmlButton)control;
UpdatePanel uPanel = (UpdatePanel)button.Parent.Parent;
string id = button.ID.Split('_')[1];
switch (id)
{
case "btnStop":
button.InnerHtml = "<i class=\"fa fa-spinner fa-pulse btn-red\"/></i>";
break;
case "btnStart":
button.InnerHtml = "<i class=\"fa fa-spinner fa-pulse btn-green\"/></i>";
break;
case "btnRestart":
button.InnerHtml = "<i class=\"fa fa-refresh fa-spin btn-blue\"/></i>";
break;
default:
break;
}
uPanel.Update();
}
}
}
}
然后在事件发生时,将其更改回来:
private void BtnStart_Click(object sender, EventArgs e)
{
HtmlButton button = (HtmlButton)sender;
Debug.WriteLine("Button clicked: " + button.ID);
// sleeping to simulate process stuffs
Thread.Sleep(2000);
button.InnerHtml = "<i class=\"fa fa-play btn-green\"/></i>";
(button.Parent.Parent as UpdatePanel).Update();
}
是否有更“标准”的方法来做这件事还是没关系?
目前自演员表以来它不起作用:
UpdatePanel uPanel = (UpdatePanel)button.Parent;
给我一个错误:
- $ exception {“无法将'System.Web.UI.Control'类型的对象强制转换为'System.Web.UI.UpdatePanel'。”} System.InvalidCastException
它似乎我从 button.Parent
获得的控件无法转换为任何东西。我需要在(button.Parent as UpdatePanel).Update();
中致电Page_Load
才能使用此功能。建议?
修改1:
需要致电:
UpdatePanel uPanel = (UpdatePanel)button.Parent.Parent;
由于第一个父亲是ContentTemplateContainer
。
现在代码运行时没有错误,但图标永远不会更改为fa-spinner
然后再返回。我的意图是,在上面的案例中应该显示fa-spinner
大约2秒钟,然后回到原来的图标。
编辑2:
我意识到由于页面生命周期,我不可能按照我想要的方式执行此操作。页面不在回发Page_Load
和按钮事件之间呈现。因此,即使按钮的InnerHtml
已更改,也不会显示该按钮。所以我需要一种不同的方法。
我们可以强制渲染有问题的UpdatePanel
吗?我们可以创建一个解决方法来触发事件两次吗?第一次更改图标并执行工作,第二次更改图标?其他想法?
答案 0 :(得分:2)
正如您所说,由于页面循环,您将无法看到页面加载和按钮点击事件之间的图标更改。
所以我建议在这种情况下使用一些Javascript作为@Mauricio在他的评论中建议。
您可以添加新的客户事件basePipelineIndex
VkComputePipelineCreateInfo
现在,只需单击客户端上的按钮,此图标就会出现,当页面刷新时,它将根据您登录服务器端按钮单击事件而消失。
肯定你需要在javascript中添加你的登录,因为它不像我写的那么简单,但我只想告诉你我如何解决这个问题。