使用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循环覆盖了下拉列表中的值。那么我怎么用另一种方式绑定呢?
该值被覆盖的原因是您在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();
}
}