Evento IsInputKey

07/09/2005 - 15:37 por Carlos Vigliola \(ADINET\) | Informe spam
Estimados:

necesito hacer que cuando se presiona ENTER sobre la columna de una grilla,
se pase a la siguiente columna como lo haría si se presionara la flecha a la
derecha.
Buscando en la ayuda de VB:NET encontré que debo sobreescribir el evento
IsInputKey.
Creé una clase nueva que hereda la DataGrid y sobreescribí el método pero no
pude hacerlo funcionar.

¿Alguna idea?

Gracias.

Preguntas similare

Leer las respuestas

#1 Imac_man
08/09/2005 - 02:44 | Informe spam
Como estas amigo, la tecnica que te mencionan es funcional pero esta es otra
buena opcion que seguramente te servira, fijate:
La idea es cargar un origen de datos en el dataset y luego le agregamos al
dataset una TableStyle y para construir la TableStyle usamos una
funcion.luego si te fijas dentro de la funcion que retorna el tablestyle
a cada columna le declaramos un evento keypress que esta direccionado a un
procedimiento que recibe la pulsasion de tecla y cambia enviando la tecla
derechaotra buena opcion es crear una clase bien sencilla derivada de la
DataGridTextBoxColumn que reciba en el keypress enter y envie la tecla de
cursor que deseas y asi no debes hacer mucho codigo por cada columna.

Espero que te sirva, saludos

Private Sub Carga_Grid()
DataGrid1.DataSource = DataSet1.Tables(0)
DataGrid.TableStyles.add(Col_Grid(DataSet1))
end sub

Private function Col_Grid( Datos as DataSet) as DataGridTableStyle
dim Tabla as new DataGridTableStyle
dim Col as new DataGridTextBoxColumn
Tabla.mapping = Datos.tables(0).tablename

Col.mapping = Datos.tables(0).Columns("CodigoCliente")
Col.width = 40
Col.header = "Codigo del Cliente"
Tabla.ColumnStyles.add(Col)
AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress

Col = new DataGridTexboxColumn
Col.mapping = Datos.tables(0).Columns("NombreCliente")
Col.width = 200
Col.header = "Nombre del Cliente"
Tabla.ColumnStyles.add(Col)
AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress

Return Tabla
End Function

Private sub Private Sub Evento_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.enter Then
SendKeys.Send("{Right}")
End If
End sub





"Carlos Vigliola (ADINET)" escribió en el mensaje
news:
Estimados:

necesito hacer que cuando se presiona ENTER sobre la columna de una
grilla,
se pase a la siguiente columna como lo haría si se presionara la flecha a
la
derecha.
Buscando en la ayuda de VB:NET encontré que debo sobreescribir el evento
IsInputKey.
Creé una clase nueva que hereda la DataGrid y sobreescribí el método pero
no
pude hacerlo funcionar.

¿Alguna idea?

Gracias.


Respuesta Responder a este mensaje
#2 Carlos Vigliola \(ADINET\)
08/09/2005 - 16:46 | Informe spam
Muchas gracias, Iman_man.

Parece la mejor sugerencia crear una clase nueva a partir de la
DataGridTextBoxColumn modificar el evento.

Lo voy a probar, gracias !!

"Imac_man" escribió en el mensaje
news:
Como estas amigo, la tecnica que te mencionan es funcional pero esta es


otra
buena opcion que seguramente te servira, fijate:
La idea es cargar un origen de datos en el dataset y luego le agregamos al
dataset una TableStyle y para construir la TableStyle usamos una
funcion.luego si te fijas dentro de la funcion que retorna el


tablestyle
a cada columna le declaramos un evento keypress que esta direccionado a un
procedimiento que recibe la pulsasion de tecla y cambia enviando la tecla
derechaotra buena opcion es crear una clase bien sencilla derivada de


la
DataGridTextBoxColumn que reciba en el keypress enter y envie la tecla de
cursor que deseas y asi no debes hacer mucho codigo por cada columna.

Espero que te sirva, saludos

Private Sub Carga_Grid()
DataGrid1.DataSource = DataSet1.Tables(0)
DataGrid.TableStyles.add(Col_Grid(DataSet1))
end sub

Private function Col_Grid( Datos as DataSet) as DataGridTableStyle
dim Tabla as new DataGridTableStyle
dim Col as new DataGridTextBoxColumn
Tabla.mapping = Datos.tables(0).tablename

Col.mapping = Datos.tables(0).Columns("CodigoCliente")
Col.width = 40
Col.header = "Codigo del Cliente"
Tabla.ColumnStyles.add(Col)
AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress

Col = new DataGridTexboxColumn
Col.mapping = Datos.tables(0).Columns("NombreCliente")
Col.width = 200
Col.header = "Nombre del Cliente"
Tabla.ColumnStyles.add(Col)
AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress

