Copiar celdas seleccionadas

13/03/2007 - 10:10 por Juan Diego Bueno | Informe spam
Buenas grupo:

Tengo un grid del cual quiero habilitar mediante menú contextual el
copiado de sus datos. Con el atajo de teclado Ctrl-C funciona
perfectamente. Lo que quiero es asociarle un menú contextual y que
copie los datos seleccionados al igual que lo hago con Ctrl + C.

Gracias de antemano. Saludos

Preguntas similare

Leer las respuestas

#1 Juan Diego Bueno
13/03/2007 - 15:14 | Informe spam
Asunto solucionado, aunque sea un pelín cutre:

Mandar un SendKeys.Send("^C"); // Es decir, que simule el control C

Saludos

On 13 mar, 10:10, "Juan Diego Bueno" wrote:
Buenas grupo:

Tengo un grid del cual quiero habilitar mediante menú contextual el
copiado de sus datos. Con el atajo de teclado Ctrl-C funciona
perfectamente. Lo que quiero es asociarle un menú contextual y que
copie los datos seleccionados al igual que lo hago con Ctrl + C.

Gracias de antemano. Saludos
Respuesta Responder a este mensaje
#2 Luis Miguel Blanco
13/03/2007 - 20:18 | Informe spam
Hola Juan Diego

Aunque he visto que ya has encontrado una forma de solventar el problema, me
ha parecido una cuestión interesante, así que otro modo de abordarlo sería
como tú decías, añadiendo un menú contextual al formulario con un par de
opciones: copiar y pegar.

Después, en el evento Load del formulario, cuando cargas el DataGridView de
datos, recorres la colección Columns del control y le asignas el menú
contextual a su propiedad ContextMenuStrip.

Podemos añadir también un TextBox y asociarle el menú contextual, para así
pegar los valores que copiemos del grid.

Y por último quedaría escribir los manipuladores del evento click para cada
una de las opciones del menú contextual. Te adjunto un bloque de código a
modo de ejemplo sobre esto que te comento:

//
private void Form1_Load(object sender, EventArgs e)
{
//
foreach (DataGridViewColumn oColumna in this.dataGridView1.Columns)
{
oColumna.ContextMenuStrip = this.contextMenuStrip1;
}
}

private void mnuCopiar_Click(object sender, EventArgs e)
{
Clipboard.SetText(this.dataGridView1.CurrentCell.Value.ToString());
}

private void mnuPegar_Click(object sender, EventArgs e)
{
if (this.contextMenuStrip1.SourceControl == this.textBox1)
{
this.textBox1.Text = Clipboard.GetText();
}
}
//

Espero que como alternativa te sea útil 8-)

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


"Juan Diego Bueno" wrote:

Buenas grupo:

Tengo un grid del cual quiero habilitar mediante menú contextual el
copiado de sus datos. Con el atajo de teclado Ctrl-C funciona
perfectamente. Lo que quiero es asociarle un menú contextual y que
copie los datos seleccionados al igual que lo hago con Ctrl + C.

Gracias de antemano. Saludos


Respuesta Responder a este mensaje
#3 Juan Diego Bueno
14/03/2007 - 12:45 | Informe spam
Hola Luis Miguel:

Gracias por la propuesta, desconocía el objeto ClipBoard. El problema
que tiene es que solo copia la celda actual, no un rango de celdas.
Supongo que se puede hacer algo con la colección SelectedCells, aunque
no veo como de forma clara.

La ventaja principal de usar la combinación Ctrl-C es que te copia las
celdas con formato de forma que se pueden pegar en otras estructuras
de tipo cuadrícula (como Excel, por ejemplo).

Saludos

PD: Por cierto, enhorabuena por tu libro de Programación en VB.NET. Me
consta que es libro de cabecera de muchos de mis compañeros
programadores, sobre todo porque aplica soluciones prácticas a
problemas y situaciones comunes, a diferencia de otros que se paran
más en otros aspectos más conceptuales y de fundamentos, sin restar
méritos y utilidad a estos últimos.



On 13 mar, 20:18, Luis Miguel Blanco
wrote:
Hola Juan Diego

Aunque he visto que ya has encontrado una forma de solventar el problema, me
ha parecido una cuestión interesante, así que otro modo de abordarlo sería
como tú decías, añadiendo un menú contextual al formulario con un par de
opciones: copiar y pegar.

Después, en el evento Load del formulario, cuando cargas el DataGridView de
datos, recorres la colección Columns del control y le asignas el menú
contextual a su propiedad ContextMenuStrip.

Podemos añadir también un TextBox y asociarle el menú contextual, para así
pegar los valores que copiemos del grid.

