【问题标题】:How to Show text in combobox when no item selected like "..Select room..."如何在没有选择“..选择房间...”之类的项目时在组合框中显示文本
【发布时间】:2019-04-28 03:33:24
【问题描述】:

当使用 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);
            }
        }

谢谢!

【问题讨论】:

    标签: c# winforms linq combobox


    【解决方案1】:

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

    尝试添加项目,而不是设置 DataSource:

    cmbRoom.Items.AddRange(Room);
    

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

    【讨论】:

      【解决方案2】:

      快速解决方案

      为您的 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;
           }
      }
      

      【讨论】:

      • 这对我来说太复杂了..;) 我是这个员工的新手。当没有选定的项目时,这一切代码只是为了有一个文本吗?
      • 不,这是一个通用的解决方案,它适用于您想要在组合框中的各种项目。无论是显示人员的组合框,还是显示国家的组合框。创建多用途解决方案时,第一次工作量更大,但下一次您只需重复使用它,而不是再次编写代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多