我HtmlButton
在后面的代码中创建了几个 server ,如下所示:
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
问题的吗?我们可以创建一个解决方法来触发事件两次吗?第一次更改图标并工作,第二次更改图标?其他想法?
正如您所说,由于页面循环,您将无法看到页面加载和按钮单击事件之间的图标变化。
所以我建议在这种情况下使用一点 Javascript,就像@Mauricio 在他的评论中建议的那样。
您可以添加新的客户端事件 OnClientClick="showIcon"
function showIcon()
{
document.getElementById('#myBtnId').innerHTML = <i class='fa fa-spinner fa-pulse btn-red'/></i>"
}
现在这个图标会在点击客户端的按钮后出现,当他刷新页面时,它会根据你的登录服务器端按钮点击事件消失。
当然,您需要在 javascript 中添加您的登录信息,因为它不像我写的那么简单,但我只是想告诉您我将如何解决这个问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句