在调试代码时,出现错误#NULL is not a valid value for Int32

private void satelliteComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    Helper.SetWaitCursor();
    if (satelliteComboBox.SelectedValue != null)
    {
        var satelliteId = Convert.ToInt32(satelliteComboBox.SelectedValue);
        satelliteStatusUserControl.DataSource =
            _satelliteStatusBusinessService.GetSingleSatellite(
                new Dictionary<string, object> { { "SatelliteID", satelliteId } }, true);
        //2012.07.07 get colors for all machine status
        satelliteStatusUserControl.DataSource.DefectColors =
                  _satelliteStatusBusinessService.GetDefectColors().ToList();

        foreach (var defectColor in
                      satelliteStatusUserControl.DataSource.DefectColors)
        {
            MachineStatusCtrl.AddMachineStatusColors(
                         defectColor.DefectTypeID,
                         defectColor.DefectType,
                         defectColor.OEEColor);
        }
        //2012.07.07
        satelliteStatusUserControl.DataBind();
    }
    Helper.SetDefaultCursor();
}


我在foreach循环中收到此错误

更新:这是AddMachineStatusColors的实现

public static void AddMachineStatusColors(int statusColorId, string StatusName, string oeeColor)
{
    MacStatusColors macStatusColor;

    //add dummy colors with unknow till the next defectId so that it will be easy to get color later while painting.
    for(int Index = StatusColors.Count; Index < statusColorId ; Index++)
    {
        macStatusColor = new MacStatusColors();
        StatusColors.Add(macStatusColor);
    }

    macStatusColor = new MacStatusColors();
    macStatusColor.DefectTypeID = statusColorId;
    macStatusColor.DefectType = StatusName;
    macStatusColor.OEEColor1 = ControlPaint.Dark(getColorFromString(oeeColor));
    macStatusColor.OEEColor2 = ControlPaint.Light(getColorFromString(oeeColor));
    StatusColors.Add(macStatusColor);
}



    public static Color getColorFromString(string oeeColor)
    {
        if (oeeColor[0] != '#') { oeeColor = '#' + oeeColor; }
        return System.Drawing.ColorTranslator.FromHtml(oeeColor);
    }

最佳答案

好吧,defectColor.OEEColor似乎是null,并且您的数据模型不允许该值是null。三种可能的解决方案:


更改数据模型,以便字段可以为null
确保defectColor.OEEColor不是null
将行更改为:

MachineStatusCtrl.AddMachineStatusColors(..., ..., defectColor.OEEColor ?? <default value>);


<default value>为0或要用于指示“颜色为int”的任何其他null值时。



您添加了AddMachineStatusColors方法的代码。谢谢,但是我仍然要说您的代码假定defectColor.OEEColor不是null。您的代码中至少有两行假设defectColor.OEEColor可能不是null

macStatusColor.OEEColor1 = ControlPaint.Dark(getColorFromString(oeeColor));
macStatusColor.OEEColor2 = ControlPaint.Light(getColorFromString(oeeColor));


请显示getColorFromString的代码,或者确切地告诉我们您的AddMachineStatusColors方法中哪一行发生错误!



好,现在我们到了某个地方。 defectColor.OEEColor包含字符串值“ null”!这意味着defectColor.OEEColor本身不是null,但是包含单词“ null”。

因此,以下行将单词“ null”变成“ #null”(因此,您对“ #null不是有效值...”的奇怪疑问):

if (oeeColor[0] != '#') { oeeColor = '#' + oeeColor; }


之后,oeeColor的值为“ #null”,然后下一行(我想,因为您没有向我们提供真正发生异常的那一行的详细信息...)引发错误:

return System.Drawing.ColorTranslator.FromHtml(oeeColor);


您必须确保defectColor.OEEColor都不是null(即“没有值”),并且它具有的值是有效的HTML颜色字符串!

10-02 00:50
查看更多