2011-12-02 80 views
2

我有一個GridView,你可以點擊一行,它應該調用SelectedIndexChanged方法(根據選中的行更新頁面的另一部分)。我之前做過類似於此的工作,並且工作正常,但我似乎無法得到SelectedIndexChanged部分因某種原因而被調用。爲什麼我的GridView的SelectedIndexChanged事件不會觸發?

該頁面,其中有一個form runat="server"標籤的母版頁舉行,和<asp:ScriptManager>標籤

我使用e.Row.Attributes.Add("onclick", ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex))允許SelectedIndexChanged通過點擊行的任意開火。

爲了檢查代碼是否可以正常工作,我添加了一個CommandField,其中SelectButton成功啓動,但我寧願找到一個解決方案,而不必使用它。

代碼在下面 - 任何幫助將不勝感激。由於

GridView

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always"> 
    <ContentTemplate> 
     <asp:HiddenField runat="server" ID="hdnScrollPosition" /> 
     <asp:GridView ID="gridMessages" runat="server" CssClass="gridView" AutoGenerateColumns="False" 
      AllowPaging="true" GridLines="None" PageSize="10" ShowHeader="True" 
      EmptyDataText="--No Messages Received--" Width="100%"> 
      <Columns> 
       <asp:TemplateField HeaderText="Messages Received" HeaderStyle-HorizontalAlign="Left" HeaderStyle-CssClass="headerClass"> 
        <ItemTemplate> 
         .... 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
    </ContentTemplate> 
</asp:UpdatePanel> 

代碼隱藏

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     Me.gridMessages.DataSource = ... 
     Me.gridMessages.DataBind() 
    End If 
End Sub 

Protected Sub gridMessages_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gridMessages.RowDataBound 
    If e.Row.RowType = DataControlRowType.DataRow Then 
     e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#D2E6F8'") 
     e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff'") 

     e.Row.Attributes.Add("onclick", "saveScrollPosition(); " & ClientScript.GetPostBackClientHyperlink(Me.gridMessages, "Select$" & e.Row.RowIndex)) 

    End If 
End Sub 

SelectedIndexChanged(其中不閃光):

Protected Sub gridMessages_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles gridMessages.SelectedIndexChanged 
    Response.Redirect("test.aspx") 
End Sub 

回答

4

您是否需要將一列CommandField定義爲SelectButton?然後,您的標記看起來是這樣的:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always"> 
    <ContentTemplate> 
     <asp:HiddenField runat="server" ID="hdnScrollPosition" /> 
     <asp:GridView ID="gridMessages" runat="server" CssClass="gridView" AutoGenerateColumns="False" 
      AllowPaging="true" GridLines="None" PageSize="10" ShowHeader="True" 
      EmptyDataText="--No Messages Received--" Width="100%"> 
      <Columns> 
       <asp:CommandField ShowSelectButton="true" ButtonType="Button" /> 
       <asp:TemplateField HeaderText="Messages Received" HeaderStyle-HorizontalAlign="Left" HeaderStyle-CssClass="headerClass"> 
        <ItemTemplate> 
         .... 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 
    </ContentTemplate> 
</asp:UpdatePanel> 

你沒問這個,但我總覺得有必要提一下喜歡這些東西兩行:

e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#D2E6F8'") 
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#ffffff'") 

這是一個代碼味道。這不是一個糟糕的之一,但JavaScript屬性與VB/C#代碼混合是一個你應該突破的習慣。如果您需要做這樣的事情,請爲您的GridView添加CssClass屬性,並在CSS中定義這些操作(如果CSS沒有足夠的事件,則爲JavaScript/jQuery)。


編輯:

基於我們的意見的討論,這看起來像在GridView可以被修改的方式不一致。它可能與頁面/事件生命週期有關(不知何故ASP.NET的正確連接事件已爲時過晚?),您最好的選擇是從SelectedIndexChanged事件切換到SelectedIndexChanging

+0

我想,以避免實際使用按鈕來選擇一排,這就是爲什麼我添加上述兩種以下的額外屬性(關於分裂的代碼的建議感謝 - 將這樣做)。該e.Row.Attributes.Add( 「點擊」,ClientScript.GetPostBackClientHyperlink(Me.gridMessages, 「選擇$」 &e.Row.RowIndex))行應該工作,以便在GridView不需要CommandField中。想法? – jdtaylor

+0

嗯...我從來沒有嘗試過這樣的事情。如果你沒有創建按鈕,我不確定ASP.NET會聽什麼(你可能是對的,如果沒有按鈕,它可能會工作得很好)。也許嘗試創建按鈕,以確保您有回發超鏈接的東西完全正確嗎?我認爲,這將是編輯回原始問題的一個很好的細節。 – jwiscarson

+0

剛剛添加按鈕和SelectedIndexChanged在使用時觸發。我之前使用過onclick屬性,它的工作原理,所以我不確定爲什麼它不與這 – jdtaylor

0

使用此:

e.Row.Attributes["onclick"]=ClientScript.GetPostBackEventReference(this.grvDetails,"Select$"+e.Row.RowIndex.ToString()); 
1

我一直在冥思苦想了同樣的問題...

它可能不是你的情況下工作(或者是一件好事,在所有做),但嘗試爲頁面設置EnableEventValidation="false"。這對我來說是不同的。如上所述使用SelectedIndexChangedSelectedIndexChanging事件進行工作。

相關問題