【问题标题】:Populating a ComboBox using C#使用 C# 填充组合框
【发布时间】:2011-01-25 22:53:24
【问题描述】:

我想用以下内容填充组合框:

可见项目/项目价值

English / En

Italian / It

Spainish / Sp 

etc....

有什么帮助吗?

也有可能在填充 Combobox 后使其只读?

【问题讨论】:

标签: c# .net winforms combobox


【解决方案1】:

ValueMember/DisplayMember 属性设置为Language 对象的属性名称。

class Language
{
    string text;
    string value;

    public string Text
    {
        get 
        {
            return text;
        }
    }

    public string Value
    {
        get
        {
            return value;
        }
    }

    public Language(string text, string value)
    {
        this.text = text;
        this.value = value;
    }
}

...

combo.DisplayMember= "Text";
combo.ValueMember = "Value";
combo.Items.Add(new Language("English", "en"));

【讨论】:

    【解决方案2】:

    创建类语言

    public class Language
    {
         public string Name{get;set;}
         public string Value{get;set;}
         public override string ToString() { return this.Name;}
    }
    

    然后,向组合框中添加所需的语言:

    yourCombobox.Items.Add(new Language{Name="English",Value="En"});
    

    【讨论】:

      【解决方案3】:
        Language[] items = new Language[]{new Language("English", "En"),
                      new Language("Italian", "It")};
      
                  languagesCombo.ValueMember = "Alias";
                  languagesCombo.DisplayMember = "FullName";
                  languagesCombo.DataSource = items.ToList();
      
                  languagesCombo.DropDownStyle = ComboBoxStyle.DropDownList;
      
       class Language
          {
              public string FullName { get; set; }
              public string Alias { get; set; }
      
              public Language(string fullName, string alias)
              {
                  this.FullName = fullName;
                  this.Alias = alias;
              }
          }
      

      通过将您的下拉框设置为“只读”,我假设您希望阻止用户输入其他选项,而不是在用户无法选择值的情况下完全只读??

      如果您希望它是完全只读的,您可以将 enabled 属性设置为 false。

      【讨论】:

      • @MarkB29: Enabled = false 将阻止用户甚至进入组合框来选择她/他想要的语言。这绝对不是什么好事。我猜mouthpiec 希望用户能够选择她/他的语言,尽管 Enabled = false 不允许这样做。要将 ComboBox 设置为只读,您需要将其 DropDownStyle 属性设置为 DropDownStyle.DropDownList。
      • @Will Marcouiller:我实际上已经把这个放在了我的回答中。
      • 是的,确实如此。请原谅我的误解,但是在您回答的代码示例之后,您指定将 Enabled 属性设置为 false 以使其完全只读,在我看来,禁用 ComboBox 不会带来任何优势,因为一个简单的标签会做工作。这就是我的意思。也许我错过了你的意图。
      【解决方案4】:

      要使其成为只读,请将 DropDownStyle 属性设置为 DropDownStyle.DropDownList。

      要填充 ComboBox,您需要有一个像 Language 这样的对象,例如包含两者:

      public class Language {
          public string Name { get; set; }
          public string Code { get; set; }
      }
      

      然后,您可以像这样将 IList 绑定到您的 ComboBox.DataSource 属性:

      IList<Language> languages = new List<Language>();
      languages.Add(new Language("English", "en"));
      languages.Add(new Language("French", "fr"));
      
      ComboxBox.DataSource = languages;
      ComboBox.DisplayMember = "Name";
      ComboBox.ValueMember = "Code";
      

      这将完全符合您的预期。

      【讨论】:

        【解决方案5】:

        定义一个类

        public class Language
        {
             public string Name { get; set; }
             public string Value { get; set; }
        }
        

        那么……

        //Build a list
        var dataSource = new List<Language>();
        dataSource.Add(new Language() { Name = "blah", Value = "blah" });
        dataSource.Add(new Language() { Name = "blah", Value = "blah" });
        dataSource.Add(new Language() { Name = "blah", Value = "blah" });
        
        //Setup data binding
        this.comboBox1.DataSource = dataSource;
        this.comboBox1.DisplayMember = "Name";
        this.comboBox1.ValueMember = "Value";
        
        // make it readonly
        this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
        

        【讨论】:

        • dataSource 列表中添加或删除项目时,这是否会自动更新组合框元素?
        【解决方案6】:

        您可以创建一个新类,类似于@Gregoire 的示例,但是,您需要覆盖ToString() 方法,以便它正确显示在组合框中,例如

        public class Language
        {
            private string _name;
            private string _code;
        
            public Language(string name, string code)
            {
                _name = name;
                _code = code;
            }
        
            public string Name { get { return _name; }  }
            public string Code { get { return _code; } }
            public override void ToString()
            {
                return _name;
            }
        }
        

        【讨论】:

          【解决方案7】:

          如果你只是想添加它而不创建新类,试试这个:

          // WPF
          <ComboBox Name="language" Loaded="language_Loaded" /> 
          
          
          // C# code
          private void language_Loaded(object sender, RoutedEventArgs e)
          {
              List<String> language= new List<string>();
              language.Add("English");
              language.Add("Spanish");
              language.Add("ect"); 
              this.chartReviewComboxBox.ItemsSource = language;
          }
          

          我建议一个 xml 文件,其中包含您将支持的所有语言 这样你就不必依赖c# 我肯定会像上面的程序员建议的那样为语言创建一个类。

          【讨论】:

            【解决方案8】:

            无需使用特定的类语言,

            只需将其替换为:

            KeyValuePair<string,string>
            

            【讨论】:

              【解决方案9】:

              但是你不只是得到你的组合框名称然后items.add("")吗?

              例如

              Language.Items.Add("Italian");
              Language.Items.Add("English");
              Language.Items.Add("Spanish");
              

              希望这会有所帮助:D

              【讨论】:

                【解决方案10】:

                简单的方法是:

                Dictionary<string, string> dict = new Dictionary<string, string>()
                {
                    {"English ","En" },
                    {"Italian  ","It" },
                    {"Spainish  ","Sp " }
                };
                
                combo.DataSource = new BindingSource(dict, null);
                combo.DisplayMember = "Key";
                combo.ValueMember = "Value";
                

                【讨论】:

                • 这是最优雅的方式。
                猜你喜欢
                • 2010-09-20
                • 1970-01-01
                • 1970-01-01
                • 2013-06-22
                • 2011-11-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多