Почему я получаю исключение, когда ссылаюсь на DataGridView CurrentRow? - PullRequest
0 голосов
/ 29 ноября 2011

Я пытаюсь получить событие «измененная текущая ячейка» в DataGridView, но каждый раз, когда я пытаюсь загрузить форму (которая является дочерней по отношению к другой форме), я получаю исключение в событии datagridview_currentcell:

SystemNullReferenceException: объект не установлен в качестве экземпляра объекта.

Я думаю, это потому, что я не выбрал ни одной строки.Конечно, я могу использовать catch и try для обхода, но я хочу более элегантный способ и знать, что я делаю неправильно.

Вот мой код:

Form2.CS :

namespace AsefotSystem
{
    public partial class ownerReport : Form
    {
        public ownerReport()
        {
            InitializeComponent();
            loadDB();
            setGrid();
        }

        private void loadDB()
        {
            string connetionString = null;
            OleDbConnection connection;
            OleDbDataAdapter oledbAdapter;

            DataSet ds = new DataSet();
            string sql2 = null;
            connetionString = ConfigurationManager.ConnectionStrings["RiskDB"].ConnectionString;              
            sql2 = "select * From tbl2_asefot";
            connection = new OleDbConnection(connetionString);

            try
            {
                connection.Open();

                oledbAdapter = new OleDbDataAdapter(sql2, connection);
                oledbAdapter.Fill(ds, "Asefot");
                oledbAdapter.Dispose();

                connection.Close();
                dsAsefotGrid = ds;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void setGrid()
        {
            Controls.Add(dataGridView1);
            dataGridView1.DataSource = dsAsefotGrid.Tables[0];
        }

        private void dataGridView1_CurrentCell(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[2].Value.ToString();
                textBox2.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[1].Value.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        DataSet dsAsefotGrid;
    }
}

Form2.Designer.CS:

this.dataGridView1.CurrentCellChanged += new System.EventHandler(this.dataGridView1_CurrentCell);

Ответы [ 2 ]

0 голосов
/ 07 июля 2017

Ваша dataGridView ячейка не имеет значения, и вы пытаетесь сохранить строку null.

Попробуйте перехватить исключение и сообщить пользователю, что он должен что-то записать в ячейку

try
{
    textBox1.Text = dataGridView1.Rows[dataGridView1.
    CurrentRow.Index].Cells[2].Value.ToString();
}
catch(NullReferenceException)
{ 
    MessageBox.Show("You cannot process an empty cell");
}

Дополнительную информацию можно найти по следующей ссылке:

https://msdn.microsoft.com/en-us/library/sxw2ez55.aspx

0 голосов
/ 29 ноября 2011

Вместо try{} catch{} вы можете проверить, не является ли CurrentCell или даже CurrentRow null.

    if(dataGridView1.CurrentCell != null)
    {
        textBox1.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[2].Value.ToString();
        textBox2.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[1].Value.ToString();
    }
...