Событие DataGridView SelectionChanged не срабатывает, когда новая строка выбирается с помощью кода

У меня есть DataGridView с DataSource, установленным в DataTable. Поэтому используйте этот код в качестве примера:

DataTable table;
table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Last_Name", typeof(string));
table.Columns.Add("Male", typeof(Boolean));

DataRow row;

for (int i = 1; i < 10; i++)
{
    row = table.NewRow();
    row["Name"] = String.Format("Person {0}", i + 1);
    row["Last_Name"] = String.Format("Person Last Name {0}", i + 1);

    if (i % 2 == 0)
    {
        row["Male"] = true;
    }
    else
    {
        row["Male"] = false;
    }

    table.Rows.Add(row);
}

dataGridView1.DataSource = table;

Я также подписался на событие SelectionChanged, которое просто показывает содержимое первой ячейки в текстовом поле. Увидеть ниже:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (dataGridView1.CurrentRow != null)
    {
        DataRowView row = dataGridView1.CurrentRow.DataBoundItem as DataRowView;
        if (row != null)
        {
            textBox1.Text = row.Row[0].ToString();
        }
    }
}

Когда я меняю строки, срабатывает событие SelectionChanged, и содержимое правильно отображается в текстовом поле.

Теперь у меня есть кнопка, которая добавляет новую строку в сетку:

private void buttonAdd_Click(object sender, EventArgs e)
{
    DataRow row= table.NewRow();
    row["Name"] = "Bob";
    row["Last_Name"] = "Smith";
    row["Male"] = true;
    table.Rows.Add(row);
}

Новая строка теперь добавлена ​​в сетку, но не выбрана.

Поэтому я пытаюсь выбрать его, подписавшись на событие RowsAdded:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{            
    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];
}

Итак, теперь это правильно выбирает строку, но событие SelectionChanged не срабатывает, и текстовое поле все еще показывает результат ранее выбранной строки.

Что я могу сделать, чтобы обойти это или что я делаю неправильно?

Странно, если я снова нажму кнопку «Добавить», будет выбрана строка, которую я добавил при первом нажатии!?

Я использую С# 4.0 и Visual Studio 2012.

Спасибо


person Sun    schedule 13.06.2013    source источник


Ответы (1)


Ну, во-первых, почему бы не выбрать строку после добавления и изменения метки?

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{            
    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];

    textBox1.Text =  dataGridView1.Rows[e.RowIndex].ToString();
}

если вы хотите изменить метку только при запуске события, вы можете сначала попробовать отменить выбор ячейки:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    dataGridView1.CurrentCell = null;

    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];

    textBox1.Text =  dataGridView1.Rows[e.RowIndex].ToString();
}
person gzaxx    schedule 13.06.2013
comment
Спасибо за ответ. Я действительно хочу выполнить работу в SelectionChanged, поскольку я делаю другой код для этого события. Я предоставил textBox1 только в качестве примера для этого вопроса. Так что я действительно хочу, чтобы событие SelectionChanged сработало. - person Sun; 13.06.2013
comment
Затем переместите свой код из события в другой код, который принимает в качестве аргумента DataGridViewCell или RowIndex и ColumnIndex, и выполните там обработку, и вызовите этот метод, когда выбор изменился или была добавлена ​​новая строка. Гораздо лучший подход (IMO) очищенный код и более устойчивый к магии DataGridView :) - person gzaxx; 13.06.2013