2010-02-03 48 views
6

Tengo un cliente que tiene un problema con un DataGridView en una aplicación de Windows. Están llamando al evento CellValidated, pero quieren tener una validación diferente para la celda si está en una fila que ya está comprometida con el origen de datos que si se trata de una fila que se está agregando primero (y aún no se ha comprometido (el usuario todavía no ha salido de la fila). Probé la propiedad IsNewRow, pero tan pronto como comienza a escribir en la fila, se agrega otra "nueva fila", por lo que la fila con la que está trabajando ya no se considera la nueva fila. sabe que la fila no se ha confirmado todavía porque puede presionar Esc para cancelar la edición, y toda la fila desaparece.C# DataGridView Agregar una fila: al validar, ¿cómo sé que la fila es nueva y aún no está comprometida?

¿Hay alguna forma de saber si la fila actualmente editada es realmente la "nueva fila" en el sentido de que no se ha comprometido de nuevo a la fuente de datos?

+0

Lo siento, es mi primera vez con Stack Overflow. Escribí una respuesta, no me gustó, la borré, escribí una mejor respuesta, tuve que recuperarla. De todos modos, ahí está abajo. Espero eso ayude. – GenericMeatUnit

Respuesta

0

La respuesta de GenericMeatUnit no funcionó para mí, pero me proporcionó suficiente para encontrar la manera de hacerlo funcionar. Así es como yo estoy haciendo el cheque ahora:

if (this.DATASET.DATATABLE.Rows.Count == e.RowIndex) 

Esta sentencia if funciona porque antes de salir de la fila en el DataGridView, que no existe realmente en la tabla de datos, sin embargo, por lo que el número de filas en la tabla de datos será igual a RowIndex para la nueva fila, ya que RowIndex está basado en cero.

3

Una forma en que he logrado algo similar en el pasado es para utilizar la propiedad id de mis objetos que están vinculados a la lista.

Por ejemplo, si tengo una BindingList<User> donde el usuario es algo así como:

public class Names 
{ 
    public string Name { get; set; }   
    public int id { get; set; } 
} 

A continuación, puedo obligar a mi lista como esta:

dataGridView1.AutoGenerateColumns = false; 
_users = new BindingList<User>(); 
_users .Add(new Names() { Name = "joe", id=1 }); 
_users .Add(new Names() { Name = "pete", id = 2 }); 

bindingSource1.DataSource = _names; 

DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn(); 
col1.DataPropertyName = "Name";   

dataGridView1.Columns.Add(col1); 

dataGridView1.DataSource = _users; 

Entonces, cuando el DataGridView proporciona una nueva fila , tendrá una identificación de 0 (el valor predeterminado para un entero).

Todos los objetos que provienen de la base de datos tienen una identificación distinta de cero.

También puede haber una manera de lograr esto usando BindingSources pero eché un vistazo rápido a las propiedades allí y nada saltó hacia mí.

+0

Me gusta esta respuesta, y parece que funcionaría, pero dado que estoy trabajando con un conjunto de datos genérico, no una colección de objetos, no puedo verificarlo completamente en este caso. Lo estoy votando porque podría ser útil en diferentes situaciones, lamentablemente no en este caso. –

+0

Las Id. De fila de la base de datos pueden ser cualquier número, ya sea negativo, cero o positivo: este código depende de la buena voluntad de un DBA (http://msdn.microsoft.com/en-us/library/ms176057.aspx) – Vedran

3

¿Cuál es la fuente de datos en este caso?

Si se trata de una tabla de datos, puede probar fácilmente la propiedad DataRowState de las filas de la tabla de datos para ver si son nuevas o existentes. Una vez que haya validado sus datarows, puede llamar a un Accept en la tabla para confirmar esas filas. No hay necesidad de interferir entre la cuadrícula y su tabla de datos, en esta situación.

Por supuesto, esto no significa que sus datos estén realmente comprometidos con una base de datos, si es que finalmente está almacenada. Eso sería otro paso.

Además, normalmente evito escribir directamente en una vista de cuadro de datos; en cambio, lo hago de solo lectura y aparece una pantalla de agregar/ingresar que puede realizar cualquier validación requerida.

No sé si algo de esto te ha sido útil. Si me lo he pasado por alto, házmelo saber.

+0

Esto no funciona porque cuando se agrega una fila y todavía no se ha dejado la fila, todavía no existe en la tabla de datos. Intentar acceder a la fila en el RowIndex para la fila arroja una excepción. Sin embargo, esto me ayudó a encontrar la manera de hacer que esto funcione, verificando que la fila exista en el conjunto de datos –

+0

¡Buena respuesta, bienvenido a StackOverflow! –

0

Esto debería ayudar a las personas que no están utilizando objetos DataTable:

En el caso CellBeginEdit establecer la propiedad Tag a un valor que va a utilizar para diferenciar el 'nuevo' fila

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) 
{ 
    if (e.RowIndex == dataGridView1.NewRowIndex) 
     dataGridView1.Rows[e.RowIndex].Tag = true; 
} 

Entonces en su evento de validación puede verificar ese valor:

if (dataGridView1.Rows[e.RowIndex].Tag is bool 
    && (bool) dataGridView1.Rows[e.RowIndex].Tag) 
{ 
    // new row code 

    // after it's added, mark it as 'not new' 
    dataGridView1.Rows[e.RowIndex].Tag = false; 
} 
else 
{ 
    // existing row code 
} 
Cuestiones relacionadas