【问题标题】:Drop Down List doesn't post back after first post back第一次回发后下拉列表不回发
【发布时间】:2008-10-28 11:58:44
【问题描述】:

我有这个 ASP.NET 下拉控件,当值不是英国时,它会显示其他文本框控件(这是为了帮助使用邮政编码查找英国地址)。当重新选择英国时,我想隐藏其他控件。我已启用视图状态和 AutoPostBack 为真。我有一个 onSelectedIndexChanged 事件,它只会被触发一次(当下拉值更改为不同的国家时,默认情况下它是英国)。

我想让OnSelectedIndexChanged 在每次值不同时触发,但事实并非如此。

附:这是代码sn-p。

<asp:DropDownList runat="server" ID="Country2" AutoPostBack="True" OnSelectedIndexChanged="Country2_SelectedIndexChanged" DataSource="<%# RegionList %>" DataTextField="Name" DataValueField="Code" CssClass="dropdown country"></asp:DropDownList>


protected void Country2_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList d = (DropDownList)sender;
    addressEntry.CountryPrePostBack_SelectedIndexChanged(d.SelectedItem.Value);
}

【问题讨论】:

  • 你能发布一些你的代码吗?

标签: asp.net drop-down-menu


【解决方案1】:

每次我遇到这种情况都是因为验证控制。这些额外的文本框是否附加了可能抑制回发的验证器?一个快速的判断方法是在下拉列表中设置 CausesValidation="false"。

【讨论】:

    【解决方案2】:

    当第一次回发时引入 javascript 错误时,我看到了类似的行为。

    我想我在第一次回发导致显示新 div 时看到了这一点(使用 javascript,而不是代码隐藏),并且 div 不在 HTML 中。所以“show(div)”javascript 引用了一个丢失的对象。

    当然,这是一个非常具体的案例,但我建议在第一次回发后检查任何 js 错误。

    迈克尔

    【讨论】:

      【解决方案3】:

      你是如何附加事件的?您是否正在使用以下代码:

      this.dropDownList.SelectedIndexChanged += new EventHandler(dropDownList_SelectedIndexChanged);
      

      或者您是在 ASPX/ASCX 中分配它吗?

      如果是前者,请确保您没有在 !IsPostback 条件内分配它,您需要确保它在每次回发时添加的事件。

      您是否尝试过使用调试器来查看回发是否实际发生在后续事件中?可能是您新添加的控件导致验证失败,如果您使用验证器,请确保将下拉列表设置为 CauseValidation = false,以便每次都会回发。

      【讨论】:

      • 感谢斯莱斯的回复。我在用户控件 *.ascx 中分配它
      【解决方案4】:

      我只能想到两个问题。

      1.) 您是否正在填充(绑定)到 page_load 事件的列表中?如果是这样,那么您只需要在页面第一次加载时执行此操作。当您绑定到控件(或其他控件)时,它将重置选定的索引。如果启用了视图状态,那么它将保留原始列表。 2.) 现在我不会假设上述情况已经是正确的,所以这会导致我询问是否为此页面的父级启用了视图状态。如果您打开跟踪并查看页面控制列表,您应该能够看到此特定项目的视图状态大小。如果它有一个值,那么您就知道您正在正确设置视图状态。如果没有,那么按照父控件的顺序工作以查看视图状态的结束位置。

      Viewstate 是检测回发所必需的,因此查看它是否正常工作很重要。

      现在我是一名 VB.net 程序员,我注意到在您的 sub 中似乎没有处理程序。 在 vb.net 中,我们通常会看到类似

      Private Sub LinkButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton.Click
      

      让事件正确触发的唯一另一种方法是将其包含在按钮中,但您似乎已经正确地做到了。您可能想按照我上面提到的方式进行尝试,看看是否对您有任何改变。

      安德鲁

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多