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"));