2012-04-12 22 views
1

所以我已經刪除了datasouce並且只有DataBind(),那麼我的頁面仍然在吹動和刷新頁面,而不是在編輯模式下。響應中繼器內的按鈕事件ItemTemplate

我想要做的是當用戶點擊編輯按鈕,然後使其內聯編輯中繼器行。

結束時更新

onItemCommand我已經添加的DataBind()

rpt.DataSource = mydatasource; 
rpt.DataBind(); 

後,我做我的頁面是不是在編輯模式下,它吹走和everyting刷新 我對的Page_Load

if (!IsPostBack) 
{ 
    rpt.DataSource = mydatasource; 
    rpt.DataBind(); 

} 

末更新

我已經多次使用中繼器而沒有問題,但是這裏發生了一些事情。我有一個直放站和我訂閱ItemDataBound事件,但是當我點擊按鈕(這是我的ItemTemplate直放站裏面一個LinkBut​​ton)它不走的ItemDataBound

<asp:Repeater ID="rpt" runat="server" OnItemCommand="rpt_OnItemCommand" OnItemDataBound="rpt_OnItemDataBound"> 
    <ItemTemplate> 
     <li> 
      <asp:Label ID="Label" runat="server" /> 
      <asp:LinkButton ID="LinkButton1" runat="server" CommandName="edit" CommandArgument='<%# Eval("MyID") %>' 
       Text='<%# Eval("Title") %>' /> 
     </li> 
    </ItemTemplate> 
</asp:Repeater> 


    protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e) 
      { 
       if (e.CommandName == "delete") 
       { 
        //Data.Contacts.RemoveAt(e.Item.ItemIndex); 
       } 
       else if (e.CommandName == "edit") 
       { 
        EditIndex = e.Item.ItemIndex; 
       } 
       else if (e.CommandName == "save") 
       { 
        //   
       } 

      } 


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

     if (e.Item.ItemIndex == EditIndex) 
     { 
      // never come to this line.... after the user click on LinkButton 

     } 

     } 
} 

回答

0

不知道這是否有幫助,但您必須調用DataBind()以使OnItemDataBound事件觸發。另外我的猜測是你試圖在OnItemCommand中設置EditIndex,然後在OnDataBind事件中使用該值。按照OnItemDataBound和OnItemCommand的順序觸發事件,所以在這種情況下EditIndex不會是正確的。

將rpt.DataBind添加到OnItemCommand。當我從你的代碼嘗試它時,這是工作的。注意,如果你不使用,你將綁定兩次!IsPostBack用於原始數據綁定。

rpt.DataSource = strings; 

    if (!IsPostBack) 
    { 
     rpt.DataBind(); 
    } 

protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e) 
{ 
     if (e.CommandName == "delete") 
     { 
      //Data.Contacts.RemoveAt(e.Item.ItemIndex); 
     } 
     else if (e.CommandName == "edit") 
     { 
      EditIndex = e.Item.ItemIndex; 
     } 
     else if (e.CommandName == "save") 
     { 
      //   
     } 

    rpt.DataBind(); 

    } 
+0

我認爲你是正確的,但是當我有了數據綁定()我的頁面刷新,我脫離了repter的編輯模式..任何想法? – 2012-04-12 22:04:47

+0

在答案中增加了更多內容。 – tclarkston 2012-04-12 22:09:16

+0

我已更新我的問題 – 2012-04-12 22:11:58

0

你必須改變你的rpt_OnItemCommand功能。

protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e) 
{ 
    if (e.CommandName == "delete") 
    { 
     //Data.Contacts.RemoveAt(e.Item.ItemIndex); 
    } 
    else if (e.CommandName == "edit") 
    { 
     EditIndex = e.Item.ItemIndex; 
    } 
    else if (e.CommandName == "save") 
    { 
     //   
    } 
    else if (e.CommandName == "Complete") 
    { 
     // your function goes here 
    } 
} 
+1

這是怎麼解決這個問題的?看起來你剛剛添加了一個額外的「else if」條件...... – 2012-04-12 21:52:11

+0

當您點擊中繼器內的LinkBut​​ton時,它會觸發rpt_OnItemCommand函數,而不是rpt_OnItemDataBound。你已經在rpt_OnItemDataBound函數裏寫了你的代碼,但是我在rpt_OnItemCommand函數中做了它。 – laltin 2012-04-12 21:55:48

+0

我想知道爲什麼你想在OnItemDataBound函數中運行你的代碼。我認爲在OnItemCommand函數中會更容易。 – laltin 2012-04-12 22:19:34

0

我有點困惑,但從上面的例子來看,它看起來像你已經倒退了。按鈕點擊將從未觸發ItemDataBound事件。只有在每個項目綁定到中繼器後纔會調用ItemDataBound事件。

然而按鈕點擊應該觸發ItemCommand事件,如果沒有發生,我會檢查以確保你已經分配了ItemCommand處理程序,並且確保命令名是有效的。

在旁註中,當每個回發中綁定中繼器時也會發生此行爲。確保你綁定中繼器時!Page.IsPostBack

0

爲什麼您認爲在點擊您的LinkButton時引發了ItemDataBound?僅在調用Repeater.DataBind()時纔會觸發ItemDataBound。 事實上,中繼器的ItemCommand事件被引發。