DataGridView получает текущий выбранный объект

Мне нужно получить текущий выбранный объект из datataound DataGridView.

Мне не нужен объект текущей выделенной ячейки, но объект, на котором основана вся строка, в этом случае свойства объекта BusinessObject whos образуют столбцы сетки.

Я мог бы переходить через DataSource, но сам по себе является всего лишь объектом и может быть BindingSource или IBindingList или что-то в этом роде - поэтому нелегкий стандартный способ получить желаемый объект.

За этим стоит просто проверить бизнес-объект для свойства IsChanged и попросить пользователя сохранить или отменить изменения до того, как bindingsource выберет следующий элемент. Поэтому я должен узнать текущий объект внутри RowValidating-Event для DataGridView, поскольку BindingSource не предлагает событие, чтобы прекратить изменение до того, как произойдут изменения. См. Здесь хорошо известная проблема

Спасибо за чтение; -)

Ответ 1

DataGridViewRow.DataBoundItem содержит объект "бизнес", к которому он привязан.

Ответ 2

Вот мой код помещает это в свой класс Person

 public static explicit operator Person(DataRow dr)
    {
        Person p = new Person();
        p.adi = dr.ItemArray[0].ToString();
        p.id = Int32.Parse(dr.ItemArray[1].ToString());
        p.soyadi = dr.ItemArray[2].ToString();
        p.kartNo = dr.ItemArray[3].ToString();
        p.dogumTarihi = DateTime.Parse( dr.ItemArray[4].ToString() );
        p.adres = dr.ItemArray[5].ToString();
        p.meslek = dr.ItemArray[6].ToString();
        p.telefon = dr.ItemArray[7].ToString();
        p.gsm = dr.ItemArray[8].ToString();
        p.eposta = dr.ItemArray[9].ToString();

        return p;
    }

и это кнопка обновления, нажмите

DataRow row = (dataGridView1.SelectedRows[0].DataBoundItem as DataRowView).Row;
Person selected = (Person)row;

Ответ 3

Вы можете получить выбранное значение ячейки следующим образом

yourDGV.CurrentCell.Value;

если вы хотите, чтобы значение в форме строки просто использовало toString, как этот

yourDGV.CurrentCell.Value.toString();

это должно сделать это

Ответ 4

Как насчет этого пути?

foreach (DataGridViewRow item in this.dataGridView1.SelectedRows)
{
  MessageBox.Show(item.Cells[0].Value.ToString());
}

Мы можем получить несколько выбранных данных строк.

Ответ 5

Поскольку вы указали IBindingList - да, поскольку другие сказали, что свойство DataBoundItem предоставит вам то, что вам нужно - есть проблема с тем, что я испытал ранее, и закончил с нулевой ссылкой, но сейчас я не могу думать сценария, в котором это произошло.

Если вы привязываетесь к базе данных с помощью BindingSource - вы можете захватывать текущие события CurrentChanged, CurrentItemChanged вашего BindingSource, тогда вам не нужно иметь дополнительное свойство IsChanged на вашем B.O..., также базовый источник данных также может указывать на изменение - например, если у вас есть BindingSource, связанный с datatable, строка даст вам измененный флаг.