【问题标题】:Preventing duplicate items to be added into a checkedlistbox [closed]防止将重复项添加到选中列表框中[关闭]
【发布时间】:2014-08-15 08:04:20
【问题描述】:

我编写了一个代码,将列表添加到checkedlistbox,如果列表中有相同的项目,我想检查checkedlistbox。我的代码根本没有向checkedlistBox 添加任何项目。谁能提出问题可能是什么?。

 int y;

           if (clb_output.Items.Count != 0){
           for (y = 0; y < q.Count; y++){
               for (int z = 0; z < clb_output.Items.Count; z++)
               {
                   if (q[y].ToString() != clb_output.Items[z].ToString())
                   {
                       clb_output.Items.Add(q[y].ToString());
                       break;
                   }
                   else { }

               }
           }
           }
           else
           {
               for (int t = 0; t < q.Count;t++ )
                   clb_output.Items.Add(q[t].ToString()); 

           }

【问题讨论】:

  • 我建议您在第一个 for 语句处设置一个断点,然后在调试器中运行程序并单步执行代码。
  • 您是从一个空的CheckedListBox 开始,并且您只想从可能包含重复项的列表中添加不同的项目,还是您从一个可能包含项目的CheckedListBox 开始并且您想要添加仅当同一项目不在CheckedListBox中时,列表中的每个项目?
  • 我已编辑您的代码以修复格式。要求您发布我们可以轻松阅读的代码是不是太过分了?
  • 空的else 块有什么意义?这只是混乱。
  • 不要在标题中添加“已解决”,而是将提供的答案之一标记为答案。此外,不要用解决方案代码修改问题,而是将其放在答案中。您应该尝试并尊重本网站的机制,以使其对其他人有用。

标签: c# winforms checkedlistbox


【解决方案1】:

当遇到此类问题时,测试驱动开发是解决问题的好方法。

首先设置要测试的类和一个测试(我们暂时忽略模拟和其他东西)

public class MyClass {
  private readonly List<Item> q = new List<Item>();
  private readonly List<Item> checkedItems = new List<Item>();

  public ICollection<Item> Q
  {
     get { return q; }
  }

  public ICollection<Item> CheckedItems
  {
     get { return checkedItems; }
  }

  public void TransferItems() {
    // todo:
  }
}

public class Item { }

您可以使用 Visual Studio 单元测试添加测试方法,或使用 NUnit 之类的东西。

[TestFixture]
public class MyClassTest {
  [Test]
  public void NewItemsAreAddedWhenCheckedItemsIsEmpty() {
    // arrange
    Item expectedItem = new Item();
    MyClass tester = new MyClass();
    tester.Q.Add(expectedItem);

    // act
    tester.TransferItems();

    // assert
    int actualCount = tester.CheckedItems.Count;
    int expectedCount = 1;

    Assert.Equals(actualCount, expectedCount);

    var actualItem = tester.CheckedItems[0];
    Assert.AreSame(actualItem, expectedItem);
  }

  [Test]
  public void NewItemsAreAddedWhenCheckedItemsContainsElements() {
    // arrange
    Item expectedItem = new Item();
    MyClass tester = new MyClass();
    tester.Q.Add(expectedItem);
    tester.CheckedItems.Add(new Item());

    // act
    tester.TransferItems();

    // assert
    int actualCount = tester.CheckedItems.Count;
    int expectedCount = 2;

    Assert.Equals(actualCount, expectedCount);

    var expectedContains = tester.CheckedItems.Contains(expectedItem);
    Assert.IsTrue(expectedContains);
  }
}

完成后,您可以简单地运行测试,查看它是否失败并相应地更改您的代码。

public class MyClass {
  private readonly List<Item> q = new List<Item>();
  private readonly List<Item> checkedItems = new List<Item>();

  public ICollection<Item> Q
  {
     get { return q; }
  }

  public ICollection<Item> CheckedItems
  {
     get { return checkedItems; }
  }

  public void TransferItems() {
    IEnumerable<Item> itemsToAdd = q.Where(item => !checkedItems.Contains(item));
    checkedItems.AddRange(itemsToAdd);
  }
}

【讨论】:

    【解决方案2】:

    1) 请确保您的 q 收藏不是空的

    2) 我通常会填写这样的列表:

    for (int y = 0; y < q.Count; y++)
    {
        if(!clb_output.Indexof(q[y].ToString.Trim.ToLower() > -1)
        {
                 clb_output.Items.Add(q[y].ToString());
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果 clb_output.Items.Count() 在您的第二个 for 循环中为零,那么您将永远不会到达添加到框的语句。您需要在代码开头设置断点以查看发生了什么并修复您的逻辑。

              int y;
      
              if (clb_output.Items.Count != 0)
              {
                  for (y = 0; y < q.Count; y++)
                  {
                      if (!clb_output.Items.Contains(q[y].ToString()))
                      {
                          clb_output.Items.Add(q[y].ToString());
                      }
                  }
              }
              else
              {
                  for (int t = 0; t < q.Count; t++)
                      clb_output.Items.Add(q[t].ToString());
      
              }
      

      【讨论】:

      • 是的,你是对的......我现在已经用上面的更新代码解决了这个问题,但现在它继续出现在 if 语句中
      • 查看我添加的示例代码。您需要检查 clb_output 集合是否包含您正在检查的项目。如果它们不相同,则您所拥有的会添加该项目,在大多数情况下它们不会相同。这就是为什么它每次都进入内部 if 语句的原因。另请注意,我所做的更改是伪代码。您可能必须根据您的 clb_output 对象类型实现 contains 方法。
      • 我决定清除选中的列表框,因为我所有的排序项目(以及添加的新项目)都已经在我的 q 列表中。谢谢大家......我更新的代码在上面......它现在可以工作了:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多