我遇到了麻烦,我无法理解。 我有一个数据绑定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>
我添加了updatepanel代码,因为我认为它可能是相关的。 在后面的代码中,我确保仅在!Page.IsPostBack
时绑定gridviewprotected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSourceID = "SqlDataSource1";
GridView1.DataKeyNames = new String[] {"UserId"};
GridView1.DataBind();
}
}
然后我为下拉列表
创建了一个actionlistenerprotected void ChangeRole_SelectedIndexChanged(object sender, EventArgs e)
{
Logger.Info("it's alive!", "Chaning role");
}
我已经尝试过两个方向的enableViewState =“True || False”(对于gridview和dropdownlist)和autoPostBack =“True || False”,但日志文件没有显示“It is alive”消息。在更改索引时未触发该事件。
有什么想法吗?
答案 0 :(得分:6)
好的,
我终于找到了解决方案。搜索互联网显示这不是一个罕见的问题。然而,解决方案永远不会太远。
首先,我将页面上的所有内容(包括页面指令,gridview,updatetemplate和dropdownlist)更改为EnableViewState =“true”, 然后我在我的下拉列表中设置AutoPostBack =“true”, 最后,我需要确保我没有使用page_load方法中的数据绑定gridview,因为生命周期中的这个阶段已经重新绑定了下拉列表并将其selectedindex设置回默认值,然后才能触发onselectedindexchanged事件。
我只是让gridview像往常一样通过设置它的datasourceid来进行绑定。 在我的搜索过程中,我看到很多人有类似的问题,我认为这应该解决很多问题。或者至少值得一试:)
答案 1 :(得分:3)
就像你说的那不是一个不寻常的问题。我自己也有同样的问题,因此我想提供一个检查清单,以排除一些更常见的问题:
EnableViewState="True"
AutoPostBack="True"
if(!Page.IsPostBack)
,请确保您的dababining仅发生 ,ViewState将保存所选的选项和您的表单(如果您有)这就是我现在所能想到的:)希望它可以帮助任何人!
答案 2 :(得分:1)
您是否尝试将DropDownList的视图状态更改为“true”:
<asp:DropDownList ID="ChangeRole" runat="server" EnableViewState="true" OnSelectedIndexChanged="ChangeRole_SelectedIndexChanged" AutoPostBack="true" ...
如果在回发之间忘记了下拉状态,那么索引就不会改变,因此SelectedIndexChange事件没有被触发。
答案 3 :(得分:1)
为DropDownList设置AutoPostBack="true"
。
并将更新面板的updatemode设置为始终如此
<asp:UpdatePanel runat="server" ID="UpdatePanel1" UpdateMode="Always">
或者设置一个触发器来处理DropDownList的SelectedIndexChanged事件。
答案 4 :(得分: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)
{
}
答案 5 :(得分: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>
希望这会对某人有所帮助。
答案 6 :(得分:0)
这解决了我的问题:CausesValidation="False"
Here是详细信息。