在我的C#应用程序中,我有两个ListBox
控件。
名为ListBox
的{{1}}填充了从数据库中检索的项目。
另一个lstCategory
名为ListBox
。
我想将所选项目从lstSelCategory
移至lstCategory
,然后对lstSelCategory
中的项目进行排序。我怎样才能有效地做到这一点?任何帮助将不胜感激。
lstSelCategory
答案 0 :(得分:0)
为什么不呢?
var r = (from p in lstCategory.SelectedItems.Cast<string>()
where p.Length > 0
orderby p
select p);
lstSelcategory.Items.AddRange(r.ToArray());
答案 1 :(得分:0)
看起来这里有很多不必要的工作。
您是否有任何特殊原因要将ListBox
项转换为ArrayList
?它的项目已经实现IEnumerable
,应该可以正常使用DataSource
。
另外,为什么数据绑定?您已经通过Add
方法将项目从一个列表框移动到另一个列表框。除非我在这里看不到任何东西,否则数据绑定操作很昂贵且完全没必要。
<强>更新强> 您要求粘贴代码,因此我将粘贴您的一些代码并进行讨论:
private void Copy(ListBox Source, ListBox Target) {
int[] selectedIndices;
ListItemCollection licCollection;
ListBox objTarget;
try
{
selectedIndices = Source.GetSelectedIndices();
licCollection = new ListItemCollection();
objTarget = new ListBox();
if (Target != null && Target.Items.Count > 0)
{
foreach (ListItem item in Target.Items)
{
objTarget.Items.Add(item);
}
Target.Items.Clear();
}
int selectedIndexLength = selectedIndices.Length;
for (int intCount = 0; intCount < selectedIndexLength; intCount++)
{
licCollection.Add(Source.Items[selectedIndices[intCount]]);
}
int collectionCount = licCollection.Count;
for (int intCount = 0; intCount < collectionCount; intCount++)
{
Source.Items.Remove(licCollection[intCount]);
if (!objTarget.Items.Contains(licCollection[intCount]))
objTarget.Items.Add(licCollection[intCount]);
}
到目前为止,您已经完成了所有需要做的事情。这些项已添加到ListBox控件中。呈现页面时,框架将迭代ListItem集合并为项目呈现适当的HTML。如果为控件启用了ViewState
,则会为这些项缓存ViewState
。
然后,你继续这样做:
Target.DataSource = ConvertToArrayList(objTarget);
Target.DataBind();
}
catch (Exception ex)
{
throw ex;
}
finally
{
licCollection = null;
objTarget = null;
}
}
现在,我对数据绑定的理解告诉我,这一系列语句完全覆盖了你在ListItemCollection
中存储的所有内容。所以你在上面的步骤中所做的所有工作都被抹杀了。
此外,您调用函数ConvertToArrayList
:
private ArrayList ConvertToArrayList(ListBox Source) {
ArrayList arrayList;
try {
arrayList = new ArrayList();
foreach (ListItem item in Source.Items)
arrayList.Add(item.Text);
arrayList.Sort();
}
catch (Exception ex)
{
throw ex;
}
return arrayList;
}
现在,这一切都很好,但问题是:您可以将ListItemCollection
设置为您的数据源。或者,正如我们所示,您可以完全避免数据绑定,因为您已经自己构建了列表,只需删除此函数调用。
看起来您需要决定是自己构建列表还是数据绑定。如果您要进行数据绑定,请清理您的操作方式。如果您不打算使用数据绑定,请删除构建列表并管理它不是绝对必要的任何代码。
ALSO:
你正在捕捉一个异常(类型为Exception
,并且没有更少)并且没有对它做任何事情但重新抛出它。如果您不打算对该例外做任何事情,请删除
Catch
条款。如果您打算重新抛出异常,请像这样抛出以保留堆栈跟踪:
try
{
// Blahdy blahdy
} catch (Exception e)
{
throw; // Do not pass e; this preserves the stack trace.
}
在Finally
子句中手动将对象设置为null是来自没有自动垃圾收集的旧语言的保留。我会删除那些代码,因为它会使函数体变得混乱并使其更难阅读。
鉴于上述两点,您看起来可能会移除整个Try...Catch...Finally
,只是让异常在食物链中冒出来。