我试图绑定我的下拉列表,我认为是因为我的前端的asp代码不是以某种方式绑定
ASPX
<asp:Label ID="Label2" runat="server" />
<asp:DropDownList Width="150px" ID="ddLocation" runat="server"
AppendDataBoundItems="True"
DataTextField="Name"
DataValueField="Name" AutoPostBack="True" >
</asp:DropDownList>
c#code
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
Label0.Text = "Specialities";
Label1.Text = "Category";
Label2.Text = "Locations";
ddSpec.Items.Insert(0, new ListItem("Select a spec", "0"));
ddCategory.Items.Insert(0, new ListItem("Select a Category", "0"));
ddLocation.Items.Insert(0, new ListItem("<Select a Location>", "0"));
populattePage();
}
}
public void populattePage()
{
getlocation();
// getCategory()
}
public static void getlocation()
{
DataClasses_DataContext dc = new DataClasses_DataContext();
List<string> locations = (
from a
in dc.Locations
select a.Name).ToList();
DropDownList ddLocation = new DropDownList();
ddLocation.DataSource = locations;
ddLocation.DataValueField = "ID";
ddLocation.DataTextField = "Name";
ddLocation.SelectedIndex = 0;
ddLocation.DataBind();
}
我现在有错误“”“”DataBinding:'System.String'不包含名称为'Name'的属性。“”“”“”页面加载“”“类中的代码将项添加到但是当我打电话给get locations课程时我会收到此错误,请提前帮助谢谢
答案 0 :(得分:2)
这里有两个问题。首先 - 如果要使用Location对象的2个属性,则应将此对象用作数据源。没有必要为此提取单独的字符串列表:
ddLocation.DataSource = dc.Locations.ToList();
这将解决您的异常。这一行:
DropDownList ddLocation = new DropDownList();
不应该在这里,只需删除它。您已经初始化了下拉列表。
第二个问题 - 如果您希望某个默认项目出现在列表中,则应在数据绑定后插入:
populattePage();
ddLocation.Items.Insert(0, new ListItem("<Select a Location>", "0"));
答案 1 :(得分:1)
ListItems具有“Text”和“Value”属性。因此,当您创建一个时,您只能将这些属性用于下拉列表文本/值字段。你需要改变
<asp:DropDownList Width="150px" ID="ddLocation" runat="server"
AppendDataBoundItems="True"
DataTextField="Text"
DataValueField="Value" AutoPostBack="True" >
</asp:DropDownList>
获取您的位置的简单方法是
List<ListItem> locations = (from a in dc.Locations
select new ListItem()
{
Text = a.Name,
Value = a.Name
}).ToList();
然后将其附加到您的列表中。
答案 2 :(得分:1)
所以问题是你绑定的数据源主要是字符串。当您设置DataValueField和DataTextField属性时,它会调用反射器并询问它所绑定的对象,以便为其提供属性。由于我假设查询中的a.Name是一个字符串,因此它不具有“Name”或“Id”属性。一个简单的解决方案是创建一个ID和Name属性。
这可能有助于说明我想说的话。 (如果你打算做C#它还可以帮助我们维护程序员,请骆驼案例你的函数名称:))
public static void GetLocation()
{
DataClasses_DataContext dc = new DataClasses_DataContext();
var locations = (
from a
in dc.Locations
select new { Name = a.Name, Id = a.Id }).ToList(); // this can be Id = a.Name or whatever too
DropDownList ddLocation = new DropDownList();
ddLocation.DataSource = locations;
ddLocation.DataValueField = "ID";
ddLocation.DataTextField = "Name";
ddLocation.SelectedIndex = 0;
ddLocation.DataBind();
}
希望有所帮助!