2012-11-18 38 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

相关问题