我曾经认为我的c#编程并不是太糟糕,但今天我正在认真地质疑我的头脑,这么小的东西正在打败我......
我正在尝试让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()函数。我可以理解,可能的情况是,当控件加载第一个选择的项目时,所以在选择时,索引实际上并没有改变。
我已尝试将所选项目索引设置为-1,并在页面加载时设置ClearSelection(),但没有运气。
有什么想法吗?感谢
答案 0 :(得分:6)
您总是在每次回发时将SelectedIndex
重置为-1:
this.ddl_SortBy.SelectedIndex = -1;
所以也把它放在回发检查中:
if (!IsPostBack)
{
this.ddl_SortBy.SelectedIndex = -1;
SearchDirectory();
}
答案 1 :(得分:1)
我发现自己同样需要在Page_Load上执行更改事件,就像你期望的那样..事情是我在ASP.NET之前认识到将一些ListItem设置为.SelectecIndex为0。
因此,如果我放置一些类似this.ddl_SortBy.SelectedIndex = -1的东西,之后调试器仍会显示0 ...所以它永远不会打开-1并且永远不会执行更改事件。就像在没有选择任何东西(-1)的情况下,ASP.NET总是将第一个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);
答案 2 :(得分: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();
}
答案 3 :(得分: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();
}
现在工作绝对正常:)
谢谢大家。
答案 4 :(得分:-1)
这个简单的解决方法怎么样?将下拉列表中的第一项设置为:
<asp:ListItem Value="-1">(choose how to sort)</asp:ListItem>
这样,当用户选择所需的排序顺序时,所选索引将发生变化并触发事件。
首先从后面的代码中删除额外的小提琴。