2012-11-18 39 views
0

我遇到了麻煩,我無法弄清楚。 我有一個asp:gridview(sqldatasource)與項目模板內的asp:dropdownlist的數據綁定。下拉列表有一個onSelectedIndexChanged事件監聽器,但它不會觸發。asp.net asp:DropDownList onSelectedIndexChanged沒有在數據綁定中發射asp:GridView

這裏的標記:

<asp:ScriptManager ID="ScriptManager1" runat="server"> 

</asp:ScriptManager> 
<asp:UpdatePanel runat="server" ID="UpdatePanel1"> 
    <ContentTemplate> 
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
     EmptyDataText="There are no data records to display." EnableViewState="True" > 
     <Columns> 
      <asp:TemplateField HeaderText="Delete user"> 
       <ItemTemplate> 
        <asp:Button runat="server" ID="btnDelete" CommandName="Delete" CommandArgument='<%# Eval("UserId") %>' 
         Text="Delete" OnCommand="DeleteUser" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="Block users"> 
       <ItemTemplate> 
        <asp:Button runat="server" ID="btnBlock" CommandName="Block" CommandArgument='<%# Eval("UserId") %>' 
         Text="Block" OnClick="btnBlock_Click" Visible='<%# !Convert.ToBoolean(Eval("IsLockedOut")) %>' /> 
        <asp:Button runat="server" ID="btnDeblock" CommandName="Deblock" CommandArgument='<%# Eval("UserId") %>' 
         Text="Deblock" OnClick="btnBlock_Click" Visible='<%# Convert.ToBoolean(Eval("IsLockedOut")) %>' /> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField HeaderText="Change role"> 
       <ItemTemplate> 
        <asp:DropDownList ID="ChangeRole" runat="server" EnableViewState="false" 
         OnSelectedIndexChanged="ChangeRole_SelectedIndexChanged" AutoPostBack="true" 
         ToolTip='<%# Bind("UserName") %>' > 
         <asp:ListItem Text="Choose a role" Value="" Selected="True" /> 
         <asp:ListItem Text="Admin" Value="" /> 
         <asp:ListItem Text="Member" Value="" /> 
         <asp:ListItem Text="Visitor" Value="" /> 
        </asp:DropDownList> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:BoundField DataField="RoleName" HeaderText="Current role" ReadOnly="true" SortExpression="RoleName" /> 
      <asp:BoundField DataField="UserName" HeaderText="Username" ReadOnly="True" SortExpression="UserName" /> 
      <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" /> 
      <asp:BoundField DataField="LastLoginDate" HeaderText="Last login" 
       SortExpression="LastLoginDate" /> 
      <asp:CheckBoxField DataField="IsLockedOut" HeaderText="Locked" 
       SortExpression="IsLockedOut" /> 
      <asp:BoundField DataField="FailedPasswordAttemptCount" 
       HeaderText="Failed logins" 
       SortExpression="FailedPasswordAttemptCount" /> 
      <asp:BoundField DataField="Comment" HeaderText="Comments" 
       SortExpression="Comment" /> 
     </Columns> 
    </asp:GridView> 
    <asp:Label ID="lblSuccess" runat="server" Text="Database updated successfully." Visible="false" meta:resourcekey="success" /> 
    <asp:Label ID="lblError" runat="server" Text="An error occured, database was not updated." /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

,因爲我想這可能是相關的我已經添加UpdatePanel的代碼。 在後面的代碼,我確信綁定在GridView只有!Page.IsPostBack

protected void Page_Load(object sender, EventArgs e) 
{ 

    if (!Page.IsPostBack) 
    { 
     GridView1.DataSourceID = "SqlDataSource1"; 
     GridView1.DataKeyNames = new String[] {"UserId"}; 
     GridView1.DataBind(); 
    } 
} 

然後我做了一個ActionListener的下拉列表

protected void ChangeRole_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Logger.Info("it's alive!", "Chaning role"); 
} 

我已經嘗試過的EnableViewState =「真|| False「(對於gridview和dropdownlist)和autoPostBack =」True || False「,但日誌文件不顯示」它是活着的「消息。改變索引時沒有觸發事件。

任何想法?

回答

6

好的,

