隐藏ListBox的重复结果?

时间:2012-05-23 16:17:59

标签: asp.net c#-4.0

我使用Store Procedure获取结果,然后我有一个填充结果的Datatable。从那里结果填入ListBox。我正在获取重复的ID,我想删除重复的结果。

private DataTable _dt = new DataTable();

ListBox1.DataSource = _dt;
ListBox1.DataValueField = "userId"; //column name in DT
ListBox1.DataBind();

3 个答案:

答案 0 :(得分:2)

如果你使用linq,你可以使用:

var source = _dt.Distinct();

ListBox1.DataSource = source;
ListBox1.DataValueField = "userId";
ListBox1.DataBind();

修改 好吧,在更仔细地研究中,我发现System.Data.DataRowCollection没有像典型的IEnumerable一样实现IEnumerable扩展方法,例如List。要使用Distinct()扩展方法,首先需要将行设置为更基本的IEnumerable。

IEnumerable<System.Data.DataRow> rows = (IEnumerable<System.Data.DataRow>)_dt.Rows;
ListBox1.DataSource = rows.Distinct();
ListBox1.DataValueField = "userId";
ListBox1.DataBind();

虽然它有效但它可能不像@Massimiliano提供的答案那么简单或有效。

答案 1 :(得分:2)

DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);
ListBox1.DataSource = distinctTable ;
ListBox1.DataValueField = "userId";
ListBox1.DataBind();

http://msdn.microsoft.com/en-us/library/wec2b2e6.aspx

答案 2 :(得分:1)

我认为乔尔的答案对你的情况有用。但是,我可能会尝试通过在存储过程中使用DISTINCT来避免首先返回重复项。这样,如果您或其他人再次需要相同的数据,他们不必在任何地方过滤掉重复数据。此外,您还可以获得不在数据库和Web服务器之间通过网络发送不必要数据的第二个好处。