0

我遇到了麻烦,我无法弄清楚。我有一个数据绑定的 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>

我添加了更新面板代码,因为我认为它可能是相关的。在后面的代码中,我确保仅在 !Page.IsPostBack

protected void Page_Load(object sender, EventArgs e)
{

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

然后我为下拉列表制作了一个动作监听器

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

我已经在两个方向上尝试了 enableViewState="True || False" (对于 gridview 和下拉列表)和 autoPostBack="True || False" 但日志文件没有显示“它还活着”消息。更改索引时未触发该事件。

有任何想法吗?

4

7 回答 7

6

好的,

我终于找到了解决方案。搜索互联网表明这不是一个不常见的问题。然而,解决方案永远不会太远。

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

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

于 2012-11-19T02:00:21.083 回答
3

就像你说的,这不是一个罕见的问题。我自己也遇到了同样的问题,因此我想提供一份清单以排除一些更常见的问题:

  • 确保 ViewState 已激活,EnableViewState="True"
  • 如果上述点不起作用,还请检查是否有任何父元素禁用了 ViewState
  • 激活回帖AutoPostBack="True"
  • 确保您的 dababining在它不是回发时发生if(!Page.IsPostBack),ViewState 将保存所选选项并为您的表单(如果您有一个)

这就是我现在能想到的:)希望它对任何人都有帮助!

于 2013-09-12T09:03:20.513 回答
1

您是否尝试过将 DropDownList 的视图状态更改为“true”:

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

如果在回发之间忘记下拉状态,则索引不会更改,因此 SelectedIndexChange 事件不会触发。

于 2012-11-19T01:06:36.733 回答
1

为 DropDownList设置AutoPostBack="true"

并将更新面板的更新模式设置为总是这样

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

或者设置一个触发器来处理 DropDownList 的 SelectedIndexChanged 事件。

于 2012-11-19T13:24:54.117 回答
1

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

于 2017-02-10T13:49:33.470 回答
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)
{
}
于 2012-11-18T23:05:12.413 回答
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>

希望这会对某人有所帮助。

于 2016-06-28T08:03:22.423 回答