user2721466
user2721466

Reputation:

Null reference was unhandled C#

I have a problem within my source code. I have a file for saving my settings to an ini file. But when I want to save the settings from the main form I get an NullRefrenceExpection was unhandled exception. Where is the problem is?

Edit I get the exception at this part of the code:

private void SaveSettings()
    {
        //SettingsIniFile iniFile = new SettingsIniFile();
        _settingsIniFile.Save(LoadTextBoxes());
    }

Code Mainform:

using System.Windows.Forms;
using System.IO.Ports;

namespace Milk_Units
{
    public partial class MainForm : Form
    {
        private Settings _settings;
        private SettingsIniFile _settingsIniFile;

        public MainForm()
        {
            InitializeComponent();
            LoadSettings(false);
            LoadTextBoxes();
            LoadComportName();
        }

        private void LoadSettings(bool defaults)
        {
            SettingsIniFile iniFile = new SettingsIniFile();
            _settings = iniFile.LoadSettings(defaults);
        }

        private void SaveSettings()
        {
            //SettingsIniFile iniFile = new SettingsIniFile();
            _settingsIniFile.Save(LoadTextBoxes());
        }

        private Settings LoadTextBoxes()
        {
            //ACR
            _startRemovalTextBox.Text = _settings.AcrStartRemoval;
            _removalTimeTextBox.Text = _settings.AcrRemovalTime;
            _removalDelayTextBox.Text = _settings.AcrRemovalDelay;
            //CLEANING
            _durCleaningTextbox.Text = _settings.CleanDurCleaning;
            _timeValveOnTextbox.Text = _settings.CleanTimeValveOn;
            _timeValveOffTextBox.Text = _settings.CleanTimeValveOff;
            //CALIBRATE
            _contentLeftTextBox.Text = _settings.CalibrateContentLeft;
            _calibrateLeftTextBox.Text = _settings.CalibrateCalibrateLeft;
            _contentRightTextBox.Text = _settings.CalibrateContentRight;
            _calibrateRightTextBox.Text = _settings.CalibrateCalibrateRight;
            //CONDUCTIVITY
            _factorLeftTextBox.Text = _settings.ConductFactorLeft;
            _offsetLeftTextBox.Text = _settings.ConductOffsetleft;
            _factorRightTextBox.Text = _settings.ConductFactorRight;
            _offsetRightTextBox.Text = _settings.ConductOffsetRight;
            _levelLeftTextBox.Text = _settings.ConductLevelLeft;
            _levelRightTextBox.Text = _settings.ConductLevelRight;
            //GENERAL
            _typeOfValveTextBox.Text = _settings.GeneralTypeOfValve;
            _indicatorTextBox.Text = _settings.GeneralIndicator;
            _inverseOutputTextBox.Text = _settings.GeneralInverseOutput;
            _restartTimeTextBox.Text = _settings.GeneralRestartTime;
            _waterTimeTextBox.Text = _settings.GeneralWaterTime;
            _gateDelayTextbox.Text = _settings.GeneralGateDelay;
            //PULSATION
            _pulsationTextBox.Text = _settings.PulsationPulsationPm;
            _ratioFrontTextBox.Text = _settings.PulsationSrRatioFront;
            _ratioBackTextBox.Text = _settings.PulsationSrRatioBack;
            _stimulationTextBox.Text = _settings.PulsationStimulationPm;
            _stimFrontTextBox.Text = _settings.PulsationSrStimFront;
            _stimBackTextBox.Text = _settings.PulsationSrStimBack;
            _stimulationDurTextBox.Text = _settings.PulsationStimulationDur;

            return _settings;
        }

        private void DefaultSettingButtonClick(object sender, System.EventArgs e)
        {
            LoadSettings(true);
            LoadTextBoxes();
            SaveSettings();
            LoadComportName();
        }


        private void SendSettingsButtonClick(object sender, System.EventArgs e)
        {
            SaveSettings();
        }

        private void LoadComportName()
        {
            _comPortComboBox.DataSource = SerialPort.GetPortNames();
        }

    }

Code Settingsinifile

using System;
using System.Windows.Forms;
using Idento.Common.Utilities;
using Milk_Units;

namespace Milk_Units
{
    public class SettingsIniFile
    {
        private const String FileNameCustom = "Data\\Custom.ini";//Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), );
        private const String FileNameDefault = "Data\\Default.ini";//Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), );


