Dropdownlist数据源并从C#添加额外的项目

我有一个与aspx页面中的DataSource相关联的DropDownList 。 我需要在加载页面时再添加一个项目。

我的代码:

   

而我正在尝试额外的项目:

  protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ddlVisualTemplate.Items.Add(new ListItem("None", string.Empty)); } } 

如果我调试代码,它会通过它。 但是当显示页面时,下拉列表不包含"None"

这很可能是因为您在DataBind()之前添加了项目。 如果要添加项目

 ddlVisualTemplate.Items.Add() 

然后你必须在下拉列表被绑定这样做。

如果您查看http://msdn.microsoft.com/en-us/library/ms178472.aspx,那么DataBind将在PreRenderComplete中完成。 因此,您必须在PreRenderComplete之后发生的某些事件中添加元素。 或者您可以在ddlVisualTemplate.DataBound事件上执行此ddlVisualTemplate.DataBound

原始海报可能为时已晚,但对其他用户可能有用:

您可以在设计器(或代码中)中添加值“无”,“选择值”等,并通过设置AppendDataBoundItems="true"防止DataBind覆盖它。 这将使DataBind附加而不是清除。

有关示例,请参阅Scott Guthrie 在ASP.NET 2.0中发布的ListControl.AppendDataBoundItems属性 。

您可以通过以编程方式设置数据源来轻松解决此问题:

 ddlVisualTemplate.DataSource = VisualTemplateDataSource; ddlVisualTemplate.DataBind(); ddlVisualTemplate.Items.Add(new ListItem("None", string.Empty)); 

顺便说一句,在我看来,这些数据源控件在asp.net中是错误的。 我不喜欢定义数据源并控制到aspx页面的数据库连接的想法。 有关更好的方法,只需谷歌关于每个请求模式的会话,关注点分离和n层应用程序。

更新:您可以直接调用数据而不是“VisualTemplateDataSource”。 我不知道EF,但它可能是这样的:“DataContext.tbEmailVisualTemplates”。 您必须设置datacontext。 然后你可以摆脱数据源控制。

使用此选项可在0索引处的绑定下拉列表中添加项目

 ddlTicketType.Items.Insert(0, new ListItem("All", "0")); 

这为我修复了它,但它最终将价值放在了一边。

 protected void ddlTest_PreRender(object sender, EventArgs e) { if (!IsPostBack) { ddlTest.Items.Add(new ListItem("All", string.Empty)); } }