Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的列表框抛出异常?_C#_.net_Winforms_Listbox - Fatal编程技术网

C# 为什么我的列表框抛出异常?

C# 为什么我的列表框抛出异常?,c#,.net,winforms,listbox,C#,.net,Winforms,Listbox,好的,我能够创建一个简单的Windows窗体项目,它复制了我发现的一些奇怪的行为。在设计器中,创建一个表单,其中包含一个定位在顶部、左侧、右侧和底部的列表框(名为lbx)和一个按钮(button1)。现在,表单的代码如下所示: using System; using System.Windows.Forms; namespace ListBoxKaboom { public partial class Form1 : Form { private bool _i

好的,我能够创建一个简单的Windows窗体项目,它复制了我发现的一些奇怪的行为。在设计器中,创建一个表单,其中包含一个定位在顶部、左侧、右侧和底部的列表框(名为lbx)和一个按钮(button1)。现在,表单的代码如下所示:

using System;
using System.Windows.Forms;

namespace ListBoxKaboom
{
    public partial class Form1 : Form
    {
        private bool _initFinished = false;

        public Form1()
        {
            InitializeComponent();

            this._initFinished = true;

            this.Height += 100;
            this.Height -= 50;
            this.Height += 50;
        }

        private void lbx_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.button1.Enabled = (this.lbx.SelectedItem != null);
        }

        protected override void OnLayout(LayoutEventArgs e)
        {
            if (_initFinished)
            {
                int lines = (this.lbx.Height - 4) / this.lbx.ItemHeight;

                this.SuspendLayout();
                while (lines < this.lbx.Items.Count)
                {
                    this.lbx.Items.RemoveAt(this.lbx.Items.Count - 1);
                }

                while (lines > this.lbx.Items.Count)
                {
                    this.lbx.Items.Add("Item " + (this.lbx.Items.Count + 1).ToString());
                }
                this.ResumeLayout();
            }

            base.OnLayout(e);
        }
    }
}
使用系统;
使用System.Windows.Forms;
名称空间ListBoxKaboom
{
公共部分类Form1:Form
{
private bool_initFinished=false;
公共表格1()
{
初始化组件();
这是。_initFinished=true;
这个。高度+=100;
这个。高度-=50;
这个。高度+=50;
}
私有无效lbx\u SelectedIndexChanged(对象发送方,事件参数e)
{
this.button1.Enabled=(this.lbx.SelectedItem!=null);
}
受保护的覆盖仅限无效布局(LayoutEventArgs e)
{
如果(_initFinished)
{
int行=(this.lbx.Height-4)/this.lbx.ItemHeight;
这个.SuspendLayout();
while(行this.lbx.Items.Count)
{
this.lbx.Items.Add(“Item”+(this.lbx.Items.Count+1.ToString());
}
这是resumeloayout();
}
基地。仅布局(e);
}
}
}
请注意以下说明:

运行此操作,单击列表框中的任何项目,然后使用箭头键向下移动足够远,以使列表框滚动。卡布姆

异常(有时为NullReferenceException,有时为IndexOutOfBoundsException)。你知道为什么吗?此外,我认为这些项目应该是有序的,但它们不是。这只是一个愚蠢的角落案例,没有得到Windows窗体的正确处理,还是我做错了什么

堆栈跟踪:

在System.Windows.Forms.ListBox.NativeUpdateSelection()中

在System.Windows.Forms.ListBox.SelectedObjectCollection.EnsureUpToDate()中选择

在System.Windows.Forms.ListBox.SelectedObjectCollection.get\u InnerArray()中

在System.Windows.Forms.ListBox.SelectedObjectCollection.get_项(Int32索引)

在System.Windows.Forms.ListBox.get_SelectedItem()

我将其复制/粘贴到一个空表单,并得到一个StackOverflow异常。看看它,通过对布局事件中的项目进行操作,我认为您应该得到更好的结果

我意识到这可能是对其他事情的简化,但在EDS中您所能做的只是有限的

我的最佳猜测是:ResumeLayout触发递归布局操作。你可以试着用一个兄弟姐妹来阻止它,但我建议你在这里重新考虑旅游设计

我复制/粘贴错误,我的错误(使用布局事件)


第二次尝试:
基于这两个while循环,我希望项目字符串是有序的,没有垂直滚动条。很明显,列表框是混乱的,显示垂直滚动范围,并且项目顺序混乱。因此,一些“错误”已经出现在列表框的内部,等待滚动。我也可以用鼠标复制它

解决方法:您应该能够使用Resize事件获得所需的效果


尝试解释:列表框的(非托管部分)被具有挂起布局的(多个)添加/删除操作弄糊涂了。最后一个项目绘制在错误的位置,列表框无法计算像素到项目。

您不应该在列表中操作任何GUI元素 建造商,例如,该高度+=100;在你的例子中。 奇怪的事情会发生。我被这咬了一口 在遗留代码中多次使用

等待表单加载时间-处理base.load事件并执行以下操作 高度操纵


从“”:

问:“……我需要基本上弄清楚 两者的区别是什么 将代码放入Load事件的处理程序中, 而不是把代码放在表单的 之后的构造函数 InitializeComponents()行

答:“加载事件在 控件/窗体已完全关闭 已初始化并具有窗口句柄 创建。因此一旦此事件 它是一个完全可用的用户 接口控制。记住这一点 在构造函数内部,实际 控件/窗体的窗口句柄已更改 尚未创建,您只是 在此处和内部创建C#对象 InitializeComponent调用。”


请用堆栈信息发布异常。我运行了代码,但没有得到异常。你得到了什么样的异常,它在哪里抛出?如果没有异常,我怀疑我们能提供帮助。这闻起来像是由于在布局事件期间修改布局而导致的重新进入问题。你让列表框受到了它认为无法容忍的非自然行为的影响。结果,它以它唯一知道的方式——除了一个例外——大声疾呼。然而,当你把它逼疯的时候,它的叫声却语无伦次。为可怜的列表框哭泣;考虑到正在处理的不是列表框的布局,而是表单的布局,我不明白这怎么可能(堆栈溢出)。无论如何,修改列表框的内容不应影响父窗体的布局。请参阅initial post.FMM上的注释:修改表单子表单的布局可能会导致父表单的布局发生更改。我可以看到堆栈溢出是如何发生的。是的,但是修改列表框的内容不会影响它的边界。FMM:这不一定重要。你不能指望它不告诉它的父级它的布局已经改变了-这是一个实现细节,即使它的边界没有改变,它也可以这样做。杰夫:仍然不相关-我没有得到堆栈溢出。对不起,我不买这个。这正是表单设计师所做的