简体   繁体   English

asp.net asp:DropDownList onSelectedIndexChanged在数据绑定的asp:GridView中不触发

[英]asp.net asp:DropDownList onSelectedIndexChanged not firing in databound asp:GridView

I'm having troubles with this and I can't figure it out. 我对此感到烦恼,无法解决。 I have a databound asp:gridview (sqldatasource) with an asp:dropdownlist inside an itemtemplate. 我在itemtemplate内有一个数据绑定的asp:gridview(sqldatasource)和一个asp:dropdownlist。 The dropdownlist has an onSelectedIndexChanged event listener but it doesn't fire. 下拉列表具有onSelectedIndexChanged事件侦听器,但不会触发。

Here's the markup: 这是标记:

<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>

I've added the updatepanel code because I figured it might be relevant. 我添加了updatepanel代码,因为我认为它可能是相关的。 In the code behind, I made sure to bind the gridview only if !Page.IsPostBack 在后面的代码中,我确保仅在!Page.IsPostBack时绑定gridview。

protected void Page_Load(object sender, EventArgs e)
{

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

Then I made an actionlistener for the dropdownlist 然后我为下拉列表创建了一个动作监听器

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

I already tried enableViewState="True || False" (for both gridview and dropdownlist) and autoPostBack="True || False" in both directions but the logfile doesn't show the "It's alive" message. 我已经在两个方向上尝试过enableViewState =“ True || False”(对于gridview和dropdownlist)和autoPostBack =“ True || False”,但是日志文件未显示“ It's alive”消息。 The event hasn't been triggered on changing index. 该事件尚未在更改索引时触发。

Any ideas? 有任何想法吗?

Alright, 好的,

I've finally found the solution. 我终于找到了解决方案。 Searching the internet reveals this is not an uncommon problem. 在互联网上搜索发现这并不是一个罕见的问题。 The solution however, is never too far away. 但是,解决方案永远不会太遥远。

First I changed everything on my page (including page directive, gridview, updatetemplate and dropdownlist) to EnableViewState="true", Then I set the AutoPostBack="true" on my dropdownlist, Finally, I need to make sure that I'm not binding the gridview with it's data in the page_load method because this phase in the lifecycle already rebinds the dropdownlists and sets their selectedindex back to default before the onselectedindexchanged event can be fired. 首先,我将页面上的所有内容(包括页面指令,gridview,updatetemplate和dropdownlist)更改为EnableViewState =“ true”,然后在dropdownlist上设置了AutoPostBack =“ true”,最后,我需要确保我没有在page_load方法中将gridview与它的数据绑定在一起,因为在生命周期的此阶段已经重新绑定了下拉列表,并将其selectedindex设置回默认值,然后才能触发onselectedindexchanged事件。

I just let the gridview do the binding as usual by setting it's datasourceid. 我只是让gridview通过设置其datasourceid照常进行绑定。 During my search, I've seen many people with a similar issue and I think this should fix a lot of them. 在搜索过程中,我看到很多人遇到类似的问题,我认为这应该可以解决很多问题。 Or at least it's worth a shot :) 或者至少值得一试:)

Like you said its not an uncommon problem. 就像您说的那样,这并不是一个罕见的问题。 I had the same problem myself, therefore I'd like to contribute with a check list to rule out some more common problems: 我本人也遇到了同样的问题,因此我想提供一份检查表以排除一些更常见的问题:

  • Make sure ViewState is activated, EnableViewState="True" 确保ViewState已激活, EnableViewState="True"
  • If above point doesn't work also check if any parent element has ViewState disabled 如果上述方法不起作用,请检查是否有任何父元素禁用了ViewState
  • Activate post back AutoPostBack="True" 激活回发AutoPostBack="True"
  • Make sure your dababining takes place only if its not a postback if(!Page.IsPostBack) , ViewState will save the chosen option and for your form (if you have one) 确保只有在不执行回发if(!Page.IsPostBack) ,您的dababining才会发生,ViewState将保存选定的选项并为您的表单(如果有)

That's all I could think of for now :) hope it helps anyone! 这就是我现在能想到的:)希望它能对任何人有帮助!

have you tried changing the view state of the DropDownList to "true": 您是否尝试过将DropDownList的视图状态更改为“ true”:

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

if the state of the drop down is being forgotten between postbacks then the index wont have changed, hence the SelectedIndexChange event not firing. 如果在回发之间忘记了下拉菜单的状态,则索引不会更改,因此不会触发SelectedIndexChange事件。

Set the AutoPostBack="true" for the DropDownList. 为DropDownList设置AutoPostBack="true"

and set the updatemode of update panel to always like this 并将更新面板的updatemode设置为始终这样

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

Or set a trigger which handles the SelectedIndexChanged event of the DropDownList. 或设置一个触发器来处理DropDownList的SelectedIndexChanged事件。

这解决了我的问题: CausesValidation="False" 是详细信息。

Try change GridView like this 尝试像这样更改GridView

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

clear the Page_Load function 清除Page_Load函数

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

Though this is an old article I hope it still contributes. 尽管这是一篇老文章,但我希望它能有所作为。

I had the same problem, for me the solution was to set values for the "Value" property of a ListItems. 我遇到了同样的问题,对我来说,解决方案是为ListItems的“ Value”属性设置值。 So change the code as follows: 因此,如下更改代码:

<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>

Hope this will help someone. 希望这会帮助某人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM