C# Dropdownlist数据源和从C添加额外项#

C# Dropdownlist数据源和从C添加额外项#,c#,asp.net,entity-framework,drop-down-menu,.net-4.0,C#,Asp.net,Entity Framework,Drop Down Menu,.net 4.0,我有一个DropDownList,它与aspx页面中的数据源关联。加载页面时,我需要再添加一项 我的代码: <asp:LabelDropDownList ID="ddlVisualTemplate" runat="server" LabelText="Visual Template:" DataSourceID="VisualTemplateDataSource" DataTextField="Name" DataValueField="Id" AutoPostBack="tru

我有一个
DropDownList
,它与aspx页面中的
数据源关联。加载页面时,我需要再添加一项

我的代码:

<asp:LabelDropDownList ID="ddlVisualTemplate" runat="server" LabelText="Visual Template:"      DataSourceID="VisualTemplateDataSource" DataTextField="Name" DataValueField="Id" AutoPostBack="true" OnSelectedIndexChanged="ddlVisualTemplate_SelectedIndexChanged"/>                         

<asp:EntityDataSource ID="VisualTemplateDataSource" runat="server" 
     ConnectionString="name=Entities" 
     DefaultContainerName="Entities" EnableFlattening="False" 
     EntitySetName="tbEmailVisualTemplates">

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

,这很可能是因为您在
数据绑定()之前添加了项。如果要添加带有

ddlVisualTemplate.Items.Add()
然后,您必须在绑定下拉列表后执行

如果您查看,那么数据绑定是在PreRenderComplete中完成的。因此,您必须在PreRenderComplete之后发生的某个事件中添加元素。
或者您可以在
ddlVisualTemplate.DataBound
事件上执行此操作。

您可以通过按语法设置数据源来轻松解决此问题:

ddlVisualTemplate.DataSource = VisualTemplateDataSource;
ddlVisualTemplate.DataBind();

ddlVisualTemplate.Items.Add(new ListItem("None", string.Empty));
顺便说一句,在我看来,这些数据源控件在asp.net中是错误的。我不喜欢定义数据源并控制到aspx页面的db连接。为了更好地实现这一点,只需谷歌关于每请求会话模式、关注点分离和n层应用程序


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

这为我解决了它,但它将值放在了最后

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

对于原始海报来说可能太晚了,但对于其他用户来说可能有用:

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


有关示例,请参阅Scott Guthrie的帖子。

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

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

您应该这样做,但是在呈现te数据之后,在数据绑定事件上,谢谢!这正是我想要的.ddlTest.Items.Insert(0,newlistItem(“All”,string.Empty));将把项目放在顶部
ddlTicketType.Items.Insert(0, new ListItem("All", "0"));