当未选择“ ..选择房间...”等项目时,如何在组合框中显示文本

时间:2018-11-26 13:16:10

标签: c# winforms linq combobox

当使用LINQ C#在Windows应用程序中未选择任何项目时,如何在ComboBox中显示文本 这是我的代码,如何在Combobox中获得所有房间。

private void LoadRoom()
        {

            try
            {
                db = new HotelEntities();

                // cmbProvince.Text = "";

                var Room = (from u in db.Room

                            select new { u.RoomId, u.RoomNumber }).ToList();

                cmbRoom.Text = ".. Select.."; // This one do not working.
                cmbRoom.DisplayMember = "RoomNumber";
                cmbRoom.ValueMember = "RoomId";
                cmbRoom.DataSource = Room;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

谢谢!

2 个答案:

答案 0 :(得分:0)

如果设置组合框的DataSource,则会在后台使用货币管理器,并选择其位置(第一项)。

代替设置数据源,请尝试添加以下项目:

cmbRoom.Items.AddRange(Room);

注意,如果以后选择并清除一个项目,则将“文本”设置为占位符将不起作用,除非您添加额外的检查(在TextChanged或SelectedIndexChanged中)

答案 1 :(得分:0)

快速解决方案

为您的ComboItems创建一个源类,(至少)具有要显示的属性和该属性的内部值。如果创建通用类,则可以将其用于所有组合框。

class ComboDisplay<TSource>
{
     public string Display {get; set;}
     public TSource Value {get; set;}
}

cmbRoom.DisplayMember = nameof(ComboDisplay.Display);
cmbRoom.ValueMember = nameof(ComboDisplay.Value);

为组合框创建数据源时,请确保添加默认值。在下面的示例中,我假设您要在组合中选择Room类型的项目:

IEnumerable<Room> availableRooms = myDbContext.Rooms
    .Where(room => room.IsAvailable) 
    .Select(room => new ComboDisplay<Room>
    {
         Display = room.Name,
         Value = new Room
         {
             Id = room.Id,
             ...
         },
    })
    // add a dummy value if nothing is selected
    .Concat(new Room[]
    {
        Display = "Please select a room",
        Value = null, // meaning: nothing selected
    });

选择后,使用comboBox1.SelectedValue获取所选的Room;如果未选择任何内容,则为null。

创建一个特殊的组合框类

如果必须定期使用此功能,请考虑创建ComboBox的通用子类,该子类可以显示某个TSource的项目,如果未选择任何内容,则返回null:

class MyComboBox<TSource> : ComboBox
{
    public MyComboBox() : base()
    {
        base.DataSource = this.EmptyList;
        base.DisplayMember = nameof(ComboDisplay.Display);
        base.ValueMember = nameof(ComboDisplay.Value);
    }

    private static readonly EmptyItem = new ComboDisplay
    {
        Display = "Please select a value",
        Value = null,
    }

设置一个属性,该属性返回可用的组合项目。确保EmptyItem始终在集合中:

public IReadonlyCollection<TSource> ComboItems
{
    get {return (IReadOnlyCollection<TSource>)base.DataSource;}
    set 
    {
        // TODO: check if the empty element is in your list; if not add it
        base.DataSource = value;
    }
}

最后:获取Selected值的函数;如果未选择任何内容,则返回null:

public TSource SelectedValue
{
     get => return (TSource)base.SelectedValue;
     set
     {
         // TODO: check if value is in ComboItems
         base.SelectedValue = value;
     }
}