2010-01-18 16 views
33

Necesito obtener el objeto seleccionado actualmente da databound DataGridView.DataGridView obtener el objeto seleccionado actual

No necesito el objeto de la celda seleccionada actual, pero el objeto en el que se basa toda la fila, en este caso un objeto de negocio cuyas propiedades forman las columnas de la cuadrícula.

Podría revisar el DataSource, pero eso solo es un objeto y puede ser un BindingSource o un IBindingList o algo así, por lo que no es una forma fácil de obtener el objeto deseado.

Detrás de eso está la necesidad de simplemente verificar el businessObject para una propiedad llamada IsChanged y pedirle al usuario que guarde o descarte los cambios, antes de que bindingsource seleccione el siguiente elemento. Por lo tanto, debo averiguar el objeto actual dentro de RowValidating-Event de DataGridView, ya que BindingSource no ofrece un evento para detener el cambio antes de que ocurra el cambio. See here for the well known problem

Gracias por leer ;-)

Respuesta

69

DataGridViewRow.DataBoundItem contiene el objeto de 'negocio' se ve obligada a.

+4

Gracias por insinuarme correctamente, a veces uno simplemente debe recostarse y relajarse en lugar de buscar más intensamente ... –

+1

Esto es mucho mejor que almacenar en caché los datos y luego tratar de usar th e índice seleccionado. ¡Gracias! – styfle

+0

Solo quiero mencionar, que esto también funciona, si su dataGrid no está 'enlazado' a los datos, sino que si lo acaba de aplicar por 'DataSource' – copa017

6

Aquí está mi código a poner esto en su clase de persona

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; 
    } 

y esto es un botón de actualización, haga clic en

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

¿Qué hay de esta manera?

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

Podemos obtener múltiples datos de filas seleccionadas.

0

Como mencionó la IBindingList - sí, como otros han dicho que la propiedad DataBoundItem le dará lo que necesita - hay un problema que experimenté anteriormente y terminé con una referencia nula, pero ahora no puedo pensar en el escenario en el que sucedió.

Si está enlazado a datos usando un BindingSource - puede capturar los eventos CurrentChanged, CurrentItemChanged de su BindingSource, entonces no necesita tener una propiedad IsChanged adicional en su B.O. .., también el origen de datos subyacente también podría indicar modificación; por ejemplo, si tiene BindingSource vinculado a una tabla de datos, la fila le daría una bandera modificada.

1

Usted puede obtener el valor de la celda seleccionada como esto

yourDGV.CurrentCell.Value; 

si desea que el valor en la forma de una cadena sólo tiene que utilizar toString como esto

yourDGV.CurrentCell.Value.toString(); 

esto debe hacerlo

Cuestiones relacionadas