2010-02-17 20 views
1

我有一個簡單的嵌套中繼器的項目。當我點擊按鈕時,OnItemCommand事件不被調用,但OnItemCreated被調用(但是,它不調用Page_Load事件處理程序)。我在誤解什麼?.NET嵌套中繼器 - 按鈕點擊調用OnItemCreated eventhandler,而不是OnItemCommand

MARKUP

<table width="100%"> 
    <tr> 
     <td>my row</td> 
     <td>my description</td> 
    </tr> 
    <asp:Repeater ID="rptMain" runat="server" OnItemCreated="rptMain_ItemCreated" OnItemCommand="rptMain_ItemCommand"> 
     <ItemTemplate> 
     <tr style="background-color:#45abdc;"> 
      <td><asp:LinkButton ID="ibtnDoSomething" runat="server" CommandArgument="SELECT" Text="Clicky" /></td> 
      <td><asp:Label ID="lblMainData" runat="server"></asp:Label></td> 

     </tr> 
     <asp:Repeater ID="rptChild" runat="server" OnItemCreated="rptChild_ItemCreated"> 
      <ItemTemplate> 
       <tr style="background-color:#bcbbcb;"> 
        <td> 

        </td> 
        <td> 
         <asp:Label ID="lblChildData" runat="server"></asp:Label> 
        </td> 

       </tr> 

      </ItemTemplate> 
     </asp:Repeater> 
     </ItemTemplate> 
    </asp:Repeater> 

    </table> 

代碼隱藏 的DataTable _childdata =新數據表(); DataTable _data = new DataTable();

 public void Page_Load() 
     { 

      _data.Columns.Add(new DataColumn("Text")); 
      _data.Columns.Add(new DataColumn("CommandValue")); 

      DataRow _row1 = _data.NewRow(); 
      _row1["Text"] = "Butch"; 
      _row1["CommandValue"] = "31"; 
      DataRow _row2 = _data.NewRow(); 
      _row2["Text"] = "Karl"; 
      _row2["CommandValue"] = "2"; 
      DataRow _row3 = _data.NewRow(); 
      _row3["Text"] = "Suzie"; 
      _row3["CommandValue"] = "8"; 
      DataRow _row4 = _data.NewRow(); 
      _row4["Text"] = "Kara"; 
      _row4["CommandValue"] = "31"; 

      _data.Rows.Add(_row1); 
      _data.Rows.Add(_row2); 
      _data.Rows.Add(_row3); 
      _data.Rows.Add(_row4); 




      _childdata.Columns.Add(new DataColumn("Text")); 
      _childdata.Columns.Add(new DataColumn("CommandValue")); 

      DataRow _crow1 = _childdata.NewRow(); 
      _crow1["Text"] = "Butch"; 
      _crow1["CommandValue"] = "Cupcakes"; 
      DataRow _crow2 = _childdata.NewRow(); 
      _crow2["Text"] = "Karl"; 
      _crow2["CommandValue"] = "Cheese"; 
      DataRow _crow3 = _childdata.NewRow(); 
      _crow3["Text"] = "Suzie"; 
      _crow3["CommandValue"] = "Pizaa"; 
      DataRow _crow4 = _childdata.NewRow(); 
      _crow4["Text"] = "Kara"; 
      _crow4["CommandValue"] = "Tofu"; 
      DataRow _crow5 = _childdata.NewRow(); 
      _crow5["Text"] = "Butch"; 
      _crow5["CommandValue"] = "Bacon"; 
      DataRow _crow6 = _childdata.NewRow(); 
      _crow6["Text"] = "Karl"; 
      _crow6["CommandValue"] = "Ham"; 

      _childdata.Rows.Add(_crow1); 
      _childdata.Rows.Add(_crow2); 
      _childdata.Rows.Add(_crow3); 
      _childdata.Rows.Add(_crow4); 
      _childdata.Rows.Add(_crow5); 
      _childdata.Rows.Add(_crow6); 

      rptMain.DataSource = _data; 
      rptMain.DataBind(); 

     } 

     public void rptMain_ItemCreated(object sender, RepeaterItemEventArgs e) 
     { 

      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      { 
       DataRowView drv = (DataRowView)e.Item.DataItem; 

       LinkButton ibtn = e.Item.FindControl("ibtnDoSomething") as LinkButton; 
       Label mainLabel = e.Item.FindControl("lblMainData") as Label; 
       ibtn.CommandArgument = drv["CommandValue"].ToString(); 
       mainLabel.Text = drv["Text"].ToString(); 
       DataView _dv = new DataView(_childdata, "Text = '" + drv["Text"].ToString() + "'", "Text", DataViewRowState.CurrentRows); 
       Repeater _rptChild = e.Item.FindControl("rptChild") as Repeater; 
       _rptChild.DataSource = _dv; 
       _rptChild.DataBind(); 
      } 

     } 

     public void rptChild_ItemCreated(object sender, RepeaterItemEventArgs e) 
     { 
      if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      { 

       Label childLabel = e.Item.FindControl("lblChildData") as Label; 
       DataRowView drv = (DataRowView)e.Item.DataItem; 
       childLabel.Text = drv["Text"].ToString(); 

      } 
     } 

     public void rptMain_ItemCommand(object sender, RepeaterCommandEventArgs e) 
     { 
      Console.Write("fdasdfsa"); 
     } 
+0

我已經進一步調查的那些討厭的回發解僱,它甚至不必須是一個嵌套的中繼器。我刪除了子中繼器,按鈕點擊仍然調用ItemCreated事件處理程序。奇怪的。 – jimbo 2010-02-17 15:57:13

回答

1

中繼器將在回發期間重新創建。這就是OnItemCreated事件觸發的原因。 OnItemCommand未被調用的原因是因爲您的OnItemCreated事件中發生異常。該物業

e.Item.DataItem 

不可用於回發並返回null。因此,當您嘗試訪問它時,您會遇到一個NullReferenceException。

ibtn.CommandArgument = drv["CommandValue"].ToString(); 

您最終得到NullReferenceException。

+0

我在Page_Load中添加了Postback檢查,但仍然中斷。然後,我在ItemCreated邏輯周圍添加了回發檢查,它可以工作。奇怪的是,生命週期似乎是ItemCreated - > Page_Load - > ItemCommand。我不能想到任何時候我看到過這樣的Repeater控件,它通常是Page_Load - > ItemCommand。我不太確定是什麼原因造成的。 – jimbo 2010-02-17 17:23:45

+0

請記住,您的控件必須在頁面生命週期開始時由asp.net重新創建。這發生在Page_Load之前,所以這就是您在Page_Load事件之前看到ItemCreated事件的原因。 – 2010-02-17 17:43:08

0

你需要在你的linkbutton控件上指定一個CommandName屬性嗎?

+1

我沒有添加它是安全的,但我不認爲它調用ItemCommand事件處理程序的必要性。 – jimbo 2010-02-17 17:20:54

1

這個工作對我停止Item_Created

protected void On_Item_Created(Object sender, DataListItemEventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     //Do stuff 
    } 
} 
相關問題