        public Settings LoadSettings(bool defaults = false)
        {
            String fileName = defaults ? FileNameDefault : FileNameCustom;
            StringList input = new StringList().FromFile(fileName);

            //Settings settings = null;
            Settings settings = new Settings();

            foreach (var item in input)
            {
                String line = item.Trim();

                if (line.StartsWith("[") && line.EndsWith("]"))
                    continue;

                int index = line.IndexOf('=');
                if (index < 0)
                    continue;

                String key = line.Substring(0, index).Trim();

                String value = line.Substring(index + 1).Trim();
                String comment = "";
                index = value.IndexOf("//");
                if (index > -1)
                {
                    comment = value.Substring(index).Trim();
                    value = value.Substring(0, index).Trim();
                }

                // ACR
                if (Utils.EqualsIgnoreCase(key, "10: Start Removal"))
                    settings.AcrStartRemoval = value;
                else if (Utils.EqualsIgnoreCase(key, "11: Removal Time"))
                    settings.AcrRemovalTime = value;
                else if (Utils.EqualsIgnoreCase(key, "12: Removal Delay"))
                    settings.AcrRemovalDelay = value;
                // CLEANING
                else if (Utils.EqualsIgnoreCase(key, "21: Dur. Cleaning"))
                    settings.CleanDurCleaning = value;
                else if (Utils.EqualsIgnoreCase(key, "22: Time valve on"))
                    settings.CleanTimeValveOn = value;
                else if (Utils.EqualsIgnoreCase(key, "23: Time valve off"))
                    settings.CleanTimeValveOff = value;
                //CALIBRATE
                else if (Utils.EqualsIgnoreCase(key, "31: Content left"))
                    settings.CalibrateContentLeft = value;
                else if (Utils.EqualsIgnoreCase(key, "32: Calibrate left"))
                    settings.CalibrateCalibrateLeft = value;
                else if (Utils.EqualsIgnoreCase(key, "33: Content right"))
                    settings.CalibrateContentRight = value;
                else if (Utils.EqualsIgnoreCase(key, "34: Calibrate right"))
                    settings.CalibrateCalibrateRight = value;
                //CONDUCTIVITY
                else if (Utils.EqualsIgnoreCase(key, "41: Factor left"))
                    settings.ConductFactorLeft = value;
                else if (Utils.EqualsIgnoreCase(key, "42: Offset left"))
                    settings.ConductOffsetleft = value;
                else if (Utils.EqualsIgnoreCase(key, "43: Factor right"))
                    settings.ConductFactorRight = value;
                else if (Utils.EqualsIgnoreCase(key, "44: Offset right"))
                    settings.ConductOffsetRight = value;
                else if (Utils.EqualsIgnoreCase(key, "45: Level left"))
                    settings.ConductLevelLeft = value;
                else if (Utils.EqualsIgnoreCase(key, "46: Level right"))
                    settings.ConductLevelRight = value;
                //GENERAL
                else if (Utils.EqualsIgnoreCase(key, "51: Type of valve"))
                    settings.GeneralTypeOfValve = value;
                else if (Utils.EqualsIgnoreCase(key, "52: Indicator"))
                    settings.GeneralIndicator = value;
                else if (Utils.EqualsIgnoreCase(key, "53: Inverse output"))
                    settings.GeneralInverseOutput = value;
                else if (Utils.EqualsIgnoreCase(key, "54: Restart time"))
                    settings.GeneralRestartTime = value;
                else if (Utils.EqualsIgnoreCase(key, "55: Water time"))
                    settings.GeneralWaterTime = value;
                else if (Utils.EqualsIgnoreCase(key, "56: Gate delay"))
                    settings.GeneralGateDelay = value;
                //PULSATION
                else if (Utils.EqualsIgnoreCase(key, "61: Pulsation p/m"))
                    settings.PulsationPulsationPm = value;
                else if (Utils.EqualsIgnoreCase(key, "62: S/r ratio front"))
                    settings.PulsationSrRatioFront = value;
                else if (Utils.EqualsIgnoreCase(key, "63: S/r ratio back"))
                    settings.PulsationSrRatioBack = value;
                else if (Utils.EqualsIgnoreCase(key, "64: Stimulation p/m"))
                    settings.PulsationStimulationPm = value;
                else if (Utils.EqualsIgnoreCase(key, "65: S/r stim front"))
                    settings.PulsationSrStimFront = value;
                else if (Utils.EqualsIgnoreCase(key, "66: S/r stim back"))
                    settings.PulsationSrStimBack = value;
                else if (Utils.EqualsIgnoreCase(key, "67: Stimulation dur"))
                    settings.PulsationStimulationDur = value;



            }
            return settings;
        }

