数据绑定问题asp.net下拉列表

时间:2014-02-28 16:12:17

标签: c# asp.net data-binding

我试图绑定我的下拉列表,我认为是因为我的前端的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#c​​ode

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课程时我会收到此错误,请提前帮助谢谢

3 个答案:

答案 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();

}

希望有所帮助!