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