c#如何在“处理”按钮事件时更改按钮图标/格式?

时间:2017-07-12 11:03:19

标签: c# asp.net

我在代码后面创建了几个服务器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吗?我们可以创建一个解决方法来触发事件两次吗?第一次更改图标并执行工作,第二次更改图标?其他想法?

1 个答案:

答案 0 :(得分:2)

正如您所说,由于页面循环,您将无法看到页面加载和按钮点击事件之间的图标更改。

所以我建议在这种情况下使用一些Javascript作为@Mauricio在他的评论中建议。

您可以添加新的客户事件basePipelineIndex

VkComputePipelineCreateInfo

现在,只需单击客户端上的按钮,此图标就会出现,当页面刷新时,它将根据您登录服务器端按钮单击事件而消失。

肯定你需要在javascript中添加你的登录,因为它不像我写的那么简单,但我只想告诉你我如何解决这个问题。