【问题标题】:Ext.Net Button Event not firingExt.Net 按钮事件未触发
【发布时间】:2011-02-10 14:15:51
【问题描述】:

我正在使用 Ext.Net,但遇到了问题。

我正在创建动态按钮。它正在工作,但如果我点击,按钮事件不起作用。:(

我该如何解决?

我的代码:

foreach (var events in eventsInformation)
{
    Ext.Net.Button btn = new Ext.Net.Button();
    btn.ID = events.EvtId.ToString();
    btn.Text = events.EvtName;
    btn.Click += new EventHandler(Tickets_click);
    ViewPort1.Controls.Add(btn);
}

【问题讨论】:

    标签: c# asp.net extjs ext.net


    【解决方案1】:

    原始样本中有几处需要更正:

    1. 默认情况下,Ext.NET 按钮组件 AutoPostBack(即重新加载整个页面)。如果您想与服务器通信并避免重新加载完整的页面,建议使用 DirectEvents(Ajax 调用)。
    2. Ext.NET 组件应添加到父 .Items 集合,而不是 .Controls 集合。

    这是一个包含这两个更正的完整演示。

    示例

    <%@ Page Language="C#" %>
    
    <%@ Register assembly="Ext.Net" namespace="Ext.Net" tagprefix="ext" %>
    
    <script runat="server">
        protected override void OnInit(EventArgs e)
        {
            Ext.Net.Button btn = new Ext.Net.Button();
    
            btn.Text = "Submit (AutoPostBack)";
            btn.Click += Button1_Click;
    
            // 1. Set to AutoPostBack, default is "false"
            btn.AutoPostBack = true;
    
            // 2. Add Button to .Items Collection    
            this.ViewPort1.Items.Add(btn);
    
            base.OnInit(e);
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            X.Msg.Notify("Server Time", DateTime.Now.ToLongTimeString()).Show();
        }
    </script>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Ext.NET Example</title>
    </head>
    <body>
        <form runat="server">
            <ext:ResourceManager runat="server" />
    
            <ext:Viewport ID="ViewPort1" runat="server" />
        </form>
    </body>
    </html>
    

    现在,我建议您将 AutoPostBack 按钮单击事件更改为 DirectEvent 单击。这将需要对代码隐藏进行以下三个修改。

    示例

    <script runat="server">
        protected override void OnInit(EventArgs e)
        {
            Ext.Net.Button btn = new Ext.Net.Button();
    
            btn.Text = "Submit (DirectEvent)";
    
            // 2. CHANGE to .DirectClick 
            btn.DirectClick += Button1_Click;
    
            // 3. REMOVE btn.AutoPostBack = true;
    
            this.ViewPort1.Items.Add(btn);
    
            base.OnInit(e);
        }
    
        // 3. CHANGE "EventArgs" to "DirectEventArgs"    
        protected void Button1_Click(object sender, DirectEventArgs e)
        {
            X.Msg.Notify("Server Time", DateTime.Now.ToLongTimeString()).Show();
        }
    </script>
    

    希望这会有所帮助。

    【讨论】:

    • +1 来自我 - 如果 Ext.Net 先生 不能给出正确的答案,谁能!? ;-)
    【解决方案2】:

    使用 Ext.net DirectMethod 而不是 ASP.NET 回发事件处理程序。

    <ext:Button ID="Button1" runat="server" Text="Click Me" Icon="Lightning">
        <Listeners>
            <Click Handler="Ext.net.DirectMethods.SetTimeStamp();" />
        </Listeners>
    </ext:Button>            
    
    
    <script runat="server">
    [DirectMethod]
    public void SetTimeStamp()
    {
        this.Label1.Text = string.Concat("Server Time: ", DateTime.Now.ToLongTimeString());
    }
    

    【讨论】:

      【解决方案3】:

      ASP.NET Page Life Cycle Overview 开始。如果您以编程方式将控件添加到 asp.net 页面,那么您应该熟悉它,如果您还没有的话 =)

      现在按照这个清单进行操作:

      1. 您是否总是将组件(在此实例中为按钮)添加到页面?如果您不总是添加它们,那么在回发时,它们将不会出现在 EventHandler 被连接到的位置,以便处理程序触发。 (这可能不适用于由 DirectEvent 触发的 Ext.Net 按钮,但不会造成伤害)。
      2. 您的 web.config 文件中是否有“通常的”Ext.Net 处理程序/模块注册以支持处理直接事件?
      3. 您是否确认没有收到任何阻止事件处理程序的 javascript 客户端错误?
      4. 使用Fiddler 之类的内容来验证事件是否确实触发了返回服务器的 DirectEvent。

      【讨论】:

        【解决方案4】:
        <ext:Button ID="extBtn1" runat="server" Text="Cancel">
            <DirectEvents>
                <Click OnEvent="extBtn1Click">
                    <EventMask ShowMask="true" />
                </Click>
            </DirectEvents>
        </ext:Button>
        

        此 extBtn1Click 事件将在服务器端触发。

        【讨论】:

          【解决方案5】:

          触发事件时按钮不存在。这就是为什么它不起作用。如果你在 aspx 文件中构建一些测试按钮,它会工作得很好。

          解决方案:您必须在 OnInit 事件期间构造按钮,以便在单击按钮后的新页面循环期间它会出现并绑定到 EventHandler。

          【讨论】: