【问题标题】:Winforms, Combobox, Databinding... allow user to type in a value not found in the DataSourceWinforms、Combobox、Databinding... 允许用户输入在 DataSource 中找不到的值
【发布时间】:2011-07-17 02:11:56
【问题描述】:

正如标题所说...我有一个带有数据绑定下拉菜单的 Winforms 应用程序。我希望用户能够方便地从一堆预定义的值中进行选择,同时也能够输入自己的值

如果我只是启用数据绑定并将下拉类型设置为除 DropDownList 之外的任何内容,它允许我输入我想要的任何内容,但不会将其保留到对象中... 看起来像一个简单的问题要解决...帮助?

【问题讨论】:

    标签: winforms data-binding combobox drop-down-menu


    【解决方案1】:

    我在 ComboBox.Leave 上添加了一个事件处理程序,此代码会将组合框中新键入的字符串添加到基础列表(国家),并刷新与其绑定的组合框。

    限制

    1. 您必须根据您拥有的数据源类型来处理添加新元素。
    2. List.Contains 区分大小写,您可能希望将所有字符串保留在一个大小写中。并在决定将其添加到数据源之前将用户输入的值转换为这种情况。

    开始吧,根据您的数据类型和数据源修改comboBox1_Leave 事件处理程序。

    public partial class Form1 : Form
    {
        private List<string> countries;
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            countries = new List<string>();
            countries.Add("Australia");
            countries.Add("Belgium");
            countries.Add("Canada");
            comboBox1.DataSource = countries;
        }
    
        private void comboBox1_Leave(object sender, EventArgs e)
        {
            ComboBox combo = (sender as ComboBox);
            CurrencyManager cm = (combo.BindingContext[combo.DataSource] as CurrencyManager);
            if (!cm.List.Contains(combo.Text))
            {
                cm.List.Add(combo.Text);
                cm.EndCurrentEdit();
                cm.Refresh();
                cm.Position = cm.Count - 1;
            }
        }
    }
    

    【讨论】:

    • 感谢快速且非常详细的回复!有没有在不修改原始数据源的情况下做到这一点?
    • 我不这么认为,但是您可以复制此组合的数据源并对此副本进行更改,而不会让此更改传播到其他数据源。
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2013-01-17
    • 1970-01-01
    • 2015-11-12
    • 2016-04-01
    相关资源
    最近更新 更多