Simular clic en DataGridView

05/10/2007 - 14:09 por Carlos Sancho | Informe spam
Hola a todos

¿Cómo puedo simular mediante programacion hacer clic en una fila de una
DataGridView, produciéndose todos los eventos como si fuese un clic real?

Hr probado con

this.datagridview1.Rows[mi_indice].select = true;

pero, no desencadena los eventos como un clic real, ya que este grid está
enlazado a un segundo, y este segundo grid no se mueve (y deberia hacerlo).

Gracias por cualquier sugerencia

Saludos
 

Leer las respuestas

#1 Luis Miguel Blanco
06/10/2007 - 11:33 | Informe spam
Hola Carlos

Para poder desencadenar un evento clic en un DataGridView en la manera que
comentas, creo que la mejor forma es crear una clase derivada de
DataGridView, escribiendo un método que haga una llamada al método
OnRowHeaderMouseClick de la clase DataGridView, el cual se encarga de
provocar el evento RowHeaderMouseClick. Dentro de tu método, deberás crear
también un objeto DataGridViewCellMouseEventArgs, que es el que contiene toda
la información de la fila en la que se ha realizado el clic, coordenadas del
cursor, etc. Algo parecido al siguiente bloque de código.

//--
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace PrimerEstilo
{
class MiDGV : DataGridView
{
public void HacerClicFila()
{
DataGridViewCellMouseEventArgs dgvEvArgs = new
DataGridViewCellMouseEventArgs(0, 4, 5, 5,
new MouseEventArgs(MouseButtons.Left, 1, 1, 1, 0));

this.OnRowHeaderMouseClick(dgvEvArgs);
}
}
}
//--

A continuación, en tu formulario, declaras una variable de tu clase heredada
de DataGridView, escribes un método manipulador del evento
RowHeaderMouseClick, y asignas dicho método manipulador al evento del
control. Todo esto entre otras tareas, como la de establecer la posición,
tamaño, etc., de tu grid.

La forma en que provoques tu evento por código depende de los requerimientos
de tu aplicación. En el siguiente código yo he añadido un botón al
formulario, que es el encargado de llamar al método HacerClicFila del grid,
que a su vez desencadena el evento RowHeaderMouseClick. Para simplificar el
ejemplo, el método HacerClicFila dispara el evento para una fila en concreto
del grid.

//--
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace PrimerEstilo
{
public partial class Form2 : Form
{
MiDGV grid;

public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
grid = new MiDGV();
grid.Location = new Point(5, 50);
grid.Size = new Size(500, 300);
grid.Anchor = AnchorStyles.Left | AnchorStyles.Right |
AnchorStyles.Bottom;
grid.RowHeaderMouseClick += new
DataGridViewCellMouseEventHandler(grid_RowHeaderMouseClick);
this.Controls.Add(grid);
this.LlenarDatosGrid();
}

void grid_RowHeaderMouseClick(object sender,
DataGridViewCellMouseEventArgs e)
{
MessageBox.Show(grid.Rows[e.RowIndex].Cells[1].Value.ToString());
}

private void button1_Click(object sender, EventArgs e)
{
grid.HacerClicFila();
}

void LlenarDatosGrid()
{
SqlConnection cnConexion = new SqlConnection();
cnConexion.ConnectionString = "Data Source=localhost;" +
"Initial Catalog=AdventureWorksDW;" +
"Integrated Security=True";

string sSQL = "SELECT ProductKey, SpanishProductName, ListPrice,
EndDate, ProductLine ";
sSQL += "FROM DimProduct ";
sSQL += "WHERE ListPrice IS NOT NULL";

SqlCommand cmdComando = new SqlCommand(sSQL, cnConexion);
SqlDataAdapter daAdaptador = new SqlDataAdapter(cmdComando);
DataSet dsAdvWorks = new DataSet();

daAdaptador.Fill(dsAdvWorks, "DimProduct");

this.grid.DataSource = dsAdvWorks;
this.grid.DataMember = "DimProduct";
}
}
}
//--

Espero que te sirva de ayuda.

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


"Carlos Sancho" wrote:

Hola a todos

¿Cómo puedo simular mediante programacion hacer clic en una fila de una
DataGridView, produciéndose todos los eventos como si fuese un clic real?

Hr probado con

this.datagridview1.Rows[mi_indice].select = true;

pero, no desencadena los eventos como un clic real, ya que este grid está
enlazado a un segundo, y este segundo grid no se mueve (y deberia hacerlo).

Gracias por cualquier sugerencia

Saludos



Preguntas similares