【问题标题】:databinding issue asp.net dropdown list数据绑定问题 asp.net 下拉列表
【发布时间】:2023-03-13 23:05:01
【问题描述】:

我正在尝试绑定我的下拉列表,我认为是因为我在前端的 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#代码

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' does not contain a property with name 'Name'。""" """page load""" 类中的代码将项目添加到下拉列表但是当我调用获取位置类时出现此错误,请提前帮助谢谢

【问题讨论】:

    标签: c# asp.net data-binding


    【解决方案1】:

    这里有两个问题。首先 - 如果您要使用 Location 对象的 2 个属性,您应该使用该对象作为数据源。没有必要为此提取单独的字符串列表:

    ddLocation.DataSource = dc.Locations.ToList();
    

    这将解决您的异常。还有这一行:

    DropDownList ddLocation = new DropDownList();
    

    不应该在这里,只是删除它。您已经初始化了下拉菜单。

    第二个问题 - 如果您希望某些默认项目出现在列表中,您应该在数据绑定之后插入它

        populattePage();
        ddLocation.Items.Insert(0, new ListItem("<Select a Location>", "0"));
    

    【讨论】:

    • 嗨安德烈,一旦我删除 DropDownList ddLocation = new DropDownList();我得到非静态对象需要对象引用
    • @user369616,那是因为你的方法是静态的。对不起,最初错过了。如果您希望它是静态的 - 将 ddLocation 作为参数传递。但是,您可以轻松地删除 static 修饰符并直接从页面使用控件
    【解决方案2】:

    ListItems 具有“文本”和“值”属性。因此,当您创建一个时,您只能将这些属性用于下拉列表文本/值字段。你需要改变

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

    然后将其附加到您的列表中。

    【讨论】:

      【解决方案3】:

      所以问题在于您要绑定的数据源主要是字符串。当您设置 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();
      
      }
      

      希望有帮助!

      【讨论】:

      • 嗨,Thomas,我明白你在说什么,但是将我的代码更改为此导致无法将类型 Anonymous 隐式转换为通用列表,或者与。 ToList();
      • 哦,是的!对不起。请立即试用修订版。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多