2

コードをデバッグしているときに、エラーが発生します#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);
    }
4

3 に答える 3

2

そうですね、あなたのデータモデルは値が であることを許可してdefectColor.OEEColornullませんnull。考えられる解決策は次の 3 つです。

  1. フィールドを変更できるようにデータ モデルを変更します。null
  2. defectColor.OEEColorないことを確認してくださいnull
  3. 行を次のように変更します。

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

0 または「色が」であることを示すために使用する<default value>その他の値を指定します。intnull


メソッドのコードを追加しましたAddMachineStatusColors。ありがとう、でもあなたのコードはそれdefectColor.OEEColornull. defectColor.OEEColorコードには、そうではない可能性があると思われる行が少なくとも2行ありますnull

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

のコードを表示するか、メソッドのどの行でエラーが発生getColorFromStringしたかを正確に教えてください!AddMachineStatusColors


わかりました、今、私たちはどこかに到達しています。文字列値「null」defectColor.OEEColorが含まれています!! つまり、それ自体は ではありませんが、「null」という単語が含まれていますdefectColor.OEEColornull

このため、次の行は「null」という単語を「#null」に変換します (したがって、「#null は有効な値ではありません...」という奇妙な質問の見出しになります):

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

その後oeeColor、値「#null」があり、次の行(例外が実際に発生する行の詳細を提供していないと思います...)がエラーをスローします。

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

defectColor.OEEColorどちらでもないnull(つまり、「値がない」) ことと、その値が有効な HTML カラー文字列であることを確認する必要があります。

于 2013-05-02T07:21:15.237 に答える
0

受け取った整数が null の可能性がある場合、それはおそらく です。Nullable<Integer>これは、プロパティを持つことを意味し.HasValueます...

foreach (var defectColor in satelliteStatusUserControl.DataSource.DefectColors)
{
    if(defectColor.OEEColor.HasValue) {
        MachineStatusCtrl.AddMachineStatusColors(defectColor.DefectTypeID, defectColor.DefectType, defectColor.OEEColor);
    } else {
        //Use a default
        MachineStatusCtrl.AddMachineStatusColors(defectColor.DefectTypeID, defectColor.DefectType, 0);
    }
}
于 2013-05-02T07:23:23.160 に答える
-1
int? satelliteId;
int i;
if (satelliteComboBox.SelectedValue != null && int.tryParse(satelliteComboBox.SelectedValue, out i))
{
    satellideId = i;
}
于 2013-05-02T07:25:03.053 に答える