摘要
我将数据上下文中的城市加载到两个不同的列表中,并将它们绑定到各自的DropDownList控件。
虽然两者的代码相同,但只有数据和显然控件的名称不同,数据绑定似乎不适用于其中一个。它不显示城市名称,而是显示其ID,即仅用于第一个选项!
代码隐藏
我们有两个DropDownList控件:
DestinationDropDownList
; OriginDropDownList
。然后,我填充它们。
public partial class MyControl : UserControl {
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
var instruction = new City() {
CityId = Guid.Empty,
CityName = "- Select a city -"
};
var destinations = context.Cities.ToList();
destinations = destinations.OrderBy(c => c.CityName).ToList();
destinations.Insert(0, instruction);
DestinationDropDownList.DataSource = destinations;
DestinationDropDownList.DataTextField = "CityName";
DestinationDropDownList.DataValueField = "CityId";
DestinationDropDownList.DataBind();
var origins = context.Cities.ToList();
origins = origins.OrderBy(c => c.CityName).ToList();
origins.Insert(0, instruction);
OriginDropDownList.DataSource = origins;
OriginDropDownList.DataTextField = "CityName";
OriginDropDownList.DataValueField = "CityId";
OriginDropDownList.DataBind();
}
}
private static readonly MyDataContext context = new MyDataContext();
}
HTML
<asp:DropDownList ID="DestinationDropDownList" runat="server" />
<asp:DropDownList ID="OriginDropDownList" runat="server" />
显示基准
*DestinationDropwDownList*
- 0000-0000-0000-0000-0000 (empty Guid)
- CityName 01
- CityName 02
- ...
*OriginDropDownList*
- - Select a city -
- CityName 01
- CityName 02
- ...
正确的显示是由OriginDropDownList
控件呈现的显示。为什么DestinationDropDownList
没有正确显示数据,也就是说,列表中第一个也是唯一的第一个项目!我根本没有得到它,并且已经花了几个小时试图找到解决方案! =(
DropDownList.Items.Add(string)
方法,这显示第一行没有任何内容,而是空Guid。问题
编辑#1
michielvoo的回答帮助我找到了一种新的数据绑定方式。通过他的代码,找到的解决方法是:
<asp:DropDownList ID="DestinationDropDownList" runat="server"
AppendDataBoundItems="true"
CssClass="required">
<asp:ListItem Value="- Select a city -" />
</asp:DropDownList>
仅从此DropDownList的代码中删除指令插入。现在它从头开始显示我想要的东西。
我接受了他的回答,因为正是他带领我找到了一个很好的解决方法。我不觉得这是真正的解决方案,但只要结果是他们的,我不介意。除此之外,我不必验证Guid.Empty
页面的验证,我将不得不检查我的指令,并在用户没有选择位于另一个索引而不是0的城市时使页面无效,因为我的使用Guid
进行检查将失败。
编辑#2
在michielvoo的回答中陈述了代码隐藏,它完全解决了DropDownList
仅显示ListItem.Value
属性而不是ListITem.Text
属性的问题。列表中的项目。我不知道其他方面有什么问题,但是这个方法很棒!
感谢michielvoo!
谢谢大家的支持! =)
答案 0 :(得分:7)
之前我没有遇到过这个问题,但我会尝试回答你的第二个问题。我认为通过代码添加第一个'教学'项目没什么价值(如果我错了,请纠正我)。我宁愿将它直接添加到标记中:
<asp:DropDownList ID="DestinationDropwDownList" runat="server"
AppendDataBoundItems="true"
DataTextField="CityName"
DataTextField="CityId">
<asp:ListItem Text="- Select a city -" />
</asp:DropDownList>
由于使用AppendDataBoundItems
属性,第一项将在数据绑定中继续存在。我还添加了DataTextField
和DataValueField
属性,您也可以从代码中删除这些属性。
在数据绑定之前,您可以做的另一件事是将实体投影到ListItem
个实例:
DestinationDropDownList.DataSource =
from d in destinations
select new ListItem() {
Text = d.CityName,
Value = d.CityId.ToString()
};
DestinationDropDownList.DataBind();
这样,您就不必在控件上设置DataTextField
或DataValueField
属性,因为您已经自己创建了列表项。