C#:WinForms:组合框:下拉样式:SelectedItem+;SelectedIndex设置不正确:错误?

C#:WinForms:组合框:下拉样式:SelectedItem+;SelectedIndex设置不正确:错误?,c#,winforms,combobox,C#,Winforms,Combobox,我有一个下拉式的组合框。 当我输入文本时,组合框1.text不是我在组合框文本区域中看到的文本,SelectedIndex+SelectedItem与我在特定场景中插入的文本不对应 似乎selectedItem(+SelectedIndex)对应于打开下拉列表时的文本,而不是关闭下拉列表时的文本 创建一个新表单,在其上放置一个组合框和一个按钮。 将eventhandler添加到comboBox1事件,用于: -文本更改 -下拉列表 -下拉关闭 并将组合框的以下属性写入输出窗口(或文本框): -c

我有一个下拉式的组合框。 当我输入文本时,组合框1.text不是我在组合框文本区域中看到的文本,SelectedIndex+SelectedItem与我在特定场景中插入的文本不对应

似乎selectedItem(+SelectedIndex)对应于打开下拉列表时的文本,而不是关闭下拉列表时的文本

创建一个新表单,在其上放置一个组合框和一个按钮。 将eventhandler添加到comboBox1事件,用于: -文本更改 -下拉列表 -下拉关闭 并将组合框的以下属性写入输出窗口(或文本框): -comboBox1.Text -comboBox1.SelectedIndex -comboBox1.SelectedItem -comboBox1.SelectedValue -comboBox1.FormattingEnabled 我为显示comboBox1.Text的按钮的click事件添加了一个eventhandler

创建一个非常简单的类(例如TestItems),它有3个属性(一个代码、一个描述和一个DescriptionUppercase)。 我通过直接用TestItems类的实例填充combobox项并首先将它们添加到列表中,然后将combobox的数据源设置到列表中来测试它。它的工作原理有点不同,但都不是我期望的那样。我会坚持这张单子。 我用100个测试项(Code=“I0”。“I99”和description“Item 1”。“Item 100”)填充列表。我将DisplayMember设置为“description”,将ValueMember设置为“Code”

我使用稍微不同的场景插入了三次文本“项目578”

场景1:SelectedIndex为-1,SelectedItem为空。 -只需在组合框中填写“项目578”(不要打开下拉列表) 从输出窗口记录:

Text更改:ComboBox.Text=[ITEM 0]-ComboBox SelectedIndex=[0]-ComboBox SelectedItem=[I0+ITEM 0]-ComboBox SelectedValue=[I0]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[I]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[It]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Ite]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item 5]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item 57]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item 578]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True]

场景2:selectedIndex=0,SelectedItem为“项目0” -打开下拉列表(单击组合框右侧的箭头) -输入“项目578” -关闭下拉列表 日志记录:

Text更改:ComboBox.Text=[ITEM 0]-ComboBox SelectedIndex=[0]-ComboBox SelectedItem=[I0+ITEM 0]-ComboBox SelectedValue=[I0]-ComboBox FormattingEnabled=[True] 打开下拉列表:ComboBox.Text=[ITEM 0]-ComboBox SelectedIndex=[0]-ComboBox SelectedItem=[I0+ITEM 0]-ComboBox SelectedValue=[I0]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[I]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[It]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Ite]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item 5]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item 57]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item 578]-ComboBox SelectedIndex=[-1]-ComboBox SelectedItem=[]-ComboBox SelectedValue=[]-ComboBox FormattingEnabled=[True] 下拉关闭:ComboBox.Text=[Item 578]-ComboBox SelectedIndex=[0]-ComboBox SelectedItem=[I0+Item 0]-ComboBox SelectedValue=[I0]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[Item 578]-ComboBox SelectedIndex=[0]-ComboBox SelectedItem=[I0+Item 0]-ComboBox SelectedValue=[I0]-ComboBox FormattingEnabled=[True]

场景3:SelectedIndex为57,SelectedItem为“项目57” -插入“项目57” -打开下拉列表 -在末尾加上一个“8” 日志记录:

Text更改:ComboBox.Text=[ITEM 0]-ComboBox SelectedIndex=[0]-ComboBox SelectedItem=[I0+ITEM 0]-ComboBox SelectedValue=[I0]-ComboBox FormattingEnabled=[True] Text更改:ComboBox.Text=[I]-ComboBox SelectedIndex=[-1]-ComboBox Selec
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace TestCombobox
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.comboBox1.FormattingEnabled = true;
        comboBox1.DropDownClosed += ComboBox1_DropDownClosed;
        comboBox1.DropDown += ComboBox1_DropDown;
        comboBox1.TextChanged += ComboBox1_TextChanged;
        comboBox1.DisplayMember = "DescriptionUpperCase";
        comboBox1.ValueMember = "Code";
        FillCombo();
    }
    private void ComboBox1_DropDown(object sender, EventArgs e)
    {
        ShowDebugInfoCombobox("Dropdown opened");
    }

    private void ComboBox1_TextChanged(object sender, EventArgs e)
    {
        ShowDebugInfoCombobox("TextChanged");
    }

    private void ShowDebugInfoCombobox(string Info)
    {
        Debug.WriteLine($"{Info}: ComboBox.Text = <{comboBox1.Text}> - ComboBox SelectedIndex = <{comboBox1.SelectedIndex}> - ComboBox SelectedItem = <{comboBox1.SelectedItem}> - ComboBox SelectedValue = <{comboBox1.SelectedValue}>  - Combobox FormattingEnabled = <{comboBox1.FormattingEnabled}>");
    }

    private void ComboBox1_DropDownClosed(object sender, EventArgs e)
    {
        ShowDebugInfoCombobox("DropDownClosed");
    }

    private void FillCombo()
    {
        List<TestItems> aList = new List<TestItems>();
        for (int cnt = 0; cnt < 100; cnt++)
        {
            aList.Add(new TestItems($"I{cnt.ToString()}", $"Item {cnt.ToString()}"));
            //comboBox1.Items.Add(new TestItems($"I{cnt.ToString()}", $"Item {cnt.ToString()}"));
        }
        comboBox1.DataSource = aList;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(this.comboBox1?.SelectedItem?.ToString() + " Text = " + this.comboBox1.Text);

    }
}
public class TestItems
{
    public string Code { get; set; }
    public string Description { get; set; }
    public string DescriptionUpperCase { get { return Description.ToUpper(); }  }

    public TestItems(string code, string description)
    {
        this.Code = code;
        this.Description = description;
    }
    public override string ToString()
    {
        return this.Code + " + " + this.Description;
    }
}
    List<string> source = new List<string>();

    public Form1()
    {
        InitializeComponent();
        source.Add("Item 1");
        source.Add("Item 2");
        comboBox1.Items.AddRange(source.ToArray());
    }

    // Enter key detection as shown in https://stackoverflow.com/a/1226740/4034168
    private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == 13)
        {
            if (!source.Contains(comboBox1.Text))
            {
                comboBox1.SelectedIndex = -1;
                comboBox1.SelectedItem = null;
            }
        }
    }
    private void comboBox1_TextUpdate(object sender, EventArgs e)
    {
        if (!source.Contains(comboBox1.Text)) comboBox1.SelectedItem = null;
    }