        public void Save(Settings settings)
        {
            StringList list = new StringList();


            list.Add("[Settings]");
            list.Add("");
            list.Add("[ACR]");
            list.Add("10: Start Removal =" + settings.AcrStartRemoval + " // ms");
            list.Add("11: Removal Time  =" + settings.AcrRemovalTime + " // commentary");
            list.Add("12: Removal Delay =" + settings.AcrRemovalDelay + " // commentary");
            list.Add("");
            list.Add("[Cleaning]");
            list.Add("21: Dur. Cleaning =" + settings.CleanDurCleaning + " //commentary");
            list.Add("22: Time valve on =" + settings.CleanTimeValveOn + "  //commentary");
            list.Add("23: Time valve off =" + settings.CleanTimeValveOff + "    //commentary");
            list.Add("");
            list.Add("[Calibrate]");
            list.Add("31: Content left =" + settings.CalibrateContentLeft + "//commentary");
            list.Add("32: Calibrate left =" + settings.CalibrateCalibrateLeft + "//commentary");
            list.Add("33: Content right =" + settings.CalibrateContentRight + "//commentary");
            list.Add("34: Calibrate right =" + settings.CalibrateCalibrateRight + "//commentary");
            list.Add("");
            list.Add("[Conductivity]");
            list.Add("41: Factor left =" + settings.ConductFactorLeft + "//commentary");
            list.Add("42: Offset left =" + settings.ConductOffsetleft + "//commentary");
            list.Add("43: Factor right =" + settings.ConductFactorRight + "//commentary");
            list.Add("44: Offset right =" + settings.ConductOffsetRight + "//commentary");
            list.Add("45: Level left =" + settings.ConductLevelLeft + "//commentary");
            list.Add("46: Level right =" + settings.ConductLevelRight + "//commentary");
            list.Add("");
            list.Add("[General]");
            list.Add("51: Type of valve =" + settings.GeneralTypeOfValve + "//commentary");
            list.Add("52: Indicator =" + settings.GeneralIndicator + "//commentary");
            list.Add("53: Inverse output =" + settings.GeneralInverseOutput + "//commentary");
            list.Add("54: Restart time =" + settings.GeneralRestartTime + "//commentary");
            list.Add("55: Water time =" + settings.GeneralWaterTime + "//commentary");
            list.Add("56: Gate delay =" + settings.GeneralGateDelay + "//commentary");
            list.Add("");
            list.Add("[Pulsation]");
            list.Add("61: Pulsation p/m =" + settings.PulsationPulsationPm + "//commentary");
            list.Add("62: S/r ratio front =" + settings.PulsationSrRatioFront + "//commentary");
            list.Add("63: S/r ratio back =" + settings.PulsationSrRatioBack + "//commentary");
            list.Add("64: Stimulation p/m =" + settings.PulsationStimulationPm + "//commentary");
            list.Add("65: S/r stim front =" + settings.PulsationSrStimFront + "//commentary");
            list.Add("66: S/r stim back =" + settings.PulsationSrStimBack + "//commentary");
            list.Add("67: Stimulation dur =" + settings.PulsationStimulationDur + "//commentary");


            try
            {
                list.ToFile(FileNameCustom);
            }
            catch (Exception exc)
            {
                MessageBox.Show("Exception saving settings: " + exc.Message);
            }
        }
    }
}

Upvotes: 0

Views: 178

Answers (2)

Colin Smith
Colin Smith

Reputation: 12540

The _settingsIniFile member variable isn't initialized.

Have modified your code so that it intializes that member, and also in your LoadSettings and SaveSettings it refers to that member variable too.

Try this:

using System.Windows.Forms;
using System.IO.Ports;

namespace Milk_Units
{
    public partial class MainForm : Form
    {
        private Settings _settings;
        private SettingsIniFile _settingsIniFile = new SettingsIniFile();

        public MainForm()
        {
            InitializeComponent();
            LoadSettings(false);
            LoadComportName();
        }

        private void LoadSettings(bool defaults)
        {
            _settings = _settingsIniFile.LoadSettings(defaults);
            LoadTextBoxes();
        }

        private void SaveSettings()
        {
            SaveTextBoxes();
            _settingsIniFile.Save(_settings);
        }

