2

我编写了以下方法来加载具有尚未加载的值的列表框,但是在分配以下内容时,我得到的对象引用未设置为对象异常的实例。任何信息都有帮助。谢谢。

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

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

// Set value in the constructor
cabinetsCurrentNotUsed = new List<string>();

这是整个过程。

    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());
        }
    }
4

2 回答 2

2

您正在尝试将 null 添加到列表框。

安装在

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

利用

foreach (string s in cabinetsCurrentNotUsed)
{
    if(s != null)
          lbxCabinetName.Items.Add(s);
}

笔记

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

编辑

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

此外,如果您的 listBox 可以为空,请确保在填充列表框之前先检查它。

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);
于 2012-05-22T04:46:06.777 回答
0

字符串是可以为空的,所以在某些时候你必须做类似的事情:

cabinetsCurrentNotUsed.Add(null);

要么,要么正如 dbaseman 所说,它可能lbxCabinetName是空的,但我敢打赌,情况并非如此。

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

lbxCabinetName.Items.Add(cabinetsCurrentNotUsed[i]);
于 2012-05-22T04:17:30.257 回答