C# 委托不在asp.net中工作

C# 委托不在asp.net中工作,c#,asp.net,C#,Asp.net,我很难让我的代表去工作。基本上我希望它能正常工作,这样当用户第一次点击按钮时,标签会显示第三名的司机,当他们第二次点击按钮时,标签将被清除,排在第二位的车手将显示在其位置,最后当他们第三次点击按钮时,将显示比赛的获胜者 这是aspx.cs页面 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.We

我很难让我的代表去工作。基本上我希望它能正常工作,这样当用户第一次点击按钮时,标签会显示第三名的司机,当他们第二次点击按钮时,标签将被清除,排在第二位的车手将显示在其位置,最后当他们第三次点击按钮时,将显示比赛的获胜者

这是aspx.cs页面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebProgramming3.Week_3
{
    public partial class Exercise1 : System.Web.UI.Page
    {
        static RaceResult UserClick;

       //public int Clicks = 0;

        protected void Page_Load(object sender, EventArgs e)
        {
            UserClick = new RaceResult(0);          

            UserClick.NbrClicksReached += User_Click_NbrClicksReached;             
        }

        private void User_Click_NbrClicksReached(string message)
        {
            lblRaceResults.Text += message;           
        }

        protected void btnRace_Click(object sender, EventArgs e)
        {
            UserClick.BtnClicks++;
        }
    }

    public delegate void StringDelegate(string message);

    public class RaceResult
    {
        public  int BtnClicks { get; set; }

        //Delegate
        public event StringDelegate NbrClicksReached;

        public RaceResult( int btnclicks)
        {
            BtnClicks = btnclicks;
        }

        public void Add(int amount)
        {
            if (BtnClicks == 1)
            {
                if (NbrClicksReached != null)
                    NbrClicksReached("In 3rd place is Kimi Räikkönen");
            }

            if (BtnClicks == 2)
            {
                if (NbrClicksReached != null)
                    NbrClicksReached("In 2nd place is Sebastian Vettel");
            }

            if (BtnClicks >= 3)
            {
                if (NbrClicksReached != null)
                    NbrClicksReached("In 1st place is Lewis Hamilton");
            }
        }
    }
}
这是我的aspx页面

<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="btnFeed" OnClick="btnRace_Click" runat="server" Text="Button" />
        <asp:Label ID="lblRaceResults" runat="server" Text="Label"></asp:Label>
    </div>
    </form>
</body>


如果我的问题不清楚,请随时提出更多问题

您的代码有一些问题。首先,在
Page\u Load
事件中,您不保护全局变量的初始化不受回发的影响。每次在服务器上运行事件(runat=server)时,在控件中声明的事件之前执行
Page\u Load
事件,因此每次都重新初始化
racesult
变量。
此外,静态变量在Web应用程序中不是一个好概念,例如,请参见以下非常好的问题/答案:

因此,重写页面的初始部分是必要的

public partial class Exercise1 : System.Web.UI.Page
{
    private RaceResult UserClick;

   //public int Clicks = 0;

    protected void Page_Load(object sender, EventArgs e)
    {
        // First page load?
        if(!IsPostBack)
        {
             UserClick = new RaceResult(0);          
             UserClick.NbrClicksReached += User_Click_NbrClicksReached;
             Session["UserClick"] = UserClick;
        }
        else
        {
           // Get from first load
           UserClick = Session["UserClick"];
           if(UserClick == null)
           {
             UserClick = new RaceResult(0);          
             UserClick.NbrClicksReached += User_Click_NbrClicksReached;
             Session["UserClick"] = UserClick;
           }
        }
    }
现在,应该调用委托的部分令人困惑。
UserClick.Add
方法调用委托,但您不调用UserClick.Add方法,在显示的代码页面中的任意位置添加。此外,传递给此方法的整数未在其内部使用,因此它似乎没有用处,可以删除。反正

protected void btnRace_Click(object sender, EventArgs e)
{
    // Should not be required but....
    if(UserClick != null)
    {
        UserClick.BtnClicks++;
        // The integer is meaningless in the context of your code above
        // It could be removed because the Add logic is driven 
        // by BtnClicks value
        UserClick.Add(0);
    }
}

问题很清楚。您尚未阅读ASP.Net中的页面生存期。您是否知道,每次单击按钮时,页面加载事件都会在单击事件之前执行?我仍然不确定我应该怎么做,我应该在我的页面加载中添加一个“if(!IsPostBack)”吗?