当使用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);
}
}
谢谢!
答案 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;
}
}