当前位置: 首页 > 知识库问答 >
问题:

C#:WinForms:ComboBox:DropDown样式:SelectedItem SelectedIndex未正确设置:错误?

万修然
2023-03-14

我有一个带有DropDown style“drop down”的组合框。当我输入文本时。文本不是我在comboBox的文本区域中看到的文本,并且SelectedIndex SelectedItem与我在特定场景中插入的文本不一致。

似乎在打开下拉列表时,而不是在关闭下拉列表时,选择项(选择索引)对应于文本。

创建一个新表单,在其上放置一个组合框和一个按钮。将事件处理程序添加到 comboBox1 事件中: - 文本已更改 - 下拉列表 - 下拉列表已关闭,并将组合框的以下属性写入输出窗口(或文本框): - 组合框1.文本 - 组合框1.选定索引 - 组合框1.选定项 - 组合框1.选定值 - 组合框1.格式启用 我也为显示 comboBox1.Text 的按钮的单击事件添加了一个事件处理程序。

创建一个非常简单的类(例如TestItems ),它有3个属性(一个代码,一个描述和一个大写描述)。我通过用TestItems类的实例直接填充combobox项,并首先将它们添加到一个列表中,然后将combobox的DataSource设置为该列表来测试

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

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

文本已更改: 组合框文本 = [项目 0] - 组合框选定索引 = [0] - 组合框选定项 = [I0 项 0] - 组合框选定值 = [I0] - 组合框格式启用 = [真] 文本更改: 组合框文本 = [I] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本更改: 组合框文本 = [它] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真]文本已更改: 组合框.文本 = [ite] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本更改: 组合框文本 = [项目] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本已更改: 组合框文本 = [项] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真] 文本已更改: 组合框.文本 = [项目 5] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真] 文本已更改: 组合框.文本 = [项目 57] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真] 文本已更改: 组合框文本 = [项目 578] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真]

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

文本已更改: 组合框文本 = [项目 0] - 组合框选定索引 = [0] - 组合框选定项 = [I0 项 0] - 组合框选定值 = [I0] - 组合框格式启用 = [True] 下拉列表打开: 组合框文本 = [项目 0] - 组合框选定索引 = [0] - 组合框选定项 = [I0 项 0] - 组合框选定值 = [I0] - 组合框格式已启用 = [真] 文本已更改: 组合框文本 = [I] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框选定值 = [] - 组合框 已启用格式 = [True] 文本已更改: 组合框.文本 = [它] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本已更改: 组合框文本 = [ite] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本已更改: 组合框文本 = [项目] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框选定值 = [] - 组合框 已启用格式 = [True] 文本已更改: 组合框.文本 = [项目] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真] 文本已更改: 组合框文本 = [项目 5] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本已更改: 组合框文本 = [项目 57] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真] 文本已更改: 组合框文本 = [项目 578] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 下拉列表已关闭: 组合框文本 = [项目 578] - 组合框选定索引 = [0] - 组合框选定项 = [I0 项 0] - 组合框选定值 = [I0] - 组合框格式启用 = [真] 文本已更改: 组合框文本 = [项目 578] - 组合框选定索引 = [0] - 组合框选定项 = [I0 项 0] - 组合框选定值 = [I0] - 组合框格式启用 = [真]

场景3:SelectedIndex为57,SelectedItem为“Item 57”-插入“Item”-打开下拉列表-在日志末尾添加“8”:

文本已更改: 组合框文本 = [项目 0] - 组合框选定索引 = [0] - 组合框选定项 = [I0 项 0] - 组合框选定值 = [I0] - 组合框格式启用 = [真] 文本更改: 组合框文本 = [I] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本更改: 组合框文本 = [它] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真]文本已更改: 组合框.文本 = [ite] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本更改: 组合框文本 = [项目] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本已更改: 组合框文本 = [项] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真] 文本已更改: 组合框.文本 = [项目 5] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 文本更改: 组合框文本 = [项目 57] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 下拉列表打开: 组合框文本 = [项目 57] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式已启用 = [真]文本已更改: 组合框文本 = [项目 578] - 组合框选定索引 = [-1] - 组合框选定项 = [] - 组合框选定值 = [] - 组合框格式启用 = [真] 下拉列表关闭: 组合框文本 = [项目 578] - 组合框选定索引 = [57] - 组合框选定项 = [I57 项 57] - 组合框选定值 = [I57] - 组合框格式启用 = [真] 文本更改: 组合框文本 = [项目 578] - 组合框选定索引 = [57] - 组合框选定项 = [I57 项 57] - 组合框选定值 = [I57] - 组合框格式已启用 = [真]