我終於找到了解決方案。搜索互聯網顯示這不是一個罕見的問題。然而,解決方案永遠不會太遙遠。

首先,我在我的網頁上改變了一切(包括頁面指令,GridView控件,updatetemplate和下拉列表)來的EnableViewState =「真」, 然後我設置的AutoPostBack =「真正的」我的下拉列表, 最後,我需要做確保我沒有綁定gridview和page_load方法中的數據,因爲生命週期中的這個階段已經重新綁定了下拉列表,並且在onselectedindexchanged事件可以被觸發之前將它們的selectedindex設置回默認值。

我只是讓gridview像往常一樣通過設置它的datasourceid來完成綁定。 在我的搜索過程中,我看到很多人有類似的問題,我認爲這應該解決很多問題。或者至少它值得一擊:)

+1

乾杯更新到您的問題 – MVCKarl

+0

謝謝。 ..我很高興結束了! – DerpyNerd

0

嘗試改變的GridView這樣

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" EmptyDataText="There are no data records to display." EnableViewState="True" DataSource="SqlDataSource1" DataKeyNames="UserId" > 

明確在Page_Load功能

protected void Page_Load(object sender, EventArgs e) 
{ 
} 
+0

不好, 如果我這樣做,我就會開始我的工作。這沒有工作要麼 – DerpyNerd

+1

http://stackoverflow.com/questions/341080/asp-net-dropdownlist-autopostback-not-working-what-am--missing –

+0

好信息,但這並沒有解決我的問題... 我仍然無法得到onselectedindexchanged事件觸發 – DerpyNerd

1

你試圖改變DropDownList中的視圖狀態爲 「true」:

<asp:DropDownList ID="ChangeRole" runat="server" EnableViewState="true" OnSelectedIndexChanged="ChangeRole_SelectedIndexChanged" AutoPostBack="true" ...

如果下拉的狀態在回發之間被遺忘,那麼索引不會改變,因此SelectedIndexChange事件不會觸發。

+0

是的,我試過每一個組合... 我找到了解決方案,並會在一分鐘後發佈 – DerpyNerd

1

設置DropDownList的AutoPostBack="true"

,並設置更新面板將UpdateMode總是這樣

<asp:UpdatePanel runat="server" ID="UpdatePanel1" UpdateMode="Always"> 

或一組處理的DropDownList的SelectedIndexChanged事件觸發。

+0

好的輸入...我幾天前才知道updatemode。 我試過觸發器,但由於某種原因它不會觸發:( 那麼,它現在都在過去:) – DerpyNerd

+0

:)當問題得到解決時,一切都很好..無論是通過鉤子還是騙子。 ! :) – writeToBhuwan

3

就像你說的那樣不是一個不常見的問題。我有同樣的問題我自己,所以我想用一個檢查清單有助於排除一些比較常見的問題:

  • 確保ViewState中被激活,EnableViewState="True"
  • 如果上面點不也行檢查是否有父元素具有的ViewState禁用
  • 激活後回AutoPostBack="True"
  • 確保您dababining發生只有如果它不是一個回傳if(!Page.IsPostBack),ViewState中會保存CH選擇選項,併爲您的表格(如果你有一個)

這就是我現在想的所有:)希望它可以幫助任何人!

0

雖然這是一篇舊文章,但我希望它仍然有所貢獻。

我有同樣的問題,對我來說,解決方案是爲ListItems的「Value」屬性設置值。所以改變代碼如下:

<asp:DropDownList ID="ChangeRole" runat="server" EnableViewState="false" 
OnSelectedIndexChanged="ChangeRole_SelectedIndexChanged" AutoPostBack="true"      ToolTip='<%# Bind("UserName") %>' > 
<asp:ListItem Text="Choose a role" Value="0" Selected="True" /> 
<asp:ListItem Text="Admin" Value="1" /> 
<asp:ListItem Text="Member" Value="2" /> 
<asp:ListItem Text="Visitor" Value="3" /> 
</asp:DropDownList> 

希望這會幫助別人。

0

這解決了我的問題:CausesValidation="False" Here是細節。

+0

如果將autpostback和EnableViewState設置爲false,它仍然可以工作嗎?如果是這樣,那麼我想這將是驗證失敗的具體情況 – DerpyNerd

相關問題