DataGridView - Limitar movimiento a dos columnas.

20/10/2007 - 17:37 por Tomas | Informe spam
Hola a todos.

Tengo un DataGridView con 10 columnas de solo lectura, menos las dos ultimas
que son modificables.

Por comodidad para el usuario quisiera, que el desplazamiento o navegacion
por la rejilla, se limitara a estas dos ultimas columnas, que son las unicas
que puede modificar.

¿Hay alguna propiedad del control que se pueda activar para poder hacer esto
que les comento?.

Gracias por anticipado.

Tomás.

Preguntas similare

Leer las respuestas

#1 Luis Miguel Blanco
21/10/2007 - 10:51 | Informe spam
Hola Tomás

Para esta funcionalidad que precisas puedes utilizar la propiedad ReadOnly
de los objetos columna que componen tu DataGridView, de forma similar a como
puedes ver en el siguiente bloque de código que te adjunto.

//--
int nContador = 0;
for (nContador = 0; nContador <= this.DataGridView1.Columns.Count - 3;
nContador++)
{
this.DataGridView1.Columns[nContador].ReadOnly = true;
}
//--

Espero que te sea de utilidad.

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"Tomas" wrote:

Hola a todos.

Tengo un DataGridView con 10 columnas de solo lectura, menos las dos ultimas
que son modificables.

Por comodidad para el usuario quisiera, que el desplazamiento o navegacion
por la rejilla, se limitara a estas dos ultimas columnas, que son las unicas
que puede modificar.

¿Hay alguna propiedad del control que se pueda activar para poder hacer esto
que les comento?.

Gracias por anticipado.

Tomás.



Respuesta Responder a este mensaje
#2 Tomas
22/10/2007 - 16:46 | Informe spam
Gracias Luis.

Ahora ya tengo establecida esta propiedad, ReadOnly, en las columnas que no
se pueden modificar, pero el movimiento por las columnas es posible.

Yo queria limitar el movimiento a solo las dos columnas que se pueden
modicar.
Respuesta Responder a este mensaje
#3 Luis Miguel Blanco
22/10/2007 - 20:47 | Informe spam
Hola Tomás, no hay de qué 8-)

Esta otra cuestión que me planteas ya tiene algo más de complicación. En
principio, la solución más inmediata que se nos puede ocurrir sería utilizar
el evento CellEnter, y dentro de su código forzar la asignación de la celda
actual usando la propiedad CurrentCell del grid

this.DataGridView1.CurrentCell = this.DataGridView1[999, e.RowIndex];

Pero el código anterior provoca una excepción de reentrada, por lo que no es
posible abordarlo de esta forma.

Un medio de intentar solucionarlo, sería crear una clase derivada de
DataGridView, reemplazando el método OnCellEnter. Centro de este método,
comprobamos cuál es la celda sobre la que el usuario intenta posicionarse, y
en caso de que no sea una de las dos últimas, obligamos a que posicione en
una de ellas. Después de eso, sustituimos el parámetro
DataGridViewCellEventArgs que este evento recibe por uno propio que creamos
con los valores que nos interesa, como puedes ver en el siguiente código:

//-
class MiGrid : DataGridView
{
protected override void OnCellEnter(DataGridViewCellEventArgs e)
{
int indiceColumna = e.ColumnIndex >= this.Columns.Count - 2 ?
e.ColumnIndex : this.Columns.Count - 2;
DataGridViewCellEventArgs evarg = new
DataGridViewCellEventArgs(indiceColumna, e.RowIndex);
base.OnCellEnter(evarg);
}
}
//-

A continuación volvemos al código del formulario, y creamos una instancia de
nuestra clase hija del grid, también escribimos un manipulador de evento para
CellEnter, en el que en primer lugar eliminamos las celdas seleccionadas que
no correspondan a las dos últimas columnas, y dejamos seleccionada la que
viene indicada en el parámetro DataGridViewCellEventArgs, como puedes ver en
el siguiente código:

//-
public partial class Form1 : Form
{
DataSet oDataSet;
MiGrid DataGridView1;
//

private void Form1_Load(object sender, EventArgs e)
{
//
// crear por código el grid y añadirlo a la colección de controles
DataGridView1 = new MiGrid();
DataGridView1.Location = new Point(12, 59);
DataGridView1.Size = new Size(772, 265);
DataGridView1.CellEnter += new
DataGridViewCellEventHandler(DataGridView1_CellEnter);
this.Controls.Add(DataGridView1);

this.DataGridView1.DataSource = oDataSet;
this.DataGridView1.DataMember = "suppliers";

// establecer las columnas necesarias como solo lectura
for (int nContador = 0; nContador <=
this.DataGridView1.Columns.Count - 3; nContador++)
{
this.DataGridView1.Columns[nContador].ReadOnly = true;
}
}

void DataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
foreach (DataGridViewCell celda in this.DataGridView1.SelectedCells)
{
celda.Selected = false;
}

this.DataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected =
true;
}
}
//-

Y esto sería todo, supongo que con algunos retoques, podrás afinarlo un poco
más, pero espero que por lo menos, la idea base te sirva para lo que
necesitas.

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"Tomas" wrote:

Gracias Luis.

Ahora ya tengo establecida esta propiedad, ReadOnly, en las columnas que no
se pueden modificar, pero el movimiento por las columnas es posible.

Yo queria limitar el movimiento a solo las dos columnas que se pueden
modicar.



Respuesta Responder a este mensaje
#4 Tomas
22/10/2007 - 23:17 | Informe spam
Gracias Luis.

Veo que no hay una solución directa.

La idea y el ejemplo que ofreces parece interesante, voy a ver que se puede
hacer.

Tomás.
Respuesta Responder a este mensaje
#5 jotas
12/01/2008 - 19:04 | Informe spam
"Tomas" wrote:

Gracias Luis.

Veo que no hay una solución directa.

La idea y el ejemplo que ofreces parece interesante, voy a ver que se puede
hacer.

Tomás.





Otra solución sencill, aunque un poco casera, puede ser esta:

Private Sub DataGridView1_CellEnter(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellEventArgs) Handles
DataGridView1.CellEnter
If DataGridView1.CurrentCell.ColumnIndex < 8 Then
SendKeys.Send("{TAB}")
End If
End Sub
lo que desplazará el foco a la columna deseada.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida