2010-07-13 81 views
0

我在asp.net上比較新。ImageButton問題 - CommandArgument不起作用

我試圖使用ImageButton鏈接到另一個頁面。 ImageButton的是一箇中繼器內,代碼如下:

<ul id = "ulMap"> 
    <asp:Repeater ID="Repeater1" runat="server" > 
     <ItemTemplate> 
      <li> 
       <asp:ImageButton ID="ImageButton1" 
           CommandArgument='<%#Eval("Nav_ID") %>' 
           runat="server" 
           ImageUrl="~/Icons/Ny_mappa.png" 
           onclick="ImageButton1_Click" /> 
       <br /> 
       <asp:LinkButton ID="lnkButton" 
           CommandArgument='<%#Eval("Nav_ID") %>' 
           runat="server" 
           onclick="LinkButton3_Click" 
           Text='<%#Eval("Nav_Name") %>'></asp:LinkButton> 
      </li> 
     </ItemTemplate> 
    </asp:Repeater> 
</ul> 

而後面的代碼如下:

protected void LinkButton3_Click(object sender, EventArgs e) 
{ 
    Guid guid = new Guid(((LinkButton)sender).CommandArgument); 

    var query = from n in dc.Nemanet_Navigations 
       where n.UserId == userGuid && n.Nav_pID == guid 
       orderby n.Nav_Name ascending 
       select n; 

    Repeater1.DataSource = query; 
    Repeater1.DataBind(); 
} 

protected void ImageButton1_Click(object sender, ImageClickEventArgs e) 
{ 
    Guid guid = new Guid(((ImageButton)sender).CommandArgument); 

    var query = from n in dc.Nemanet_Navigations 
       where n.UserId == userGuid && n.Nav_pID == guid 
       orderby n.Nav_Name ascending 
       select n; 

    Repeater1.DataSource = query; 
    Repeater1.DataBind(); 
} 

那麼,對於這LinkButton工作正常,但不是爲ImageButtonProtected void ImageButton1_Click從未發生過。任何人都可以幫忙嗎?

回答

3

我瘦你需要處理Repeater_ItemCommand事件,以使其正常工作。它也可能會節省一些代碼。

MSDN Repeater ItemCommand

另外,如果你要鏈接到另一個頁面,你需要回發到頁面,然後執行某種重定向或會更有意義,在新的頁面邏輯是什麼?

1

您無法處理像這樣的轉發器子控件的服務器端事件。

想想這樣 - 如果有100個按鈕,每個按鈕需要100個事件處理程序。 ImageButton1_Click將僅適用於ID爲1的ImageButton。

答案是爲您的中繼器連接ItemCommand事件。

像這樣:

<asp:repeater id = "Repeater`" runat = "server" onItemCommand = "SomeEvent"> 

然後你辦理觸發此事件的所有按鈕 「SomeEvent」:

protected void SomeEvent (Object src, RepeaterCommandEventArgs e) { 
     var whoClickedMe = ((ImageButton) e.CommandSource); 
} 

Here's在這樣的好文章。

2

而不是OnClick,你應該應該OnCommand。喜歡這個。

<ul id = "ulMap"> 
    <asp:Repeater ID="Repeater1" runat="server" > 
     <ItemTemplate> 
      <li> 
       <asp:ImageButton ID="ImageButton1" 
           CommandArgument='<%#Eval("Nav_ID") %>' 
           runat="server" 
           ImageUrl="~/Icons/Ny_mappa.png" 
           OnCommand="ImageButton1_Click" /> 
       <br /> 
       <asp:LinkButton ID="lnkButton" 
           CommandArgument='<%#Eval("Nav_ID") %>' 
           runat="server" 
           OnCommand="LinkButton3_Click" 
           Text='<%#Eval("Nav_Name") %>'></asp:LinkButton> 
      </li> 
     </ItemTemplate> 
    </asp:Repeater> 
</ul> 

這(注意CommandEventArgs而不是EventArgs的和ImageClickEventArgs):

protected void LinkButton3_Click(object sender, CommandEventArgs e) 
{ 
    Guid guid = new Guid(e.CommandArgument); 

    var query = from n in dc.Nemanet_Navigations 
       where n.UserId == userGuid && n.Nav_pID == guid 
       orderby n.Nav_Name ascending 
       select n; 

    Repeater1.DataSource = query; 
    Repeater1.DataBind(); 
} 

protected void ImageButton1_Click(object sender, CommandEventArgs e) 
{ 
    Guid guid = new Guid(e.CommandArgument); 

    var query = from n in dc.Nemanet_Navigations 
       where n.UserId == userGuid && n.Nav_pID == guid 
       orderby n.Nav_Name ascending 
       select n; 

    Repeater1.DataSource = query; 
    Repeater1.DataBind(); 
}