Return Tabla
End Function

Private sub Private Sub Evento_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.enter Then
SendKeys.Send("{Right}")
End If
End sub





"Carlos Vigliola (ADINET)" escribió en el


mensaje
news:
> Estimados:
>
> necesito hacer que cuando se presiona ENTER sobre la columna de una
> grilla,
> se pase a la siguiente columna como lo haría si se presionara la flecha


a
> la
> derecha.
> Buscando en la ayuda de VB:NET encontré que debo sobreescribir el evento
> IsInputKey.
> Creé una clase nueva que hereda la DataGrid y sobreescribí el método


pero
> no
> pude hacerlo funcionar.
>
> ¿Alguna idea?
>
> Gracias.
>
>


Respuesta Responder a este mensaje
#3 Carlos Vigliola \(ADINET\)
09/09/2005 - 15:49 | Informe spam
Estimado Imac_man:

probé el código que enviaste pero tiene el problema que la tecla flecha a la
derecha y enter no son controladas por el textbox de la columna sino por la
grilla.
No he podido encontrar dónde se produce el evento.

Gracias.


"Imac_man" escribió en el mensaje
news:
Como estas amigo, la tecnica que te mencionan es funcional pero esta es


otra
buena opcion que seguramente te servira, fijate:
La idea es cargar un origen de datos en el dataset y luego le agregamos al
dataset una TableStyle y para construir la TableStyle usamos una
funcion.luego si te fijas dentro de la funcion que retorna el


tablestyle
a cada columna le declaramos un evento keypress que esta direccionado a un
procedimiento que recibe la pulsasion de tecla y cambia enviando la tecla
derechaotra buena opcion es crear una clase bien sencilla derivada de


la
DataGridTextBoxColumn que reciba en el keypress enter y envie la tecla de
cursor que deseas y asi no debes hacer mucho codigo por cada columna.

Espero que te sirva, saludos

Private Sub Carga_Grid()
DataGrid1.DataSource = DataSet1.Tables(0)
DataGrid.TableStyles.add(Col_Grid(DataSet1))
end sub

Private function Col_Grid( Datos as DataSet) as DataGridTableStyle
dim Tabla as new DataGridTableStyle
dim Col as new DataGridTextBoxColumn
Tabla.mapping = Datos.tables(0).tablename

Col.mapping = Datos.tables(0).Columns("CodigoCliente")
Col.width = 40
Col.header = "Codigo del Cliente"
Tabla.ColumnStyles.add(Col)
AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress

Col = new DataGridTexboxColumn
Col.mapping = Datos.tables(0).Columns("NombreCliente")
Col.width = 200
Col.header = "Nombre del Cliente"
Tabla.ColumnStyles.add(Col)
AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress

Return Tabla
End Function

Private sub Private Sub Evento_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.enter Then
SendKeys.Send("{Right}")
End If
End sub





"Carlos Vigliola (ADINET)" escribió en el


mensaje
news:
> Estimados:
>
> necesito hacer que cuando se presiona ENTER sobre la columna de una
> grilla,
> se pase a la siguiente columna como lo haría si se presionara la flecha


a
> la
> derecha.
> Buscando en la ayuda de VB:NET encontré que debo sobreescribir el evento
> IsInputKey.
> Creé una clase nueva que hereda la DataGrid y sobreescribí el método


pero
> no
> pude hacerlo funcionar.
>
> ¿Alguna idea?
>
> Gracias.
>
>


Respuesta Responder a este mensaje
#4 Imac_man
09/09/2005 - 16:45 | Informe spam
ese codigo ya lo he empleado y me ha trabajado bienpero tengo otros
trucos bajo la manga...te propondre dos soluciones la primera haremos la
clase que deriva de la DataGridTextboxColumn y la otra que no me gusta es
declarar con mayor scope la columna y reemplazar el keypress para que cuando
el objeto columna este activo este tome el enter como cursor derecha

1- 'DECLARANDO UNA CLASE DERIVADA DE LA TEXTBOX COLUM
ok, la idea aqui es que te creas la clase y luego declararas las columnas
como dim MiCol as new MiColumna_Texto, asi cada columna manejara
automaticamente el enter como cursor derecha
'-
Public Class MiColumna_Texto
Inherits DataGridTextBoxColumn

Public Sub New()
MyBase.New()

'El Diseñador de componentes requiere esta llamada.
InitializeComponent()

'en el constructor de la clase agrega esta linea
AddHandler Me.TextBox.KeyDown, New
System.Windows.Forms.KeyEventHandler(AddressOf eveKeyDown_Texto)
end sub

'Evento KeyDown
Private Sub eveKeyDown_Texto(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs)
if e.keycode = keys.enter then
SendKey
end if
end sub

end Class

2-DECLARANDO LA COLUMNA CON MAS SCOPE Y ESCRIBIENDO KEYDOWN
ok, esto es simplemente en lugar de declarar la columna dentro de la
funcion, ve a declararla en las declaraciones del formulario para que este
disponible desde cualquier lugar dentro del form.luego pegas este bloque
de codigo.simulare la situacion

'esto corresponde a la declaracion en el formulario
dim MiCol as new DataGridTextBoxColumn

'ahora este es el codigo que deberas pegar (por supuesto lo modificas a tus
necesidades)
Protected Overrides Function ProcessCmdKey(ByRef msg As
System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As
Boolean
If Me.ActiveControl Is Me.MiCol.TextBox Then
If msg.WParam.ToInt32() = CInt(Keys.Enter) Then
SendKeys.Send("{Right}")
Return True
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End If
End Function


Espero que te sirva,




"Carlos Vigliola (ADINET)" escribió en el mensaje
news:
Estimado Imac_man:

probé el código que enviaste pero tiene el problema que la tecla flecha a
la
derecha y enter no son controladas por el textbox de la columna sino por
la
grilla.
No he podido encontrar dónde se produce el evento.

Gracias.


"Imac_man" escribió en el mensaje
news:
Como estas amigo, la tecnica que te mencionan es funcional pero esta es


otra
buena opcion que seguramente te servira, fijate:
La idea es cargar un origen de datos en el dataset y luego le agregamos
al
dataset una TableStyle y para construir la TableStyle usamos una
funcion.luego si te fijas dentro de la funcion que retorna el


tablestyle
a cada columna le declaramos un evento keypress que esta direccionado a
un
procedimiento que recibe la pulsasion de tecla y cambia enviando la tecla
derechaotra buena opcion es crear una clase bien sencilla derivada de


la
DataGridTextBoxColumn que reciba en el keypress enter y envie la tecla de
cursor que deseas y asi no debes hacer mucho codigo por cada columna.

Espero que te sirva, saludos

Private Sub Carga_Grid()
DataGrid1.DataSource = DataSet1.Tables(0)
DataGrid.TableStyles.add(Col_Grid(DataSet1))
end sub

Private function Col_Grid( Datos as DataSet) as DataGridTableStyle
dim Tabla as new DataGridTableStyle
dim Col as new DataGridTextBoxColumn
Tabla.mapping = Datos.tables(0).tablename

Col.mapping = Datos.tables(0).Columns("CodigoCliente")
Col.width = 40
Col.header = "Codigo del Cliente"
Tabla.ColumnStyles.add(Col)
AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress

Col = new DataGridTexboxColumn
Col.mapping = Datos.tables(0).Columns("NombreCliente")
Col.width = 200
Col.header = "Nombre del Cliente"
Tabla.ColumnStyles.add(Col)
AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress

Return Tabla
End Function

Private sub Private Sub Evento_KeyPress(ByVal sender As Object, ByVal e
As
System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.enter Then
SendKeys.Send("{Right}")
End If
End sub





"Carlos Vigliola (ADINET)" escribió en el


mensaje
news:
> Estimados:
>
> necesito hacer que cuando se presiona ENTER sobre la columna de una
> grilla,
> se pase a la siguiente columna como lo haría si se presionara la flecha


a
> la
> derecha.
> Buscando en la ayuda de VB:NET encontré que debo sobreescribir el
> evento
> IsInputKey.
> Creé una clase nueva que hereda la DataGrid y sobreescribí el método


pero
> no
> pude hacerlo funcionar.
>
> ¿Alguna idea?
>
> Gracias.
>
>






Respuesta Responder a este mensaje
#5 Carlos Vigliola \(ADINET\)
12/09/2005 - 15:05 | Informe spam
Te agradezco todo el código que me enviaste, pero lamentablemente no logré
hacerlo funcionar.
No logro capturar el evento keydown dentro de la grilla.


"Imac_man" escribió en el mensaje
news:
ese codigo ya lo he empleado y me ha trabajado bienpero tengo otros
trucos bajo la manga...te propondre dos soluciones la primera haremos


la
clase que deriva de la DataGridTextboxColumn y la otra que no me gusta es
declarar con mayor scope la columna y reemplazar el keypress para que


cuando
el objeto columna este activo este tome el enter como cursor derecha

1- 'DECLARANDO UNA CLASE DERIVADA DE LA TEXTBOX COLUM
ok, la idea aqui es que te creas la clase y luego declararas las columnas
como dim MiCol as new MiColumna_Texto, asi cada columna manejara
automaticamente el enter como cursor derecha



'
-
Public Class MiColumna_Texto
Inherits DataGridTextBoxColumn

Public Sub New()
MyBase.New()

'El Diseñador de componentes requiere esta llamada.
InitializeComponent()

'en el constructor de la clase agrega esta linea
AddHandler Me.TextBox.KeyDown, New
System.Windows.Forms.KeyEventHandler(AddressOf eveKeyDown_Texto)
end sub

'Evento KeyDown
Private Sub eveKeyDown_Texto(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyEventArgs)
if e.keycode = keys.enter then
SendKey
end if
end sub

end Class

2-DECLARANDO LA COLUMNA CON MAS SCOPE Y ESCRIBIENDO KEYDOWN
ok, esto es simplemente en lugar de declarar la columna dentro de la
funcion, ve a declararla en las declaraciones del formulario para que este
disponible desde cualquier lugar dentro del form.luego pegas este


bloque
de codigo.simulare la situacion

'esto corresponde a la declaracion en el formulario
dim MiCol as new DataGridTextBoxColumn

'ahora este es el codigo que deberas pegar (por supuesto lo modificas a


tus
necesidades)
Protected Overrides Function ProcessCmdKey(ByRef msg As
System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys)


As
Boolean
If Me.ActiveControl Is Me.MiCol.TextBox Then
If msg.WParam.ToInt32() = CInt(Keys.Enter) Then
SendKeys.Send("{Right}")
Return True
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End If
End Function


Espero que te sirva,




"Carlos Vigliola (ADINET)" escribió en el


mensaje
news:
> Estimado Imac_man:
>
> probé el código que enviaste pero tiene el problema que la tecla flecha


a
> la
> derecha y enter no son controladas por el textbox de la columna sino por
> la
> grilla.
> No he podido encontrar dónde se produce el evento.
>
> Gracias.
>
>
> "Imac_man" escribió en el mensaje
> news:
>> Como estas amigo, la tecnica que te mencionan es funcional pero esta es
> otra
>> buena opcion que seguramente te servira, fijate:
>> La idea es cargar un origen de datos en el dataset y luego le agregamos
>> al
>> dataset una TableStyle y para construir la TableStyle usamos una
>> funcion.luego si te fijas dentro de la funcion que retorna el
> tablestyle
>> a cada columna le declaramos un evento keypress que esta direccionado a
>> un
>> procedimiento que recibe la pulsasion de tecla y cambia enviando la


tecla
>> derechaotra buena opcion es crear una clase bien sencilla derivada


de
> la
>> DataGridTextBoxColumn que reciba en el keypress enter y envie la tecla


de
>> cursor que deseas y asi no debes hacer mucho codigo por cada columna.
>>
>> Espero que te sirva, saludos
>>
>> Private Sub Carga_Grid()
>> DataGrid1.DataSource = DataSet1.Tables(0)
>> DataGrid.TableStyles.add(Col_Grid(DataSet1))
>> end sub
>>
>> Private function Col_Grid( Datos as DataSet) as DataGridTableStyle
>> dim Tabla as new DataGridTableStyle
>> dim Col as new DataGridTextBoxColumn
>> Tabla.mapping = Datos.tables(0).tablename
>>
>> Col.mapping = Datos.tables(0).Columns("CodigoCliente")
>> Col.width = 40
>> Col.header = "Codigo del Cliente"
>> Tabla.ColumnStyles.add(Col)
>> AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress
>>
>> Col = new DataGridTexboxColumn
>> Col.mapping = Datos.tables(0).Columns("NombreCliente")
>> Col.width = 200
>> Col.header = "Nombre del Cliente"
>> Tabla.ColumnStyles.add(Col)
>> AddHandler Col.textbox.KeyDown, AddressOf Evento_KeyPress
>>
>> Return Tabla
>> End Function
>>
>> Private sub Private Sub Evento_KeyPress(ByVal sender As Object, ByVal e
>> As
>> System.Windows.Forms.KeyEventArgs)
>> If e.KeyCode = Keys.enter Then
>> SendKeys.Send("{Right}")
>> End If
>> End sub
>>
>>
>>
>>
>>
>> "Carlos Vigliola (ADINET)" escribió en el
> mensaje
>> news:
>> > Estimados:
>> >
>> > necesito hacer que cuando se presiona ENTER sobre la columna de una
>> > grilla,
>> > se pase a la siguiente columna como lo haría si se presionara la


flecha
> a
>> > la
>> > derecha.
>> > Buscando en la ayuda de VB:NET encontré que debo sobreescribir el
>> > evento
>> > IsInputKey.
>> > Creé una clase nueva que hereda la DataGrid y sobreescribí el método
> pero
>> > no
>> > pude hacerlo funcionar.
>> >
>> > ¿Alguna idea?
>> >
>> > Gracias.
>> >
>> >
>>
>>
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida