【问题标题】:Adding a list to a combobox while checking if the object already exists在检查对象是否已存在时将列表添加到组合框
【发布时间】:2016-04-04 07:51:30
【问题描述】:

我对编程比较陌生,所以请原谅我问了这么简单的问题哈哈。 好吧,基本上我有用户可以创建的组名。 Group 是一个具有“string NameGroup”字段的类。组名填写在文本框中并保存在这里:

List<Group> Groups = new List<Group>(); 

我想要做的是在将组名添加到列表之前检查它是否已经存在,但由于某种原因它似乎不起作用。我尝试了 2 种不同的布尔值:

bool Check= Groups.ToString().Contains(txtNewGroup.Text);
bool containsItem = Groups.Any(item => txtNewGroup.Text == item.NameGroup.ToString());

第一个根本不起作用,第二个在文本框中输入相同的组名后给我一个错误。

检查组名是否存在后,我想将其添加到组合框,但这似乎也不起作用。

if (containsItem == false)
{

    Groups.Add(new Group(txtNewGroup.Text));
    txtNewGroup.Clear();

}
else
{
    MessageBox.Show("Groupname isn't available, try something else");
    txtNewGroup.Clear();
}

cbxGroups.DataSource = Groups.ToString();

这是班级组:

    class Group
{
    //Fields
    private string nameGroup;


    //Properties
    public string NameGroup
    {
        get;
        set;
    }



    //Constructor
    public Group(string name)
    {
        this.nameGroup = name;

    }
 }

所以,我的问题是: 1. 我的两个布尔值有什么问题? 2. 为什么不将列表的内容添加到组合框中?

【问题讨论】:

  • 它给出了什么错误?
  • 第一个没有给出任何错误但也不起作用。
  • 第二个:发生'System.NullReferenceException'类型的未处理异常

标签: c# list combobox boolean


【解决方案1】:

这一行

bool Check= Groups.ToString().Contains(txtNewGroup.Text);

由于GroupsList,尽管您的组包含string,但这是不正确的,因为它只会返回List 类型ToString

另外,当你说Contains(txtNewGroup.Text) 时,这应该是指向Group 类中的string,而不是Group 类本身,否则它几乎很可能是错误的(除非Group 本身是string)

所以,假设你有这样的 Group 类(在我的程序中,它被命名为 DummyClass - 因为我不知道你的 Group 喜欢什么)

public class DummyClass {
    public int DummyInt;
    public string DummyString; //note this string!
    public double DummyDouble;
    public DummyClass() {

    }
    public DummyClass(int dummyInt, string dummyString, double dummyDouble) {
        DummyInt = dummyInt;
        DummyString = dummyString;
        DummyDouble = dummyDouble;
    }
}

并将其初始化为

DummyClass dc1 = new DummyClass(1, "This dummy", 2.0);
DummyClass dc2 = new DummyClass(2, "That dummy", 2.0);
DummyClass dc3 = new DummyClass(1, "These dummies", 2.0);
DummyClass dc4 = new DummyClass(2, "Those dummies", 2.0);
DummyClass dc5 = new DummyClass(3, "The dummies", 2.0);
List<DummyClass> dummyList = new List<DummyClass>() { dc1, dc2, dc3, dc4, dc5 };

您应该使用LINQ 直接从Groups 进行检查,就像我对dummyList 所做的那样

if (!dummyList.Select(x => x.DummyString).Contains("dummies")) {
    //This is new item without dummies!
}

你的也应该是这样的

bool Check = Groups.Select(g => g.NameGroup).Contains(txtNewGroup.Text);

这样你真的检查你的Groups中是否有任何StringMember已经与txtNewGroup.Text相同的txtNewGroup.Text

编辑:

您的 Group 属性还有另一个问题。

class Group
{
    //Fields
    private string nameGroup;

    //Properties
    public string NameGroup
    {
        get; //There is nothing in the property, and it is never used either!
        set;
    }

    //Constructor
    public Group(string name)
    {
        this.nameGroup = name; //this means the field is updated    
    }
 }

这导致name 只保存在nameGroup 中,而不是NameGroup 中。因此,当在此类之外调用 NameGroup 时,它总是什么都不提供。把上面的类改成:

class Group
{
    //Fields
    private string nameGroup;

    //Properties
    public string NameGroup
    {
        get {return nameGroup;} //this way, your nameGroup and NameGroup are one
        set {nameGroup = value;}
    }

    //Constructor
    public Group(string name)
    {
        this.nameGroup = name; //this means the field is updated    
    }
 }

这样,您的nameGroupNameGroup 合二为一。或者,如果您根本不需要该字段,则可以将其删除

class Group
{
    //Properties
    public string NameGroup { get; set; }

    //Constructor
    public Group(string name)
    {
        this.NameGroup = name; //use the property directly
    }
 }

它应该可以工作

【讨论】:

  • 我按照您的建议更改了布尔值,但它仍然不起作用。 Groups.Select(Group => Group.NameGroup).Contains(txtNewGroup.Text)
  • @AniBankai 我编辑了我的答案。另见我的 cmets。
  • 我相应地更改了它,但它仍然没有将名称保存到列表中。 bool Checks = Groups.Select(group => group.NameGroup).Contains(txtNewGroup.Text);
  • 似乎问题出在其他地方。在这种情况下,也许您可​​以尝试更新您首先实现上述方法时获得的内容?另外,请首先发布您如何保存名称。如果可能的话,也显示Group 类是什么。
  • 我把名字保存在类Group的字符串字段中。我在帖子中添加了课程。
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多