C# 列表框在初始选择时生成-1(如果显示在文本下方)

C# 列表框在初始选择时生成-1(如果显示在文本下方),c#,.net,winforms,listbox,C#,.net,Winforms,Listbox,当我用一个简单的短文本文件的内容填充列表框时,一切正常,但是,如果我最初单击填充文本区域下方的列表框(即读取的9行下方),列表框将返回索引-1。例如,我的列表框的大小可以显示9行以上 这只是第一次发生。如果我选择其中一个文本行,则-1将不再显示,即使我在文本区域下方单击 using System; using System.Windows.Forms; using System.IO; namespace ListBoxProblem { public partial class Fo

当我用一个简单的短文本文件的内容填充列表框时,一切正常,但是,如果我最初单击填充文本区域下方的列表框(即读取的9行下方),列表框将返回索引
-1
。例如,我的列表框的大小可以显示9行以上

这只是第一次发生。如果我选择其中一个文本行,则
-1
将不再显示,即使我在文本区域下方单击

using System;
using System.Windows.Forms;
using System.IO;

namespace ListBoxProblem
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Read_Click(object sender, EventArgs e)
        {
            StreamReader sr = new StreamReader("data.txt");

            string line = "";
            while ((line = sr.ReadLine()) != null)
                listBox1.Items.Add(line);

            sr.Close();
            btn_Read.Enabled = false;
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int idx = listBox1.SelectedIndex;
            // MessageBox.Show("{0} -- {1}", idx.ToString(), (listBox1.Items[idx]).ToString());
            MessageBox.Show(idx.ToString());
            MessageBox.Show(listBox1.Items[idx].ToString());
        }
    }
}
我正在使用的简单文本数据文件:

Alpine Visa,3412.5,21.25
American Express,105,11.65
Chase Visa,5795,13.5
Citibank Visa,-2.3,18
Discover Card,153.25,12.65
Kmart,32.21,13.66
Marshall Fields,265.32,14
River Forest Mastercard,250.65,17
Sears,-45.3,14.3
我可以检查代码中的
-1
并处理此问题,但我想首先了解为什么会发生这种情况。这是一个较大程序的一部分,但我提取了相关代码(因此是硬编码的文件名/缺少检查)来显示问题

关于这一点,有人能告诉我为什么注释掉的
MessageBox.Show()
调用不起作用吗?它似乎相当于另外两个。我不熟悉C#和WinForms

编辑:对
MessageBox.Show()
我提出的问题,一个很好的简单替代方案/解决方案:


MessageBox.Show($”{idx}{(listBox1.Items[idx])}) 

有些人可能认为它是个bug,有些则不然。在访问阵列之前,请始终检查-1。MessageBox.Show有什么不起作用?丢失<代码>字符串。格式化(…<代码> >以确保我理解问题:用几个项目填充<代码> ListBox < /代码>。单击没有项目的空白空白。您的代码> SelectedIndex < /代码>是代码> -1 < /代码>(如Stutdd所说,这是有意义的)。然后点击一个实际的项目,得到<代码> 1代码/代码> <代码> SelectedIndex <代码>。然后,如果你点击返回到空白空间,你就不会得到索引“>代码> -1”/“代码”?我不确定到底发生了什么,但是我可以复制这个行为,我怀疑这是“按计划工作”。。如果您将
SelectionMode
更改为
MultiSimple
,您可以选择一个项目,然后取消选择它,您会注意到您的
SelectedIndex
现在是
-1
。因此,这可能只是单选工作方式的一些奇怪之处。“没有选择任何内容,但他们单击了列表框,做点什么吧!”然后再次单击“确定我们选择了一些内容,但他们没有选择任何内容,所以忽略该内容”,作为对LAR的响应,您应该执行
MessageBox.Show(String.Format(“{0}--{1}”,firstVal,secondVal));
。您正在调用
MessageBox.Show
的一些重载,该重载需要一个
MessageBoxButtons
参数,而不是“default”
MessageBox.Show(字符串)
您认为您的呼叫是可理解的。仅供参考。它在未来肯定会派上用场。我正在仔细查看列表框代码,看看是否能够准确地了解他们如何处理选择行为,但我无法理解。不过我看得不太透彻。