DataGridViewComboBoxCell создает исключение нулевой ссылки

Я новичок в Stack Overflow, поэтому прошу прощения за неправильную форму / этикет. Спасибо!

РЕДАКТИРОВАТЬ: Я думаю, что мои вопросы не о том, как исправить исключение NullReference, а скорее о том, как с ним бороться некорректно «Выход» из поля со списком, когда я нажимаю за его пределами.

У меня проблема с настройкой DataGridViewComboBoxCell, которую я использую. Прежде всего, у меня есть datagridview, который содержит 3 столбца, которые, когда пользователь разрешает редактирование, заполняют ячейки DataGridViewComboBoxCell. В каждой строке эти 3 ячейки зависят от выбранного элемента в предыдущей ячейке (кроме первой ComboBoxCell). Проблема, с которой я сталкиваюсь, заключается в том, что если я нажимаю на первый ComboBox и позволяю ему показывать раскрывающийся список, но на самом деле я ничего не выбираю, я перехожу к следующему ComboBoxCell и пытаюсь щелкнуть его, чтобы просмотреть его список элементов, которые он останавливает программа и создает ошибку "Исключение NullReference было необработано". Это исключение возникает в разделе «static void Main ()» в Application.Run (new MainForm ());

Код, который обрабатывает изменение выбранного индекса ComboBox, который должен автоматически заполнять другие ComboBox.

private void LoadRules_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {

        DataGridViewComboBoxEditingControl cbx = e.Control as DataGridViewComboBoxEditingControl;
        if (cbx != null)
        {

            if (this.LoadRulesDataGridView.Columns[LoadRulesDataGridView.CurrentCell.ColumnIndex].Name.Equals("OEM"))
            {
                ComboBox cmbprocess = e.Control as ComboBox;


                cmbprocess.SelectedIndexChanged += new EventHandler(OEMBox_SelectedIndexChanged);
                cmbprocess.SelectedIndexChanged += new EventHandler(ModelBox_SelectedIndexChanged);
            }
        }

    }

    private void OEMBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        NetMonDB.DBManager dbConn = new NetMonDB.DBManager(ConnStr, this.LogWarning, this.LogError);
        ComboBox cmbprocess = (ComboBox)sender;

        int row = this.LoadRulesDataGridView.CurrentCell.RowIndex;
        string OEM = cmbprocess.SelectedItem.ToString();
        this.RulesGridModels(row, cmbprocess, dbConn, OEM);//this method gets the required info from the database and loads it into the ComboBox

        cmbprocess.SelectedIndexChanged -= new EventHandler(OEMBox_SelectedIndexChanged);
    }

    private void ModelBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        NetMonDB.DBManager dbConn = new NetMonDB.DBManager(ConnStr, this.LogWarning, this.LogError);
        ComboBox cmbprocess = (ComboBox)sender;

        int row = this.LoadRulesDataGridView.CurrentCell.RowIndex;
        string Model = cmbprocess.SelectedItem.ToString();
        string OEM = cmbprocess.SelectedItem.ToString();
        this.RulesGridOSVersions(row, cmbprocess, dbConn, OEM, Model);//this method gets the required info from the database and loads it into the ComboBox

        cmbprocess.SelectedIndexChanged -= new EventHandler(ModelBox_SelectedIndexChanged);
    }

Методы, обновляющие ComboBoxes.

private void RulesGridModels(int r, ComboBox comboBox, NetMonDB.DBManager dbConn, string rowOEM)
    {
        //MessageBox.Show(this.LoadRulesDataGridView.Rows[0].Cells[4].Value.ToString());
        DataGridViewComboBoxCell cbo = new DataGridViewComboBoxCell();

        for (int i = 0; i < comboBox.Items.Count; i++)
        {
            cbo.Items.AddRange(comboBox.Items[i]);
        }
        try
        {
            cbo.Items.Clear();
            cbo.Items.AddRange("");
            if (this.LoadRulesDataGridView.Rows[r].Cells[4].Value == null)
                this.LoadRulesDataGridView.Rows[r].Cells[4].Value = "";

            NetMonDB.Phone OEMPhone = dbConn.getOEMId(rowOEM);
            foreach (NetMonDB.Phone phone in dbConn.getModel(OEMPhone))
            {
                cbo.Items.Add(phone.Model);
            }
            this.LoadRulesDataGridView.Rows[r].Cells[5] = cbo;
        }
        catch (Exception e)
        {
            LogError("RulesGridModels", e.ToString());
        }
    }

    private void RulesGridOSVersions(int r, ComboBox comboBox, NetMonDB.DBManager dbConn, string rowOEM, string rowModel)
    {
        DataGridViewComboBoxCell cbo = new DataGridViewComboBoxCell();

        for (int i = 0; i < comboBox.Items.Count; i++)
        {
            cbo.Items.AddRange(comboBox.Items[i]);
        }
        try
        {

            cbo.Items.Clear();
            cbo.Items.AddRange("");
            NetMonDB.Phone CurrentPhone = dbConn.getOEMId(rowOEM);
            CurrentPhone.Model = rowModel;
            foreach (NetMonDB.Phone phone in dbConn.getOSVersion(CurrentPhone))
            {
                cbo.Items.Add(phone.OSVersion);
            }
            this.LoadRulesDataGridView.Rows[r].Cells[6] = cbo;
        }
        catch (Exception e)
        {
            LogError("RulesGridOSVersions", e.ToString());
        }

    }

Где ловится исключение.

static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());//Crashes at this Point
    }

person Programmer    schedule 16.06.2014    source источник


Ответы (1)


У меня была такая же проблема в подобной ситуации. Я нашел решение этой проблемы - использовать SelectionChangeCommitted вместо события SelectedIndexChanged для поля со списком.

person Gourav Wadhawan    schedule 15.11.2014