You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反转Sql-Server填充的ASP.NET ListBox项顺序?

反转ASP.NET ListBox项顺序的解决方案

嘿,我来帮你搞定这个ListBox项反转的问题!你遇到的找不到.Reverse()方法的情况,主要是因为DataTable的行集合或者ListBox.Items(ListItemCollection)都是非泛型的集合,而LINQ的Reverse()扩展方法只针对泛型的IEnumerable<T>生效。下面给你两种实用的解决办法:

方法一:绑定前反转数据源(推荐)

直接在绑定到ListBox之前,把DataTable的行反转,这样效率更高,不需要额外操作ListBox的Items:

方式1:用DataView倒序排序(适合有自增ID的情况)

如果你的Project表有像ProjectID这样的自增主键,直接用DataView倒序排序是最简单的:

String Sql = @" select * from project"; 
SqlDataAdapter DA = new SqlDataAdapter(Sql, Properties.Resources.cString); 
DataSet DS = new DataSet(); 
DA.Fill(DS, "Project"); 
DataTable DT = DS.Tables["Project"];

// 用DataView反转顺序
DataView reversedView = DT.DefaultView;
reversedView.Sort = "ProjectID DESC"; // 按ProjectID倒序,实现反转

lbProjects.DataValueField = "ProjectID";
lbProjects.DataTextField = "ProjectName";
lbProjects.DataSource = reversedView; // 绑定反转后的DataView
lbProjects.DataBind();

方式2:用LINQ反转DataTable行

如果不需要按特定字段排序,只是单纯反转行的顺序,可以用LINQ把DataTable转成泛型集合后反转:

String Sql = @" select * from project"; 
SqlDataAdapter DA = new SqlDataAdapter(Sql, Properties.Resources.cString); 
DataSet DS = new DataSet(); 
DA.Fill(DS, "Project"); 
DataTable DT = DS.Tables["Project"];

// 确保引用System.Linq命名空间
if (DT.Rows.Count > 0)
{
    var reversedRows = DT.AsEnumerable().Reverse().CopyToDataTable();
    lbProjects.DataValueField = "ProjectID";
    lbProjects.DataTextField = "ProjectName";
    lbProjects.DataSource = reversedRows;
    lbProjects.DataBind();
}

⚠️ 注意:如果DataTable是空的,CopyToDataTable()会报错,所以最好加个非空判断。

方法二:绑定后反转ListBox的Items集合

如果你已经完成了绑定,想要直接反转ListBox里的项,可以把ListItemCollection转成泛型集合后反转,再重新添加:

// 先执行你原来的绑定代码
String Sql = @" select * from project"; 
SqlDataAdapter DA = new SqlDataAdapter(Sql, Properties.Resources.cString); 
DataSet DS = new DataSet(); 
DA.Fill(DS, "Project"); 
DataTable DT = DS.Tables["Project"];
lbProjects.DataValueField = "ProjectID";
lbProjects.DataTextField = "ProjectName";
lbProjects.DataSource = DT;
lbProjects.DataBind();

// 反转Items集合
// 引用System.Linq命名空间,用Cast转成泛型集合
var reversedItems = lbProjects.Items.Cast<ListItem>().Reverse().ToList();
lbProjects.Items.Clear();
lbProjects.Items.AddRange(reversedItems.ToArray());

关键提示

别忘了在你的代码文件顶部添加using System.Linq;,否则LINQ的Cast()、Reverse()这些方法都无法使用哦!


你的原始实现代码:

C#代码:

String Sql = @" select * from project"; 
SqlConnection conn = new SqlConnection(Properties.Resources.cString); 
SqlDataAdapter DA = new SqlDataAdapter(Sql, Properties.Resources.cString); 
DataSet DS = new DataSet(); 
DA.Fill(DS, "Project"); 
DataTable DT = DS.Tables["Project"]; 
lbProjects.DataValueField = "ProjectID"; 
lbProjects.DataTextField = "ProjectName"; 
lbProjects.DataSource = DT; 
lbProjects.DataBind(); 

ASP.NET代码:

<asp:ListBox runat="server" ID="lbProjects" AutoPostBack="True" OnSelectedIndexChanged="lbProjects_SelectedIndexChanged" Width="350px"> </asp:ListBox>

内容的提问来源于stack exchange,提问作者Jack Henry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:29:42