asp.net asp:DropDownList onSelectedIndexChanged没有在数据绑定asp:GridView中触发

Der*_*erd 0 c# asp.net events gridview databound

我遇到了麻烦,我无法弄明白.我有一个数据绑定asp:gridview(sqldatasource),在itemtemplate中有一个asp:dropdownlist.下拉列表中有一个onSelectedIndexChanged事件侦听器,但它不会触发.

这是标记:

<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>
Run Code Online (Sandbox Code Playgroud)

我添加了updatepanel代码,因为我认为它可能是相关的.在后面的代码中,我确保仅在!Page.IsPostBack时绑定gridview

protected void Page_Load(object sender, EventArgs e)
{

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

然后我为下拉列表创建了一个actionlistener

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

我已经在两个方向上尝试了enableViewState ="True || False"(对于gridview和dropdownlist)和autoPostBack ="True || False",但日志文件没有显示"它是活着的"消息.在更改索引时未触发该事件.

有任何想法吗?

Der*_*erd 6

好的,

我终于找到了解决方案.搜索互联网显示这不是一个罕见的问题.然而,解决方案永远不会太遥远.

首先,我将页面上的所有内容(包括页面指令,gridview,updatetemplate和dropdownlist)更改为EnableViewState ="true",然后在我的下拉列表中设置AutoPostBack ="true",最后,我需要确保我不是将gridview与page_load方法中的数据绑定在一起,因为生命周期中的这个阶段已经重新绑定了下拉列表,并在触发onselectedindexchanged事件之前将其selectedindex设置回默认值.

我只是让gridview像往常一样通过设置它的datasourceid来进行绑定.在我的搜索过程中,我看到很多人有类似的问题,我认为这应该解决很多问题.或者至少值得一试:)