asp.net – DropDownList OnSelectedIndexChange到第0个索引w / out ViewState

前端之家收集整理的这篇文章主要介绍了asp.net – DropDownList OnSelectedIndexChange到第0个索引w / out ViewState前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我确实按照文章 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()方法中设置一些东西,我每次都可以重新绑定这些数据吗?

请参阅,我的自定义EventHander引发一个事件,该事件由此控件所在的父页面捕获,以便父级可以使用新选择的值执行某些操作.并且这适用于所选索引>的所有情况. 0.

我在此控件中创建了一个属性,其中包含最近选择的索引,在这种情况下,我的父页面可以对每个Page_Load … dunno上的此属性值执行操作.

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

解决方法

问题是您每次都在加载数据,这会重置所选索引.想象一下这是你的下拉菜单
zero [selected]
one
two

然后在客户端中更改所选索引:

zero
one [selected]
two

这将使用您的新索引(1)填充隐藏的输入__EVENTARGUMENT,并使用您的下拉列表的ID填充隐藏的输入__EVENTTARGET.现在服务器端代码启动并重新加载您的数据:

zero [selected]
one
two

“零”是选定的值,因为这是加载数据时的默认值.然后,ASP.NET在请求中查找__EVENTTARGET和__EVENTARGUMENT,找到您的下拉列表ID并找到新索引(1).现在您的下拉列表如下所示:

zero 
one [selected]
two

由于索引已更改,因此下拉列表会引发其SelectedIndexChanged事件,指示索引已更改.显然这是正在运行的部分,现在让我们看看为什么选择列表中的第一项不会引发事件.

现在让我们说我们仍然在其所处的状态下拉(选择“一个”并且选择的索引为1).当我们选择客户端列表中的第一个项目时会发生什么?

使用下拉列表的id和新索引(0)填充__EVENTTARGET和__EVENTARGUMENT.然后服务器将数据加载到下拉列表中,下拉列表现在再次显示如下:

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相关文章