使用LINQ将多个值绑定到下拉列表

本文关键字:绑定 下拉列表 LINQ 使用 | 更新日期: 2023-09-27 18:08:44

我有一个字符串集合,我正在字符串集合上执行foreach循环。所以在foreach中,我想使用LINQ查询将值绑定到下拉列表。for循环执行的时间没有错误,但是在dropdownlist中的绑定覆盖了该值。

请检查我的代码片段:

public void binddrop(StringCollection colle)
{
    foreach (string str in (StringCollection)colle)
    {
        string[] user = str.Split('|'); 
        iPhoneDataContext objdata = new iPhoneDataContext();
        var userdetails = (from users in objdata.UserDetails.AsEnumerable()
                           where users.UserType != null && users.Email==user[2].ToString()
                           select new
                           {
                               Name = users.FirstName,
                               ID = users.UserId
                           }) 
        drpvendor.DataSource = userdetails;
        drpvendor.DataTextField = "Name";
        drpvendor.DataValueField = "ID";
        drpvendor.DataBind();
    }
     drpvendor.Items.Insert(0, new ListItem("-Select Vendor-", "0"));
}

由于某些原因,StringCollection的For循环覆盖了下拉列表中的值。那么我怎么用另一种方式绑定呢?

使用LINQ将多个值绑定到下拉列表

该值被覆盖的原因是您在foreach中执行绑定。基本上,在每个循环的第一个循环中,您将获得第一个用户详细信息,然后将其绑定到DDL,在下一个循环中,您将将第二个用户详细信息绑定到DDL,以此类推,因此您最终得到的只是DDL中的最后一个用户详细信息。

您需要做的是获取集合中的所有用户详细信息,然后将DDL绑定到该集合上。

你需要这样做:

[Index.aspx.cs]

using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
namespace DropDownListBinding
{
    public partial class Index : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            binddrop();
        }
        public void binddrop()
        {
            // this is the collection that will be bound to the DDL
            var userdetailsCollection = new List<object>();
            // generate some userdetails and add them to the collection
            for (var i = 0; i < 3; i++)
            {
                var userdetails = new
                {
                    Name = "User" + i,
                    ID = i.ToString()
                };
                userdetailsCollection.Add(userdetails);
            }
            // now we can bind the DDL to the collection
            drpvendor.DataSource = userdetailsCollection;
            drpvendor.DataTextField = "Name";
            drpvendor.DataValueField = "ID";
            drpvendor.DataBind();
            drpvendor.Items.Insert(0, new ListItem("-Select Vendor-", "0"));
        }
    }
}
[Index.aspx]

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="DropDownListBinding.Index" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:DropDownList runat = "server" ID="drpvendor" />
    </form>
</body>
</html>

如果您想使用stringcollection在LINQ中只使用一个查询,请检查下一个示例

    public void binddrop(StringCollection colle)
    {
        var userdetails = 
        (
            from elem in colle.Cast<string>()
            from mail in elem.Split('|')
            join users in objdata on mail equals users.Email
            where users.UserType != null 
               select new
               {
                   Name = users.FirstName,
                   ID = users.UserId
               }
        );

        drpvendor.DataSource = userdetails;
        drpvendor.DataTextField = "Name";
        drpvendor.DataValueField = "ID";
        drpvendor.DataBind();

        drpvendor.Items.Insert(0, new ListItem("-Select Vendor-", "0"));
    }

, Howto我测试了上一个

为了测试这个函数,我生成了一些硬编码的数据

StringCollection colle = new StringCollection();

IEnumerable objdata;

保护无效Page_Load(对象发送者,EventArgs e){

colle.Add("pippo@msn.it|pippo2@msn.it|pippo3@msn.it");
colle.Add("pluto@msn.it|pluto2@msn.it|pluto3@msn.it");
objdata = new UserDetails[] 
{
    new UserDetails
    {
        UserType = "Normal",
        Email = "pippo3@msn.it",
        FirstName = "pippo",
        UserId = "pippo"
    },
    new UserDetails
    {
        UserType = "Normal",
        Email = "pluto3@msn.it",
        FirstName = "pluto",
        UserId = "pluto"
    }
};
binddrop(colle);

}

我定义了一个类来绕过数据上下文

class UserDetails
    {
        public string UserType;
        public string Email;
        public string FirstName;
        public string UserId;
    }

感谢回复我…我做了另一种方式,当我从查询它的覆盖下拉列表在我的问题下面,所以我刚刚添加了Foreach循环

 public void binddrop(StringCollection colle)
  {
foreach (string str in (StringCollection)colle)
{
    string[] user = str.Split('|'); 
    iPhoneDataContext objdata = new iPhoneDataContext();
    var userdetails = (from users in objdata.UserDetails.AsEnumerable()
                       where users.UserType != null && users.Email==user[2].ToString()
                       select new
                       {
                           Name = users.FirstName,
                           ID = users.UserId
                       });
         foreach (var v1 in userdetails)
            {
                drpvendor.Items.Add(v1.Name);
               drpvendor.Items.FindByText(v1.Name).Value = v1.ID.ToString();
            }
  }