asp.net - DropDownList OnSelectedIndexChange to 0th index w/out ViewState

标签 asp.net user-controls drop-down-menu viewstate selectedindexchanged

我确实关注了文章 TRULLY Understanding ViewState (顺便说一句,很棒的文章)并填充我的下拉列表效果很好。我什至设置了一个几乎一样好的 OnSelectedIndexChange 事件。

我发现的问题是选择第 0 个索引时不会触发 SelectedIndexChanged 事件。然而,它在所有其他时间都这样做。

这是一些代码:

<asp:DropDownList runat="server" ID="DropDownList1" EnableViewState="false" 
AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
protected override void OnInit(EventArgs e)
{
    this.DropDownList1.DataTextField = "Text";
    this.DropDownList1.DataValueField = "Value";
    this.DropDownList1.DataSource = fillQueueDropDown();
    this.DropDownList1.DataBind();

    base.OnInit(e);
}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    OnSelectedQueueChanged(e);
}

public void OnSelectedQueueChanged(EventArgs e)
    {
        // Do stuff.
    }

public event EventHandler queueNamesChangedEvent;
public void OnSelectedQueueChanged(EventArgs e)
    {
        if (queueNamesChangedEvent != null)
            queueNamesChangedEvent(this, e);
    }

我想我可以在 Page_Load 方法中进行某种类型的检查:
  if(ViewState["selectedIndexChangedFlag"] != 1)
      // raise OnSelectedChange event

或者有什么我可以在 OnInit() 方法中设置的东西,我每次都可以重新绑定(bind)这些数据?

看,我的自定义 EventHander 引发了一个事件,该事件被该控件所在的父页面捕获,以便父页面可以使用新选择的值执行一些操作。这目前适用于所选索引> 0的所有情况。

我在这个控件中创建了一个包含最近选择的索引的属性,在这种情况下,我的父页面可以在每个 Page_Load 上对该属性值进行操作...不知道。

接受建议。或者如何强制此 SelectedIndexChanged 事件为第 0 个索引选择触发。

最佳答案

问题是您每次都在加载数据,这正在重置选定的索引。想象一下这是您的下拉菜单:

zero [selected]
one
two

然后在客户端中更改所选索引:
zero
one [selected]
two

这将填充隐藏输入 __EVENTARGUMENT使用新索引 (1) 和隐藏输入 __EVENTTARGETid你的下拉菜单。现在服务器端代码启动并重新加载您的数据:
zero [selected]
one
two

“零”是选定的值,因为这是加载数据时的默认值。然后 ASP.NET 查找 __EVENTTARGET__EVENTARGUMENTRequest并找到您的下拉列表 id并找到新索引 (1)。现在您的下拉列表如下所示:
zero 
one [selected]
two

由于索引发生了变化,下拉列表将其 SelectedIndexChanged指示索引已更改的事件。显然这是工作的部分,现在让我们看看为什么选择列表中的第一项不会引发事件。

现在假设我们的下拉菜单仍然处于它刚刚所处的状态(选择“one”并且选择的索引为 1)。当我们在客户端选择列表中的第一项时会发生什么?
__EVENTTARGET__EVENTARGUMENT填充有 id下拉列表和新索引 (0)。然后服务器将数据加载到下拉列表中,下拉列表现在再次看起来像这样:
zero [selected]
one
two

请注意,由于您在事件触发之前重新加载了数据,因此索引已设置为 0,因为这是默认值。现在,当您的事件触发并且下拉列表的选定索引设置为 0 时,下拉列表不会将此视为更改,因为选定索引(据它所知)没有更改。

以下是解决问题的方法:
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    if (!Page.IsPostBack)
    {
        this.DropDownList1.DataTextField = "Text";
        this.DropDownList1.DataValueField = "Value";
        this.DropDownList1.DataSource = fillQueueDropDown();
        this.DropDownList1.DataBind();
    }    
}

如果页面不是回发,这只会将数据加载到下拉列表中。这意味着 ViewState 将为您维护数据以及选定的索引,以便在您回发时下拉列表会将新索引与您在客户端中看到的索引进行比较。

关于asp.net - DropDownList OnSelectedIndexChange to 0th index w/out ViewState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/474367/

相关文章:

c# - 使用 ContentProperty 的 DataContext 直通

javascript - 显示/隐藏 div 下拉菜单

javascript - JQuery.SlideToggle() 不起作用

.net - 使用新技术时的安全问题

asp.net - 我可以在卫星程序集中合并本地资源吗?

winforms - 如何将行添加到 TableLayoutPanel 的中间

c# - 如何在 XAML 代码中创建支持其中其他元素的 UserControl

php - 动态下拉 mysql 撇号问题

c# - 如何使 C# Windows 窗体 DropDownList 的行为类似于浏览器下拉列表?

c# - 处理 veracode 引发的跨站点脚本漏洞