前台页面是:
<form id="Form1" method="post" runat="server">
  <asp:repeater id="myRepeater" runat="server">
    <ItemTemplate>
      <tr>
      <td><%# DataBinder.Eval(Container.DataItem, "au_lname") %></td>
      <td><%# DataBinder.Eval(Container.DataItem, "address") %></td>
      <td><asp:Button ID="btBuy" Text='<%# DataBinder.Eval(Container.DataItem,"au_lname")%>' CommandArgument='<%# DataBinder.Eval(Container.DataItem,"au_lname")%>' runat="server">
</asp:Button></td>
      </tr>
      </ItemTemplate>
      <HeaderTemplate>
        <table border="1">
<tr>
  <td>作者</td>
  <td>地址</td>
  <td>联系</td>
</tr>
      </HeaderTemplate>
      <FooterTemplate>
</table>
      </FooterTemplate>
  </asp:repeater>
</form>代码如下:
private void Page_Load(object sender, System.EventArgs e) {
// 在此处放置用户代码以初始化页面
  if(!IsPostBack){
    OleDbConnection myCon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("data/ime.mdb"));
    myCon.Open();
    OleDbCommand myCmd = new OleDbCommand("select * from Authors",myCon);
    this.myRepeater.DataSource = myCmd.ExecuteReader();
    this.myRepeater.DataBind();
    myCon.Close();
  }
}private void myRepeater_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) {
    Response.Write(e.CommandArgument.ToString());
}=========================================================================
问题是:为何非要把代码放在!IsPostBack中呢?
我的理解是:去掉IsPostBack,即使点击Button按钮,页面回发了,Repeater控件值从数据库重新绑定了,那CommandArgument的值还在啊?
但实际情况:我去掉IsPostBack后,点击Button按钮,Response.Write(e.CommandArgument.ToString());这条语句的值显示不出来。
到底是怎么回事啊,我想破脑袋也想不通这种机制到底是怎么回事?

解决方案 »

  1.   

    每次觸發服務器事件的時候都會pageload一次,用ispostback當然並非固定,而是實乎你個人需要
    例如你一開始要填充DropDownList,當然只是填充一次就夠了,不用每觸發一次事件就填充一次,這樣效能會很低的
      

  2.   

    我知道IsPostBack的用处,现在的问题是为什么去掉它后页面回发了, 
    private void myRepeater_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) {
        Response.Write(e.CommandArgument.ToString());
    }
    这个事件怎么处理不了?
      

  3.   

    IsPostBack 第1次运行页面的时候,它设置为false  每次响应服务器回传事件再运行页面时侯,它设置为true
      

  4.   

    举个简单的例子给你.a.aspx打开时page_load会执行一次.在你触发事件比如Button,index_change等等时,系统不是先执行那些事件里的代码,而是又一次执行page_load里的代码.这就会给很多问题产生影响.这时你就会想到了ispostback,用它做初始化设置.
    还有,居然是学MS的工具,就不要问那么多原因,知道是这么回事就好了.不然就可能被那些问题折磨死.
      

  5.   

    按:caobob(我是一个程序员) 的说法,就是myRepeater_ItemCommand事件冒泡后,页面回发,执行了Page_load里的事件,而忽略了myRepeater_ItemCommand的事件?
      

  6.   

    对的,他不是先执行myRepeater_ItemCommand这个,再执行page_load.你自己设断点看看就知道了.
      

  7.   

    谢谢caobob(我是一个程序员) ,我在设myRepeater_ItemCommand处断点看了一下,如果没加IsPostBack,点击按钮回发页面后,只执行了Page_Load事件,而myRepeater_ItemCommand没有执行!
      

  8.   

    页面回发后,如果重新绑定数据到Repeater控件,Repeater_ItemCommand事件则没有执行!
    但页面回发后,如果重新绑定数据到DataList控件,DataList_EditCommand事件则是可以继续执行的???(我设断点看了一下,DataList_EditCommand事件可以继续执行)
      

  9.   

    把绑定的功能做个private函数.在需要调用的时候调用,那样你在做程序时就比较清楚了.具体的数据如何绑定应该让数据类去完成.你的函数只是引用方法输入参数.我一般就是这么做的.了解ASP.NET的一些运行机制后,处理起来并不复杂.