2012-07-10 69 views
2

我曾经以为我的C#编程是不是太糟糕,但今天我很认真地质疑我的头,东西这么小的击败我...ASP.NET的DropDownList的SelectedIndex不改变第一要素

我试图让DropDownList的行为,但我们今天没有得到。我在ascx控件一个简单的DropDownList这是动态加载到一个aspx页面

<asp:DropDownList ID="ddl_SortBy" runat="server" AutoPostBack="true">    
    <asp:ListItem Value="0">Sort Alphabetically A to Z</asp:ListItem> 
    <asp:ListItem Value="1">Sort Alphabetically Z to A</asp:ListItem> 
</asp:DropDownList> 

和背后的一些代码..

private short SortBy = 0; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     this.ddl_SortBy.SelectedIndex = -1; 
     this.ddl_SortBy.SelectedIndexChanged += new EventHandler(ddl_SortBy_SelectedIndexChanged); 

     if (!IsPostBack) 
      SearchDirectory(); 
    } 

    public void ddl_SortBy_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     SortBy = Convert.ToInt16(this.ddl_SortBy.SelectedItem.Value); 
     SearchDirectory(); 
    } 

我永远无法得到的第一项来触发所选指标的变化事件 - 因为SearchDirectory()函数未被调用。我可以理解,可能情况是,当控件加载选择的第一项IS时,索引实际上并未改变。

我已经尝试将选定的项目索引设置为-1,并在页面加载ClearSelection(),但没有运气。

任何想法?由于

+0

我也试图把事件调用上DropDownList的使用'OnSelectedIndexChanged'并删除第Page_Load中有两行,结果相同 – 2012-07-10 12:21:00

+0

你在每个页面请求上做的第一件事是将选定的索引设置为一个静态值,就其余的代码而言,它永远不会改变。 – David 2012-07-10 12:22:36

+0

你在期待什么会发生吗?您是否希望事件在初始加载时发生?或者您遇到“重新选择”初始项目不起作用的问题? – 2012-07-10 12:23:13

回答

6

你总是重置SelectedIndex为-1每个回发:

this.ddl_SortBy.SelectedIndex = -1; 

于是就把这也是在回发检查:

if (!IsPostBack) 
{ 
    this.ddl_SortBy.SelectedIndex = -1; 
    SearchDirectory(); 
} 
+0

正如前面提到的,我正在抓着那些吸管,同样的事情发生在它被移除的时候。 – 2012-07-10 12:30:07

+0

我注意到,aspx页面所在的主页面已关闭视图状态,我已将其打开并且现在可以正常工作...现在问题是我不希望所有页面的视图状态处于我的状态网站: - /谢谢Tim – 2012-07-10 12:34:01

+0

@danrichardson:我认为你的用户控件加载的动态部分导致了这个问题。因此,您应该向我们展示如何将用户控件添加到页面。你是否每次连续回发都重复使用与以前相同的ID? **编辑**:我很高兴听到这个消息。 – 2012-07-10 12:35:22

-1

这个怎么样简单的解决方法。在下拉菜单设置中的第一项是:

<asp:ListItem Value="-1">(choose how to sort)</asp:ListItem> 

这样一来,选择的指标将发生变化,当用户选择所需的排序顺序事件将触发。

从第一个代码后面的代码中删除额外的小窍门。

+0

不是一个很好的解决方案,因为它意味着改变我想要显示的内容,并且违背了我希望代码默认执行的操作 - 即按第一项进行排序。 – 2012-07-10 14:22:56

+0

好的。足够公平... – user1429080 2012-07-10 14:51:13

0

将事件处理程序分配从OnLoad移动到OnInit并删除SelectedIndex行。

protected void Page_Init(object sender, EventArgs e) 
{ 
    this.ddl_SortBy.SelectedIndexChanged += new EventHandler(ddl_SortBy_SelectedIndexChanged); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
     SearchDirectory(); 
} 
+0

我已经尝试过,已经在OnInit,但会尝试... – 2012-07-10 12:27:47

+0

同样的问题也这样做。 – 2012-07-10 12:29:08

+0

@danrichardson - 你从其他页面复制/粘贴控件吗?如果是这样,删除它,保存文件并从头开始输入。并将事件分配保存在OnInit中,这就是它应该在的位置。 – 2012-07-10 12:33:54

0

我的母版页视图状态已关闭,这就是为什么它不工作。尽管这不是我想要允许的。

我的解决方案是恢复使用Request.Form的实际表单提交数据检索。

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
      SortBy = Convert.ToInt16(Request.Form[this.ddl_SortBy.UniqueID]); 

     // search directory 
     SearchDirectory(); 
    } 

作品精美绝伦现在:)
谢谢大家。

1

我发现自己在同样需要在Page_Load中执行变更事件像你期待..事情是,我明白了,在ASP.NET之前把几个ListItem其设置.SelectecIndex 0

所以,如果我把一些东西像this.ddl_SortBy.SelectedIndex = -1,之后,调试器仍然显示0 ...所以它永远不会打开-1,永远不会执行更改事件。就好像ASP.NET在选择nothing(-1)时始终将第一个ListItem视为选定的ListItem,因此强制它执行-1或0从不首先调用change事件。

多搜索一下:“默认值是0,它选择列表中的第一项。“

http://msdn.microsoft.com/en-us/library/vstudio/system.web.ui.webcontrols.dropdownlist.selectedindex(v=vs.100).aspx所以我认为,我们必须强制调用事件,如: ddl_SortBy_SelectedIndexChanged(NULL,NULL);

相关问题