如何反转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
相关产品推荐
相关产品推荐

