C# 将列表分配给列表框时,对象引用未设置为对象异常的实例

C# 将列表分配给列表框时,对象引用未设置为对象异常的实例,c#,winforms,list,nullreferenceexception,C#,Winforms,List,Nullreferenceexception,我编写了下面的方法来加载一个列表框,其中包含尚未加载的值,但在分配以下值时,我得到的对象引用未设置为对象异常的实例。任何信息都会有帮助。谢谢 lbxCabinetName.Items.Add(cabinetsCurrentNotUsed[i].ToString()); // Defined outside a method List<string> cabinetsCurrentNotUsed; // Set value in the constructor cabinetsC

我编写了下面的方法来加载一个列表框,其中包含尚未加载的值,但在分配以下值时,我得到的对象引用未设置为对象异常的实例。任何信息都会有帮助。谢谢

lbxCabinetName.Items.Add(cabinetsCurrentNotUsed[i].ToString());

// Defined outside a method
List<string> cabinetsCurrentNotUsed; 

// Set value in the constructor
cabinetsCurrentNotUsed = new List<string>();
lbxCabinetName.Items.Add(cabinetsCurrentNotUsed[i].ToString());
//在方法之外定义
列出当前未使用的橱柜;
//在构造函数中设置值
cabinetsCurrentNotUsed=新列表();
这是整个过程

    private void selectCabinetToAdd()
    {

        // Loop through all server and form cabinet types to see if there are matches
        for (int x = 0; x < opticalFile.serverCabinetNames.Count; x++)
        {
            bool cabinetExists = false;
            for (int i = 0; i < opticalFile.CabinetValues.Count; i++)
            {
                if (opticalFile.serverCabinetNames[x].ToString() == opticalFile.CabinetValues[i].ToString())
                {
                    cabinetExists = true;
                }
            }
            // Add cabinets not used to cabinetsCurrentNotUsed List
            if (!cabinetExists)
            {
                cabinetsCurrentNotUsed.Add(opticalFile.serverCabinetNames[x].ToString());
            }
        }

        // Send cabinetsCurrentNotUsed List to list box
        for (int i = 0; i < cabinetsCurrentNotUsed.Count; i++)
        {
            lbxCabinetName.Items.Add(cabinetsCurrentNotUsed[i].ToString());
        }
    }
private void selectCabinetToAdd()
{
//遍历所有服务器和表单文件柜类型,查看是否存在匹配项
对于(int x=0;x
字符串可以为空,因此在某些情况下,您必须执行类似以下操作:

cabinetsCurrentNotUsed.Add(null);
或者像dbaseman说的那样,
lbxCabinetName
可能为空,但我打赌情况并非如此

顺便说一句,这并不是一个真正的问题,但是如果您使用的是一个字符串的通用列表,则不需要调用
ToString()。您可以这样做:

lbxCabinetName.Items.Add(cabinetsCurrentNotUsed[i]);

您正在尝试向列表框添加空值

if(lbxCabinetName != null)
{
    selectCabinetToAdd();
}
代替

for (int i = 0; i < cabinetsCurrentNotUsed.Count; i++)
{
     lbxCabinetName.Items.Add(cabinetsCurrentNotUsed[i].ToString());
}
注意

这一部分与问题无关。但是在设置
cabinetExists=true之后,在您的内部for循环中您可以中断内部循环(如果至少满足一个条件,您可以确保cabinetExists为true。您不必检查内部循环中的其余项目)

编辑

private void selectCabinetToAdd()
{
        foreach (string sc in serverCabinetNames)
        {
            bool cabinetExists = false;
            foreach (string cv in CabinetValues)
            {
                if (sc == cv)
                {
                    cabinetExists = true;
                    break;
                }                    
            }

            if (!cabinetExists)
            {
                cabinetsCurrentNotUsed.Add(sc);
            }

        }

        foreach (string ccnu in cabinetsCurrentNotUsed)
        {
            if (ccnu != null)
                lbxCabinetName.Items.Add(ccnu);
        }
   }
此外,如果列表框可以为空,请确保在填充列表框之前先选中该选项

if(lbxCabinetName != null)
{
    selectCabinetToAdd();
}
编辑2

动态添加控件

ListBox lbxCabinetName = new ListBox();
lbxCabinetName.Location = new System.Drawing.Point(10, 55);
lbxCabinetName.Size = new System.Drawing.Size(130, 95);
this.Controls.Add(lbxCabinetName);

lbxCabinetName是否可能为空?这是我能看到的唯一可能性。这是可能的,但这不是添加项目的目的吗?如何确保lbxCabinetName列表框不为空,以便添加项目?此外,我还删除了.ToString(),添加了它,希望得到一个长期修补程序。实际上,如果您的函数要求它不为null,那么应该在函数的开头添加类似的内容:if(lbxCabinetName==null)throw new ArgumentNullException(“lbxCabinetName不能为null”);我已经通过调试运行了它,cabinetsCurrentNotUsed加载了我需要的精确值。我认为这与列表的初始化方式有关。我不确定,但提前谢谢你的帮助。我使用了这个精确的代码,但仍然得到相同的错误。我知道列表不是空的。它还在循环的第一次迭代中抛出异常。我正在运行调试,它确实声明lbxCabinetName列表框为null。如何将其设置为不为空?我以为添加项目会被挂起以使其不为null。@JoBaxter如何添加列表框?动态地或通过designer@JoBaxter我编辑了我的帖子。现在您不应该在迭代中得到异常loop@dbaseman起初OP提供的细节不是很清楚。无论如何,我修改了我的代码。