DayRender runs very late (in Render stage) in the page execution lifecycle, so the button event is never triggered, if you run the following code, you will understand when DayRender runs, also, I have suggested a way to run your event handler<script language="C#" runat="server">
private void calendar_DayRender(object sender, System.Web.UI.WebControls.DayRenderEventArgs e)
{  
 if (e.Day.Date==DateTime.Now.Date)
 {
   Button but=new Button();
   but.Text="按钮";
   but.ID = "mybutton";
   e.Cell.Controls.Add(but);
   //but.Click+=new EventHandler(this.button_click);
   Response.Write("in DayRender");
   hidButton.Value = but.UniqueID;
 }
}
private void button_click(object sender, System.EventArgs e)
{
  this.txtYear.Text="9999";
}override protected void Render (HtmlTextWriter htw)
{
  Response.Write("in Render--begin");
  base.Render(htw);
  Response.Write("in Render--end");
}private void Page_Load(object sender, System.EventArgs e)
{
  if (Request.Form[hidButton.Value] != null)
button_click(null,EventArgs.Empty);
}</script><form runat="server">
<asp:Calendar id="Cal" runat="server" OnDayRender="calendar_DayRender" />
<asp:TextBox id="txtYear" runat="server" />
<input type="hidden" runat="server" id="hidButton" />
</form>