        private void LoadTextBoxes()
        {
            //ACR
            _startRemovalTextBox.Text = _settings.AcrStartRemoval;
            _removalTimeTextBox.Text = _settings.AcrRemovalTime;
            _removalDelayTextBox.Text = _settings.AcrRemovalDelay;
            //CLEANING
            _durCleaningTextbox.Text = _settings.CleanDurCleaning;
            _timeValveOnTextbox.Text = _settings.CleanTimeValveOn;
            _timeValveOffTextBox.Text = _settings.CleanTimeValveOff;
            //CALIBRATE
            _contentLeftTextBox.Text = _settings.CalibrateContentLeft;
            _calibrateLeftTextBox.Text = _settings.CalibrateCalibrateLeft;
            _contentRightTextBox.Text = _settings.CalibrateContentRight;
            _calibrateRightTextBox.Text = _settings.CalibrateCalibrateRight;
            //CONDUCTIVITY
            _factorLeftTextBox.Text = _settings.ConductFactorLeft;
            _offsetLeftTextBox.Text = _settings.ConductOffsetleft;
            _factorRightTextBox.Text = _settings.ConductFactorRight;
            _offsetRightTextBox.Text = _settings.ConductOffsetRight;
            _levelLeftTextBox.Text = _settings.ConductLevelLeft;
            _levelRightTextBox.Text = _settings.ConductLevelRight;
            //GENERAL
            _typeOfValveTextBox.Text = _settings.GeneralTypeOfValve;
            _indicatorTextBox.Text = _settings.GeneralIndicator;
            _inverseOutputTextBox.Text = _settings.GeneralInverseOutput;
            _restartTimeTextBox.Text = _settings.GeneralRestartTime;
            _waterTimeTextBox.Text = _settings.GeneralWaterTime;
            _gateDelayTextbox.Text = _settings.GeneralGateDelay;
            //PULSATION
            _pulsationTextBox.Text = _settings.PulsationPulsationPm;
            _ratioFrontTextBox.Text = _settings.PulsationSrRatioFront;
            _ratioBackTextBox.Text = _settings.PulsationSrRatioBack;
            _stimulationTextBox.Text = _settings.PulsationStimulationPm;
            _stimFrontTextBox.Text = _settings.PulsationSrStimFront;
            _stimBackTextBox.Text = _settings.PulsationSrStimBack;
            _stimulationDurTextBox.Text = _settings.PulsationStimulationDur;

            return _settings;
        }

        private void SaveTextBoxes()
        {
            //ACR
            _settings.AcrStartRemoval = _startRemovalTextBox.Text;
            _settings.AcrRemovalTime = removalTimeTextBox.Text; 
            _settings.AcrRemovalDelay = _removalDelayTextBox.Text;
            //CLEANING
            _settings.CleanDurCleaning = _durCleaningTextbox.Text;
            _settings.CleanTimeValveOn = _timeValveOnTextbox.Text;
            _settings.CleanTimeValveOff = _timeValveOffTextBox.Text;
            //CALIBRATE
            _settings.CalibrateContentLeft = _contentLeftTextBox.Text;
            _settings.CalibrateCalibrateLeft = _calibrateLeftTextBox.Text;
            _settings.CalibrateContentRight = _contentRightTextBox.Text;
            _settings.CalibrateCalibrateRight = _calibrateRightTextBox.Text;
            //CONDUCTIVITY
            _settings.ConductFactorLeft = _factorLeftTextBox.Text;
            _settings.ConductOffsetleft = _offsetLeftTextBox.Text;
            _settings.ConductFactorRight = _factorRightTextBox.Text;
            _settings.ConductOffsetRight = _offsetRightTextBox.Text;
            _settings.ConductLevelLeft = _levelLeftTextBox.Text;
            _settings.ConductLevelRight = _levelRightTextBox.Text;
            //GENERAL
            _settings.GeneralTypeOfValve = _typeOfValveTextBox.Text;
            _settings.GeneralIndicator = _indicatorTextBox.Text;
            _settings.GeneralInverseOutput = _inverseOutputTextBox.Text;
            _settings.GeneralRestartTime = _restartTimeTextBox.Text;
            _settings.GeneralWaterTime = _waterTimeTextBox.Text;
            _settings.GeneralGateDelay = _gateDelayTextbox.Text;
            //PULSATION
            _settings.PulsationPulsationPm = _pulsationTextBox.Text;
            _settings.PulsationSrRatioFront = _ratioFrontTextBox.Text;
            _settings.PulsationSrRatioBack = _ratioBackTextBox.Text;
            _settings.PulsationStimulationPm = _stimulationTextBox.Text;
            _settings.PulsationSrStimFront = _stimFrontTextBox.Text;
            _settings.PulsationSrStimBack = _stimBackTextBox.Text;
            _settings.PulsationStimulationDur = _stimulationDurTextBox.Text;
        }

        private void DefaultSettingButtonClick(object sender, System.EventArgs e)
        {
            LoadSettings(true);
            SaveSettings();
            LoadComportName();
        }


        private void SendSettingsButtonClick(object sender, System.EventArgs e)
        {
            SaveSettings();
        }

        private void LoadComportName()
        {
            _comPortComboBox.DataSource = SerialPort.GetPortNames();
        }

    }

Upvotes: 1

paul
paul

Reputation: 22001

I cannot see where you initialise _settingsIniFile;

try changing your declaration to:

private SettingsIniFile _settingsIniFile = new SettingsIniFile();

Upvotes: 1

Related Questions