【问题标题】:Multiple Dependent Combo Boxes Cause Error When Scrolling滚动时多个相关组合框会导致错误
【发布时间】:2013-08-12 22:28:35
【问题描述】:

我创建了一个测试项目,它重现了我在被告知要修复的程序中遇到的错误。您可以在http://tomsfreelance.com/stackoverflow/comboBox/查看(代码在底部)

当我单击第二个组合框的picturebox 按钮并使用鼠标中轮向上滚动时,会出现以下错误。这里的关键点是必须选择第一个组合框 - 这发生在您第一次启动应用程序时。

这个sn-p出现错误:

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (comboBox2.SelectedIndex <= 0)
        {
            comboBox3.SelectedIndex = 0;
            comboBox3.Items.Clear();
            comboBox3.Enabled = false;
        }

这是应用程序的作用:

  • 当第一个组合框设置为它的第一个项目时,第二个组合框设置为它的第一个项目,它的项目被清除,然后它被禁用。
  • 第二个组合框相对于第三个组合框也是如此。

现在,每个组合框都会监听事件SelectedIndexChanged。因此,当第一个组合框更改为它的第一项时,第二个组合框设置为它的第一项。

如果您在调试器中运行此程序,则必须启用错误断点,否则 VS 调试器将表现得好像没有任何问题。如果你运行独立的exe,你会收到错误信息。

为什么会出现此错误消息?我可以通过删除选定的索引并在Items.Clear 上方启用移动来修复错误消息。不过,我更好奇为什么会这样。在我看来,同时拥有两个活动元素可能是 Windows 错误? (在这个糟糕的编程示例之上。)

这个问题是https://stackoverflow.com/questions/18150063/combo-box-scrolling-up-with-mouse-wheel-causes-error#comment26589550_18150063的后续问题

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ComboBoxTest
{
    public partial class Form1 : Form
    {
        public static int refillPrefix = 0;

        public Form1()
        {
            InitializeComponent();
            initComboBox();
            comboBox1.SelectedIndex = 1;
            comboBox2.SelectedIndex = 4;
            comboBox3.SelectedIndex = 5;
        }

        public void initComboBox()
        {
            comboBox1.Items.Clear();
            for (int x = 0; x < 15; ++x)
            {
                comboBox1.Items.Add("Test " + x.ToString());
            }
        }

        public void fillCombo2()
        {
            comboBox2.Items.Clear();
            for (int x = 0; x < 15; ++x)
            {
                comboBox2.Items.Add("Test " + refillPrefix.ToString() + "_" + x.ToString());
            }
            refillPrefix++;
        }

        public void fillCombo3()
        {
            for (int x = 0; x < 15; ++x)
            {
                comboBox3.Items.Add("Test " + refillPrefix.ToString() + "_" + x.ToString());
            }
            refillPrefix++;
        }

        private void comboBox1_Click(object sender, EventArgs e)
        {
            comboBox1.DroppedDown = !comboBox1.DroppedDown;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            comboBox1.DroppedDown = !comboBox1.DroppedDown;
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            comboBox2.DroppedDown = !comboBox2.DroppedDown;
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox1.SelectedIndex <= 0)
            {
                comboBox2.SelectedIndex = 0;
                comboBox2.Items.Clear();
                comboBox2.Enabled = false;
                pictureBox1.Enabled = false;
            }
            else
            {
                fillCombo2();
                comboBox2.Enabled = true;
                pictureBox1.Enabled = true;
            }
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBox2.SelectedIndex <= 0)
            {
                comboBox3.SelectedIndex = 0;
                comboBox3.Items.Clear();
                comboBox3.Enabled = false;
            }
            else
            {
                fillCombo3();
                comboBox3.Enabled = true;
            }
        }

        private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}

【问题讨论】:

    标签: c# combobox


    【解决方案1】:

    您可能正在尝试设置或使用所选项目的索引,但未选择任何项?

    检查 combobox.selecteditems.count 。如果为 0,则退出例程。当所选索引更改或取消选择项目时,组合框/列表框中会发生这种情况。你基本上想检查每个电话,如果没有选定的项目,不要使用任何项目。调用应该发生两次,在第二次调用时,将有选定的项目,您可以使用它们。

    【讨论】:

    • msdn.microsoft.com/en-us/library/… 建议我应该能够随时获取 selectedIndex。将 selectedIndex 设置为 -1 也有相同的错误消息。组合框不是多选组合框,且 selectedItems 成员不存在。 (selectedItem 确实)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多