离开组合框(失去焦点)不会改变选择项。附加注释:如果您将组合框的“FormatingEn的启用”属性设置为false,则combobox 1。文本将是选择项(display成员)的文本。因此,在第二个场景中,您将在组合框的文本区域中看到“项目57”,但当您单击显示组合框的按钮时。文本将显示“项目0”。

复制此内容的代码:

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;
    }
}

}

对我来说看起来像一个错误,不确定你的意见是什么。

诚挚的问候,巴特

共有1个答案

翟新
2023-03-14

首先,这是一大堆额外的信息,这就是为什么你还没有得到答案。第二,如果您想要将文本“输入”到comboBox中,您应该使用KeyPress事件并从中提取文本,通过enter键进行过滤。第三,如果您希望将源数据中不存在的选定项设置为null,您必须添加条件代码来实现这一点。这是一个使用通用字符串列表的非常简单的示例:

    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;
            }
        }
    }

此外,如果要阻止用户键入任何键(但仍从下拉项中进行选择),只需像这样使用 TextUpdate 事件(添加删除 KeyPress 事件,因为您不需要它):

    private void comboBox1_TextUpdate(object sender, EventArgs e)
    {
        if (!source.Contains(comboBox1.Text)) comboBox1.SelectedItem = null;
    }
 类似资料:
  • 问题内容: 我正在尝试使用带有剑道分离器的Reactjs。拆分器的样式属性如下 使用Reactjs,如果我正确理解了所有内容,则可以使用内联样式来实现 但是,我也使用Dustin Getz jsxutil尝试将内容拆分成更多部分并具有独立的html片段。到目前为止,我有以下html片段(splitter.html) 和splitter.js组件,该组件按如下方式引用此html 现在,当我运行此命令

  • 我的笔记本电脑上安装了Java14和Java8,但默认情况下我想使用8,所以我尝试将我的java_HOME设置为使用-V1.8。 在~/。bash_profile我添加了一行。执行此操作后,立即返回正确的路径,返回正确的版本。然而,如果我关闭终端并再次打开它,将产生一个空行,显示JAVA 14。编辑之后。bash_profile我做的当我重新打开终端并执行行设置JAVA_HOME仍然存在。为什么我

  • 我已经设置了一个谷歌工作表,它附带了一个脚本,运行一个函数来提取chromebook设备信息,除了我感兴趣的两个字段,“cpuStatusReports”和“diskVolumeReports”之外,效果非常好。脚本记录器确实显示了正确的信息,但我的工作表单元格值设置为例如 {cpuUtilizationPercentageInfo=[Ljava.lang.Object;@d151552,cpuT

  • 问题内容: Django(1.5)对我来说很好用,但是当我启动Python解释器(Python 3)进行检查时,尝试导入时会遇到最奇怪的错误 当它在Python解释器之外可以正常工作时,如何对其进行不正确的配置?在我的Django设置中,设置为: …这是如何配置不正确的? 问题答案: 你不能只启动Python并检查内容,Django不知道你要处理哪个项目。你必须执行以下操作之一: 采用 使用(或你

  • 在 Rax 中,有以下几种方式给元素设置样式: 内联样式 通过元素的 style 属性,为元素设置内联样式: 1const myStyle = { 2 fontSize: '24px', 3 color: '#FF0000' 4}; 5 6const element = <h1 style={myStyle}>Hello Rax</h1>; 需要注意的是,style 的值是一个 object,

  • 接口说明 设置样式 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /wish3dearth/api/material/shp/v1.0.0/setStyle 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 token string header 是 当前登录用户的TOKEN sceneId string qu