Y por último quedaría escribir los manipuladores del evento click para cada
una de las opciones del menú contextual. Te adjunto un bloque de código a
modo de ejemplo sobre esto que te comento:

//
private void Form1_Load(object sender, EventArgs e)
{
//
foreach (DataGridViewColumn oColumna in this.dataGridView1.Columns)
{
oColumna.ContextMenuStrip = this.contextMenuStrip1;
}

}

private void mnuCopiar_Click(object sender, EventArgs e)
{
Clipboard.SetText(this.dataGridView1.CurrentCell.Value.ToString());

}

private void mnuPegar_Click(object sender, EventArgs e)
{
if (this.contextMenuStrip1.SourceControl == this.textBox1)
{
this.textBox1.Text = Clipboard.GetText();
}}

//

Espero que como alternativa te sea útil 8-)

Un saludo
Luis Miguel Blancohttp://www.dotnetmania.com

"Juan Diego Bueno" wrote:
> Buenas grupo:

> Tengo un grid del cual quiero habilitar mediante menú contextual el
> copiado de sus datos. Con el atajo de teclado Ctrl-C funciona
> perfectamente. Lo que quiero es asociarle un menú contextual y que
> copie los datos seleccionados al igual que lo hago con Ctrl + C.

> Gracias de antemano. Saludos
Respuesta Responder a este mensaje
#4 Luis Miguel Blanco
14/03/2007 - 19:26 | Informe spam
Hola Juan Diego

Ciertamente no me había percatado del detalle de copiar varias filas que
estuvieran seleccionadas, pero también se podría hacer, ya que si utilizas la
propiedad OwningRow de DataGridView.CurrentCell, obtendrás un objeto fila que
contiene la colección Cells, que representa a todas las celdas de la fila. Si
las recorres, puedes ir obteniendo los valores de aquellas que están
seleccionadas. Vas concatenando dichos valores en una variable, o bien
utilizas un array o la técnica que necesites, esto ya dependería de la
situación, y finalmente utilizas ClipBoard para pasar el valor al
portapapeles. Te adjunto un bloque de código con el ejemplo:

//-
private void mnuCopiar_Click(object sender, EventArgs e)
{
string sTextoSeleccionado = string.Empty;
// obtener la fila completa actual
DataGridViewRow oFila = this.dataGridView1.CurrentCell.OwningRow;
// recorrer cada celda de la fila
// pasando a una variable las que están seleccionadas
foreach (DataGridViewCell oCelda in oFila.Cells)
{
if (oCelda.Selected)
{
sTextoSeleccionado += oCelda.Value + "-";
}
}
// quitar el guión separador del final
sTextoSeleccionado = sTextoSeleccionado.Remove(sTextoSeleccionado.Length -
1, 1);
// pasar la selección al portapapeles
Clipboard.SetText(sTextoSeleccionado);
}
//-

Espero que esto se acerque más al modo en que necesitas resolver el problema
8-)

Y bueno, ya quería aprovechar el mensaje, por supuesto, para agradecerte
enormemente tu opinión acerca de mi libro sobre VB.NET, y pedirte igualmente,
que agradezcas a todos aquellos compañeros tuyos que lo han leido, el interés
que han demostrado. No sabes lo que me alegra el hecho de que el trabajo
empleado en escribirlo pueda ser de interés y utilidad a cualquiera de los
que nos pasamos los días pegándole a la tecla ;-)

Cada vez que he escrito un libro, ese ha sido mi objetivo, intentar que lo
que allí se explicaba pudiera tener, aparte de una vertiente didáctica,
también una práctica, que pudiera ser aprovechada en el trabajo diario. Así
que si lo consigo, es una de las mayores recompensas.

No obstante, este libro que mencionas pertenece a una versión anterior a
Visual Studio 2005, y precisamente el año pasado he estado escribiendo dos
nuevos libros sobre programación para entorno Windows basados en VS 2005, que
exponen los ejemplos tanto en VB.NET como en C#. Son muchas las novedades que
han aparecido desde que escribí "Programación en VB.NET", y además C# está
pegando muy fuerte, así que lo lógico era que estos libros incluyeran ambos
lenguajes.

Los títulos de ambos son: "Desarrollo de aplicaciones Windows. Aspectos
básicos" y "Desarrollo de aplicaciones Windows. Aspectos Avanzados". En el
caso de que te puedan interesar, te puedo enviar el índice de cada uno de
ellos a una dirección email para que puedas hacerte una idea sobre su
contenido.

Y bueno, lo dicho, te reitero mi agradecimiento por tu opinión sobre el
libro 8-D

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


"Juan Diego Bueno" wrote:

Hola Luis Miguel:

Gracias por la propuesta, desconocía el objeto ClipBoard. El problema
que tiene es que solo copia la celda actual, no un rango de celdas.
Supongo que se puede hacer algo con la colección SelectedCells, aunque
no veo como de forma clara.

