将列表项从一个列表框移动到另一个列表框

时间:2009-10-30 13:01:14

标签: c# winforms

在我的C#应用​​程序中,我有两个ListBox控件。 名为ListBox的{​​{1}}填充了从数据库中检索的项目。 另一个lstCategory名为ListBox

我想将所选项目从lstSelCategory移至lstCategory,然后对lstSelCategory中的项目进行排序。我怎样才能有效地做到这一点?任何帮助将不胜感激。

lstSelCategory

2 个答案:

答案 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,只是让异常在食物链中冒出来。