【问题标题】:Combobox returns null when value is typed键入值时,组合框返回 null
【发布时间】:2015-10-17 05:24:18
【问题描述】:

很抱歉,如果它有一些明显的解决方案,但我试图解决它几个小时但找不到解决方案。

我在我的WindowsFormsApplication 中使用了几个ComboBoxes 来将ids 与names 关联起来。问题是当用户从组合框列表中选择一个项目时,它可以正常工作,但是当他键入一个项目时,组合框的SelectedValue 属性是@ 987654326@.

为了模拟这个问题,我用一个按钮和一个组合框创建了一个 from。 在我的实际应用程序中,我使用 sqlserver 数据库中的表中的数据填充组合框,但为简单起见,这里我使用 list 填充它:

public Form1()
{
    InitializeComponent();
    List<KeyValuePair<short,short>> l = new List<KeyValuePair<short,short>>();
    l.Add(new KeyValuePair<short,short>(1,10));
    l.Add(new KeyValuePair<short,short>(2,20));
    l.Add(new KeyValuePair<short,short>(3,30));
    this.comboBox1.DataSource = l;
    this.comboBox1.DisplayMember = "Value";
    this.comboBox1.ValueMember = "Key";
}

private void button1_Click(object sender, EventArgs e)
{
    if (this.comboBox1.SelectedValue == null)
        MessageBox.Show("NULL");
    else
        MessageBox.Show(this.comboBox1.SelectedValue.ToString());
}

例如,当用户从列表中选择第二个项目 (20) 并单击按钮时,消息框按预期显示 2,但如果他键入数字 20 进入组合框,SelectedValuenull

这个问题可以通过改变组合框的样式来解决:

this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;

但它会阻止用户输入组合框,所以我不得不使用默认的ComboBoxStyle.DropDown

【问题讨论】:

    标签: c# combobox null selectedvalue


    【解决方案1】:

    那是因为组合框没有选择您键入的项目。添加此选项

    comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
    

    然后它会在找到该项目时选择它。

    默认设置为AutoCompleteMode.None

    (我认为)这主要是为建议而设计的,但它可以在这里解决您的问题。如果你想显示建议:

    comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;
    

    默认设置为AutoCompleteSource.None

    https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.autocompletemode%28v=vs.110%29.aspx

    【讨论】:

    • 很好的答案。非常感谢
    【解决方案2】:

    您有一个选项是在 comboBox1.TextChange 事件上使用 EventHandler,这将允许您亲自处理如何将文本翻译成不同的选项。

    这可以添加到设计器(类似于按钮)。

    this.comboBox1.TextChanged += new System.EventHandler(this.UpdateValue);

    然后根据如何读取结果并查看是否有匹配项,您可以创建一个转换器,使用另一个键/值,或者您可以执行一个无聊的旧 tryparse,我将向您展示。您将需要该列表作为您可以参考的属性,以查看您是否找到了正确的结果。

    private void UpdateValue(object sender, EventArgs e)
    {
        short result;
        if (short.TryParse(comboBox1.Text, out result))
        {
            var matches = from val in l where val.Value == result select val.Key;
            {
                foreach (short m in matches)
                    this.comboBox1.SelectedValue = m;
            }
        }
    }
    

    祝你好运!如果您需要更多有关事件处理程序的示例,请告诉我。不要忘记投票。

    【讨论】:

      猜你喜欢
      • 2015-11-11
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      相关资源
      最近更新 更多