如何正确显示列表<;类>;在组合框中,并使值成员指向选定的类对象

本文关键字:成员 对象 lt 列表 显示 何正确 gt 组合 | 更新日期: 2023-09-27 18:00:53

我正在使用C#winform和Nhibernate作为ORM、开发简单的概念教授

添加一个项目非常简单。并且每个项目都有一个外键到类别表。

抱歉,我无法上传类图的图片,我还不被允许上传图片。所以类是

public class Category
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string NameArabic { get; set; }
    public static bool AddCategory(Category category)
    {
        using (var session=NhibernateHelper.OpenSession())
        {
            using (var transaction=session.BeginTransaction())
            {
                session.SaveOrUpdate(category);
                transaction.Commit();
            }
            return true;
        }
    }
    public static IList<Category> GetAll()
    {
        using (var session=NhibernateHelper.OpenSession())
        {
            return session.QueryOver<Category>().List<Category>();
        }
    }
}
public class Item
{
    public virtual Guid Id { get; set; }
    public virtual string Description { get; set; }
    public virtual Category Category { get; set; }
    public static bool AddItem(Item item)
    {
        using (var session = NhibernateHelper.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                session.SaveOrUpdate(item);
                transaction.Commit();
            }
            return true;
        }
    }
}

当用户点击插入项目按钮时,它应该执行以下代码

    private void insertItem_Click(object sender, EventArgs e)
    {           
         Model.Item item = new Item
        {
         // allCategories is IList<Category> contain all categories retrieved from Database
            Category = (from category in allCategories 
                        where category.Id == Guid.Parse(comboBox1.SelectedValue.ToString())
                       select category).FirstOrDefault(),
            Description = textBox1.Text // the name text box
          };
        if (Model.Item.AddItem(item))
            MessageBox.Show("Transaction Completed");
    }

我的问题是,由于我使用的是Nhibernate,并且为了避免每次添加项目时在数据库中插入新的类别,我应该传递一个Guid与数据库中保存的Guid相同的类别对象,所以我使用了如上所示的linq查询,即查询从数据库中检索的所有类别列表,我认为这是一种糟糕的方法。

是否建议将allCategories List直接绑定到comboBox,在comboBox中,我可以使用特定的属性指向当前在comboBox中列出的派生对象Guid。

类别映射

    public CategoryMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.NameArabic);
    }
    public ItemMap()
    {
        Id(x => x.Id);
        Map(x => x.Description);
        References(x => x.Category);
    }

谢谢,

如何正确显示列表<;类>;在组合框中,并使值成员指向选定的类对象

使用此

YourComboBox.DataSource = YourList<Category>;
YourComboBox.DisplayMember = StringNameOfProperty;

以填充您的组合框。要获得属性值后面的项目,请使用:

var item = (Category) YourComboBox.SelectedItem;