La ventaja principal de usar la combinación Ctrl-C es que te copia las
celdas con formato de forma que se pueden pegar en otras estructuras
de tipo cuadrícula (como Excel, por ejemplo).

Saludos

PD: Por cierto, enhorabuena por tu libro de Programación en VB.NET. Me
consta que es libro de cabecera de muchos de mis compañeros
programadores, sobre todo porque aplica soluciones prácticas a
problemas y situaciones comunes, a diferencia de otros que se paran
más en otros aspectos más conceptuales y de fundamentos, sin restar
méritos y utilidad a estos últimos.



On 13 mar, 20:18, Luis Miguel Blanco
wrote:
> Hola Juan Diego
>
> Aunque he visto que ya has encontrado una forma de solventar el problema, me
> ha parecido una cuestión interesante, así que otro modo de abordarlo sería
> como tú decías, añadiendo un menú contextual al formulario con un par de
> opciones: copiar y pegar.
>
> Después, en el evento Load del formulario, cuando cargas el DataGridView de
> datos, recorres la colección Columns del control y le asignas el menú
> contextual a su propiedad ContextMenuStrip.
>
> Podemos añadir también un TextBox y asociarle el menú contextual, para así
> pegar los valores que copiemos del grid.
>
> Y por último quedaría escribir los manipuladores del evento click para cada
> una de las opciones del menú contextual. Te adjunto un bloque de código a
> modo de ejemplo sobre esto que te comento:
>
> //
> private void Form1_Load(object sender, EventArgs e)
> {
> //
> foreach (DataGridViewColumn oColumna in this.dataGridView1.Columns)
> {
> oColumna.ContextMenuStrip = this.contextMenuStrip1;
> }
>
> }
>
> private void mnuCopiar_Click(object sender, EventArgs e)
> {
> Clipboard.SetText(this.dataGridView1.CurrentCell.Value.ToString());
>
> }
>
> private void mnuPegar_Click(object sender, EventArgs e)
> {
> if (this.contextMenuStrip1.SourceControl == this.textBox1)
> {
> this.textBox1.Text = Clipboard.GetText();
> }}
>
> //
>
> Espero que como alternativa te sea útil 8-)
>
> Un saludo
> Luis Miguel Blancohttp://www.dotnetmania.com
>
> "Juan Diego Bueno" wrote:
> > Buenas grupo:
>
> > Tengo un grid del cual quiero habilitar mediante menú contextual el
> > copiado de sus datos. Con el atajo de teclado Ctrl-C funciona
> > perfectamente. Lo que quiero es asociarle un menú contextual y que
> > copie los datos seleccionados al igual que lo hago con Ctrl + C.
>
> > Gracias de antemano. Saludos



Respuesta Responder a este mensaje
#5 Juan Diego Bueno
15/03/2007 - 09:00 | Informe spam
Tomo nota de los nuevos libros. Si puedes mandarme los índices a este
correo, te lo agradecería.

¿Ya están a la venta?

Saludos

On 14 mar, 19:26, Luis Miguel Blanco
wrote:
Hola Juan Diego

Ciertamente no me había percatado del detalle de copiar varias filas que
estuvieran seleccionadas, pero también se podría hacer, ya que si utilizas la
propiedad OwningRow de DataGridView.CurrentCell, obtendrás un objeto fila que
contiene la colección Cells, que representa a todas las celdas de la fila. Si
las recorres, puedes ir obteniendo los valores de aquellas que están
seleccionadas. Vas concatenando dichos valores en una variable, o bien
utilizas un array o la técnica que necesites, esto ya dependería de la
situación, y finalmente utilizas ClipBoard para pasar el valor al
portapapeles. Te adjunto un bloque de código con el ejemplo:

//-
private void mnuCopiar_Click(object sender, EventArgs e)
{
string sTextoSeleccionado = string.Empty;
// obtener la fila completa actual
DataGridViewRow oFila = this.dataGridView1.CurrentCell.OwningRow;
// recorrer cada celda de la fila
// pasando a una variable las que están seleccionadas
foreach (DataGridViewCell oCelda in oFila.Cells)
{
if (oCelda.Selected)
{
sTextoSeleccionado += oCelda.Value + "-";
}
}
// quitar el guión separador del final
sTextoSeleccionado = sTextoSeleccionado.Remove(sTextoSeleccionado.Length -
1, 1);
// pasar la selección al portapapeles
Clipboard.SetText(sTextoSeleccionado);}

//-

Espero que esto se acerque más al modo en que necesitas resolver el problema
8-)

Y bueno, ya quería aprovechar el mensaje, por supuesto, para agradecerte
enormemente tu opinión acerca de mi libro sobre VB.NET, y pedirte igualmente,
que agradezcas a todos aquellos compañeros tuyos que lo han leido, el interés
que han demostrado. No sabes lo que me alegra el hecho de que el trabajo
empleado en escribirlo pueda ser de interés y utilidad a cualquiera de los
que nos pasamos los días pegándole a la tecla ;-)

Cada vez que he escrito un libro, ese ha sido mi objetivo, intentar que lo
que allí se explicaba pudiera tener, aparte de una vertiente didáctica,
también una práctica, que pudiera ser aprovechada en el trabajo diario. Así
que si lo consigo, es una de las mayores recompensas.

No obstante, este libro que mencionas pertenece a una versión anterior a
Visual Studio 2005, y precisamente el año pasado he estado escribiendo dos
nuevos libros sobre programación para entorno Windows basados en VS 2005, que
exponen los ejemplos tanto en VB.NET como en C#. Son muchas las novedades que
han aparecido desde que escribí "Programación en VB.NET", y además C# está
pegando muy fuerte, así que lo lógico era que estos libros incluyeran ambos
lenguajes.

Los títulos de ambos son: "Desarrollo de aplicaciones Windows. Aspectos
básicos" y "Desarrollo de aplicaciones Windows. Aspectos Avanzados". En el
caso de que te puedan interesar, te puedo enviar el índice de cada uno de
ellos a una dirección email para que puedas hacerte una idea sobre su
contenido.

Y bueno, lo dicho, te reitero mi agradecimiento por tu opinión sobre el
libro 8-D

Un saludo
Luis Miguel Blancohttp://www.dotnetmania.com

"Juan Diego Bueno" wrote:
> Hola Luis Miguel:

> Gracias por la propuesta, desconocía el objeto ClipBoard. El problema
> que tiene es que solo copia la celda actual, no un rango de celdas.
> Supongo que se puede hacer algo con la colección SelectedCells, aunque
> no veo como de forma clara.

> La ventaja principal de usar la combinación Ctrl-C es que te copia las
> celdas con formato de forma que se pueden pegar en otras estructuras
> de tipo cuadrícula (como Excel, por ejemplo).

> Saludos

> PD: Por cierto, enhorabuena por tu libro de Programación en VB.NET. Me
> consta que es libro de cabecera de muchos de mis compañeros
> programadores, sobre todo porque aplica soluciones prácticas a
> problemas y situaciones comunes, a diferencia de otros que se paran
> más en otros aspectos más conceptuales y de fundamentos, sin restar
> méritos y utilidad a estos últimos.

> On 13 mar, 20:18, Luis Miguel Blanco
> wrote:
> > Hola Juan Diego

> > Aunque he visto que ya has encontrado una forma de solventar el problema, me
> > ha parecido una cuestión interesante, así que otro modo de abordarlo sería
> > como tú decías, añadiendo un menú contextual al formulario con un par de
> > opciones: copiar y pegar.

> > Después, en el evento Load del formulario, cuando cargas el DataGridView de
> > datos, recorres la colección Columns del control y le asignas el menú
> > contextual a su propiedad ContextMenuStrip.

> > Podemos añadir también un TextBox y asociarle el menú contextual, para así
> > pegar los valores que copiemos del grid.

> > Y por último quedaría escribir los manipuladores del evento click para cada
> > una de las opciones del menú contextual. Te adjunto un bloque de código a
> > modo de ejemplo sobre esto que te comento:

> > //
> > private void Form1_Load(object sender, EventArgs e)
> > {
> > //
> > foreach (DataGridViewColumn oColumna in this.dataGridView1.Columns)
> > {
> > oColumna.ContextMenuStrip = this.contextMenuStrip1;
> > }

> > }

> > private void mnuCopiar_Click(object sender, EventArgs e)
> > {
> > Clipboard.SetText(this.dataGridView1.CurrentCell.Value.ToString());

> > }

> > private void mnuPegar_Click(object sender, EventArgs e)
> > {
> > if (this.contextMenuStrip1.SourceControl == this.textBox1)
> > {
> > this.textBox1.Text = Clipboard.GetText();
> > }}

> > //

> > Espero que como alternativa te sea útil 8-)

> > Un saludo
> > Luis Miguel Blancohttp://www.dotnetmania.com

> > "Juan Diego Bueno" wrote:
> > > Buenas grupo:

> > > Tengo un grid del cual quiero habilitar mediante menú contextual el
> > > copiado de sus datos. Con el atajo de teclado Ctrl-C funciona
> > > perfectamente. Lo que quiero es asociarle un menú contextual y que
> > > copie los datos seleccionados al igual que lo hago con Ctrl + C.

> > > Gracias de antemano. Saludos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida