Resaltar palabras de un dataGridView

15/05/2007 - 18:40 por Francisco Zavala Hernandez | Informe spam
Hola amigos.

Quiero hacer lo siguiente pero no se si pueda...
Hice una aplicacion que realiza una busquedas en una base de datos y el
resultado lo despliego en un datagridview y hasta ahi todo bien..
Pero lo que quierero hacer es por ejemplo que si pongo en le buscador
"Impresora HP" (la base de datos es de productos de computo) que esas
palabras salgan resaltadas en el datagridview...

No se si se pueda hacer y si se puede hacer no se como jejejeje

gracias de antemano .

att: Francisco Zavala

Preguntas similare

Leer las respuestas

#1 Luis Miguel Blanco
16/05/2007 - 21:44 | Informe spam
Hola Francisco

No hay de qué, me alegro de que te sirviera 8-D

Respecto a la capacidad de aplicar este efecto que mencionas de forma
selectiva a parte del texto de una celda, también es posible, aunque en este
caso tenemos que "hilar más fino", y el evento CellFormatting se nos queda un
poco corto de alcance 8-)

Para ello lo que necesitamos es recurrir al otro evento: CellPainting, el
cual deja al programador libertad absoluta para pintar como quiera la
totalidad de la celda. Aunque claro, en este caso "tanto poder, conlleva una
gran responsabilidad" 8-) y tenemos que encargarnos de toda la operación de
dibujo de la celda.

Te adjunto un bloque de código en el que utilizando este evento, comprobamos
si estamos situados en una columna y fila adecuada, además de que la columna
sea también la que vamos a manipular. En caso afirmativo, rellenamos el fondo
de la celda con un color, y dibujamos su contorno.

Supongamos que lo que queremos es poner en negrita la primera palabra del
valor a mostrar en la celda. En ese caso, pasamos a sendas variables la
cadena a mostrar resaltada y el resto del valor. Calculamos el tamaño del
texto a resaltar con TextRenderer.MeasureText, y realizamos dos operaciones
de dibujo de texto con TextRenderer.DrawText, una para la palabra en negrita
y otra para el resto. Como puedes observar, también debemos encargarnos de
ubicar el texto en la posición que necesitemos dentro de la celda.

Observa que el final, mediante "e.Handled = true;" le decimos al control que
somos nosotros quienes nos encargamos del dibujo de la celda, ya que de otra
forma, el DataGridView efectuaría sus propias operaciones de dibujo encima de
las nuestras, eliminándolas.

//-
private void dgvGrid_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex > 0 && e.RowIndex >= 0 &&
this.dgvGrid.Columns[e.ColumnIndex].Name == "SpanishProductName")
{
e.Graphics.FillRectangle(new SolidBrush(Color.Lavender), e.CellBounds);
e.Graphics.DrawRectangle(new Pen(Color.DarkMagenta, 1), e.CellBounds);

int nPosicionEspacio = e.Value.ToString().IndexOf(" ");
string sP1 = e.Value.ToString().Substring(0, nPosicionEspacio);
string sP2 = e.Value.ToString().Substring(nPosicionEspacio + 1);

Size szTexto1 = TextRenderer.MeasureText(sP1, new Font(e.CellStyle.Font,
FontStyle.Bold));

TextRenderer.DrawText(e.Graphics,
sP1,
new Font(e.CellStyle.Font, FontStyle.Bold),
new Point(e.CellBounds.X, e.CellBounds.Y + 2),
Color.DarkBlue);

TextRenderer.DrawText(e.Graphics,
sP2,
e.CellStyle.Font,
new Point(e.CellBounds.X + szTexto1.Width, e.CellBounds.Y + 2),
Color.DarkBlue);

e.Handled = true;
}
}
//-

Espero que partiendo de este ejemplo, y con algunos retoques propios,
consigas el efecto que necesitas.

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


"Francisco Zavala Hernandez" wrote:

Hol a Luis.

Muchas gracias por la ayuda, me sirve mucho el ejemplo que me has puesto.
Pero no sabes si es posible aplicar un Formato a una celda pero solo
particial mente
ejemplo que la celda contenga "Hola Mundo " y que solo resalte Mundo ya sea
con un tamaño de letra mas grande o otro color ..

:P gracias por la ayuda

saludos!!





"Luis Miguel Blanco" escribió
en el mensaje news:
> Hola Francisco
>
> Puedes utilizar el evento CellFormatting del DataGridView, que se produce
> cada vez que el control necesita dibujar una celda, permitiendo aplicarle
> un
> formato al valor a dibujar. Te adjunto un bloque de ejemplo en el que se
> comprueba a qué columna pertenece el valor a mostrar. Si además se cumple
> una
> condición, se aplica un formato de negrita al valor a dibujar, utilizando
> para ello el estilo correspondiente a la celda.
>
> //--
> private void dgvGrid_CellFormatting(object sender,
> DataGridViewCellFormattingEventArgs e)
> {
> if (this.dgvGrid.Columns[e.ColumnIndex].Name == "ListPrice")
> {
> // y se cumple esta condición
> if ((decimal)e.Value > 1000)
> {
> e.CellStyle.Font = new Font("Comic Sans MS", 12, FontStyle.Bold);
> }
> }
> }
> //--
>
> Espero que te sirva de ayuda
>
> Un saludo
> Luis Miguel Blanco
> http://www.dotnetmania.com
>
>
> "Francisco Zavala Hernandez" wrote:
>
>> Hola amigos.
>>
>> Quiero hacer lo siguiente pero no se si pueda...
>> Hice una aplicacion que realiza una busquedas en una base de datos y el
>> resultado lo despliego en un datagridview y hasta ahi todo bien..
>> Pero lo que quierero hacer es por ejemplo que si pongo en le buscador
>> "Impresora HP" (la base de datos es de productos de computo) que esas
>> palabras salgan resaltadas en el datagridview...
>>
>> No se si se pueda hacer y si se puede hacer no se como jejejeje
>>
>> gracias de antemano .
>>
>> att: Francisco Zavala
>>
>>
>>
>>
>>
>>



Respuesta Responder a este mensaje
#2 Francisco Zavala Hernandez
17/05/2007 - 21:25 | Informe spam
Hola Luis..

Pues de nuevo un millon de gracias mi estimado Luis :P

Tu bloque de codigo me sirvio a la perfecion para lograr lo que queria..

aqui esta un link de una imagen del programa...
http://www.exactolp.com.mx/imagenes...ograma.jpg
*solo un detallito si te fijas en la columna Descripcion esta un poquito
desalineada respecto a las otras columnas.. y no se como arreglar eso :P

aqui esta el codigo:
private void dgvResultado_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)

{

DataGridView dgv =(DataGridView) sender;

if (rbDecripcion.Checked && e.ColumnIndex == 1 && e.RowIndex >= 0 )

{

Color fondo = dgv.DefaultCellStyle.BackColor;

if (dgv.CurrentRow.Index == e.RowIndex)

fondo = dgv.DefaultCellStyle.SelectionBackColor;

e.Graphics.FillRectangle(new SolidBrush(fondo), e.CellBounds);

e.Graphics.DrawRectangle(new Pen(Color.Silver), e.CellBounds);

string[] palabras = txtDescripcion.Text.Split(' ');

int X = e.CellBounds.X, posicion = 0,carateresDesplegados=0, Y =
e.CellBounds.Y + 2;

for (int i = 0; i < palabras.Length; i++)

{

posicion = e.Value.ToString().IndexOf(palabras[i], carateresDesplegados);

string cadena1 =
e.Value.ToString().Substring(carateresDesplegados,posicion-(carateresDesplegados));

string cadena2 = e.Value.ToString().Substring(posicion,palabras[i].Length);

TextRenderer.DrawText(e.Graphics,cadena1,e.CellStyle.Font,new
Point(X,Y),Color.Black);

Size sizeCadena = TextRenderer.MeasureText(cadena1,e.CellStyle.Font);

X += sizeCadena.Width;

TextRenderer.DrawText(e.Graphics, cadena2, new Font(e.CellStyle.Font,
FontStyle.Bold), new Point(X,Y), Color.Black);

sizeCadena = TextRenderer.MeasureText(cadena2, new Font(e.CellStyle.Font,
FontStyle.Bold));

X += sizeCadena.Width-8;

carateresDesplegados+= cadena1.Length + cadena2.Length;

}

if (carateresDesplegados < e.Value.ToString().Length)

{

string cadena1= e.Value.ToString().Substring(carateresDesplegados);

TextRenderer.DrawText(e.Graphics, cadena1, e.CellStyle.Font, new Point(X,
Y), Color.Black);

}

e.Handled = true;

}








"Luis Miguel Blanco" escribió
en el mensaje news:
Hola Francisco

No hay de qué, me alegro de que te sirviera 8-D

Respecto a la capacidad de aplicar este efecto que mencionas de forma
selectiva a parte del texto de una celda, también es posible, aunque en
este
caso tenemos que "hilar más fino", y el evento CellFormatting se nos queda
un
poco corto de alcance 8-)

Para ello lo que necesitamos es recurrir al otro evento: CellPainting, el
cual deja al programador libertad absoluta para pintar como quiera la
totalidad de la celda. Aunque claro, en este caso "tanto poder, conlleva
una
gran responsabilidad" 8-) y tenemos que encargarnos de toda la operación
de
dibujo de la celda.

Te adjunto un bloque de código en el que utilizando este evento,
comprobamos
si estamos situados en una columna y fila adecuada, además de que la
columna
sea también la que vamos a manipular. En caso afirmativo, rellenamos el
fondo
de la celda con un color, y dibujamos su contorno.

Supongamos que lo que queremos es poner en negrita la primera palabra del
valor a mostrar en la celda. En ese caso, pasamos a sendas variables la
cadena a mostrar resaltada y el resto del valor. Calculamos el tamaño del
texto a resaltar con TextRenderer.MeasureText, y realizamos dos
operaciones
de dibujo de texto con TextRenderer.DrawText, una para la palabra en
negrita
y otra para el resto. Como puedes observar, también debemos encargarnos de
ubicar el texto en la posición que necesitemos dentro de la celda.

Observa que el final, mediante "e.Handled = true;" le decimos al control
que
somos nosotros quienes nos encargamos del dibujo de la celda, ya que de
otra
forma, el DataGridView efectuaría sus propias operaciones de dibujo encima
de
las nuestras, eliminándolas.

//-
private void dgvGrid_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)
{
if (e.ColumnIndex > 0 && e.RowIndex >= 0 &&
this.dgvGrid.Columns[e.ColumnIndex].Name == "SpanishProductName")
{
e.Graphics.FillRectangle(new SolidBrush(Color.Lavender), e.CellBounds);
e.Graphics.DrawRectangle(new Pen(Color.DarkMagenta, 1), e.CellBounds);

int nPosicionEspacio = e.Value.ToString().IndexOf(" ");
string sP1 = e.Value.ToString().Substring(0, nPosicionEspacio);
string sP2 = e.Value.ToString().Substring(nPosicionEspacio + 1);

Size szTexto1 = TextRenderer.MeasureText(sP1, new Font(e.CellStyle.Font,
FontStyle.Bold));

TextRenderer.DrawText(e.Graphics,
sP1,
new Font(e.CellStyle.Font, FontStyle.Bold),
new Point(e.CellBounds.X, e.CellBounds.Y + 2),
Color.DarkBlue);

TextRenderer.DrawText(e.Graphics,
sP2,
e.CellStyle.Font,
new Point(e.CellBounds.X + szTexto1.Width, e.CellBounds.Y + 2),
Color.DarkBlue);

e.Handled = true;
}
}
//-

Espero que partiendo de este ejemplo, y con algunos retoques propios,
consigas el efecto que necesitas.

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


"Francisco Zavala Hernandez" wrote:

Hol a Luis.

Muchas gracias por la ayuda, me sirve mucho el ejemplo que me has puesto.
Pero no sabes si es posible aplicar un Formato a una celda pero solo
particial mente
ejemplo que la celda contenga "Hola Mundo " y que solo resalte Mundo ya
sea
con un tamaño de letra mas grande o otro color ..

:P gracias por la ayuda

saludos!!





"Luis Miguel Blanco"
escribió
en el mensaje news:
> Hola Francisco
>
> Puedes utilizar el evento CellFormatting del DataGridView, que se
> produce
> cada vez que el control necesita dibujar una celda, permitiendo
> aplicarle
> un
> formato al valor a dibujar. Te adjunto un bloque de ejemplo en el que
> se
> comprueba a qué columna pertenece el valor a mostrar. Si además se
> cumple
> una
> condición, se aplica un formato de negrita al valor a dibujar,
> utilizando
> para ello el estilo correspondiente a la celda.
>
> //--
> private void dgvGrid_CellFormatting(object sender,
> DataGridViewCellFormattingEventArgs e)
> {
> if (this.dgvGrid.Columns[e.ColumnIndex].Name == "ListPrice")
> {
> // y se cumple esta condición
> if ((decimal)e.Value > 1000)
> {
> e.CellStyle.Font = new Font("Comic Sans MS", 12, FontStyle.Bold);
> }
> }
> }
> //--
>
> Espero que te sirva de ayuda
>
> Un saludo
> Luis Miguel Blanco
> http://www.dotnetmania.com
>
>
> "Francisco Zavala Hernandez" wrote:
>
>> Hola amigos.
>>
>> Quiero hacer lo siguiente pero no se si pueda...
>> Hice una aplicacion que realiza una busquedas en una base de datos y
>> el
>> resultado lo despliego en un datagridview y hasta ahi todo bien..
>> Pero lo que quierero hacer es por ejemplo que si pongo en le buscador
>> "Impresora HP" (la base de datos es de productos de computo) que esas
>> palabras salgan resaltadas en el datagridview...
>>
>> No se si se pueda hacer y si se puede hacer no se como jejejeje
>>
>> gracias de antemano .
>>
>> att: Francisco Zavala
>>
>>
>>
>>
>>
>>



Respuesta Responder a este mensaje
#3 Luis Miguel Blanco
18/05/2007 - 19:56 | Informe spam
Hola Francisco

Acabo de echar un vistazo al enlace que me has pasado y creo que te ha
quedado estupendo 8-)

Respecto al pequeño ajuste en el centrado del texto que me comentas, puedes
conseguirlo empleando dos técnicas. Primero vamos con la difícil -que no lo
es tanto- 8-).

Bastaría con obtener las alturas de la celda y el texto a pintar en la
misma, hallar su diferencia y dividirla entre dos, con lo que obtendrías la
coordenada Y en la cual pintar el texto. Algo parecido a lo siguiente:

//-
Size sizeCadena = TextRenderer.MeasureText(cadena1, e.CellStyle.Font);
int coorYEscritura = (e.CellBounds.Height - sizeCadena.Height) / 2;
TextRenderer.DrawText(e.Graphics, cadena1, e.CellStyle.Font, new Point(X,
coorYEscritura), Color.Black);
//-

Y ahora vamos con la fácil: en el método DrawText, utiliza como último
parámetro la enumeración TextFormatFlags, entre cuyos miembros hay valores
para realizar la alineación del texto dentro de la celda, de forma parecida a
la siguiente:

//-
TextRenderer.DrawText(e.Graphics, cadena1, e.CellStyle.Font, new Point(X,
Y), Color.Black, TextFormatFlags.VerticalCenter);
//-

Pues estas serían las dos formas, espero que ahora ya te quede totalmente
ajustado.

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


"Francisco Zavala Hernandez" wrote:

Hola Luis..

Pues de nuevo un millon de gracias mi estimado Luis :P

Tu bloque de codigo me sirvio a la perfecion para lograr lo que queria..

aqui esta un link de una imagen del programa...
http://www.exactolp.com.mx/imagenes...ograma.jpg
*solo un detallito si te fijas en la columna Descripcion esta un poquito
desalineada respecto a las otras columnas.. y no se como arreglar eso :P

aqui esta el codigo:
private void dgvResultado_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)

{

DataGridView dgv =(DataGridView) sender;

if (rbDecripcion.Checked && e.ColumnIndex == 1 && e.RowIndex >= 0 )

{

Color fondo = dgv.DefaultCellStyle.BackColor;

if (dgv.CurrentRow.Index == e.RowIndex)

fondo = dgv.DefaultCellStyle.SelectionBackColor;

e.Graphics.FillRectangle(new SolidBrush(fondo), e.CellBounds);

e.Graphics.DrawRectangle(new Pen(Color.Silver), e.CellBounds);

string[] palabras = txtDescripcion.Text.Split(' ');

int X = e.CellBounds.X, posicion = 0,carateresDesplegados=0, Y =
e.CellBounds.Y + 2;

for (int i = 0; i < palabras.Length; i++)

{

posicion = e.Value.ToString().IndexOf(palabras[i], carateresDesplegados);

string cadena1 =
e.Value.ToString().Substring(carateresDesplegados,posicion-(carateresDesplegados));

string cadena2 = e.Value.ToString().Substring(posicion,palabras[i].Length);

TextRenderer.DrawText(e.Graphics,cadena1,e.CellStyle.Font,new
Point(X,Y),Color.Black);

Size sizeCadena = TextRenderer.MeasureText(cadena1,e.CellStyle.Font);

X += sizeCadena.Width;

TextRenderer.DrawText(e.Graphics, cadena2, new Font(e.CellStyle.Font,
FontStyle.Bold), new Point(X,Y), Color.Black);

sizeCadena = TextRenderer.MeasureText(cadena2, new Font(e.CellStyle.Font,
FontStyle.Bold));

X += sizeCadena.Width-8;

carateresDesplegados+= cadena1.Length + cadena2.Length;

}

if (carateresDesplegados < e.Value.ToString().Length)

{

string cadena1= e.Value.ToString().Substring(carateresDesplegados);

TextRenderer.DrawText(e.Graphics, cadena1, e.CellStyle.Font, new Point(X,
Y), Color.Black);

}

e.Handled = true;

}








"Luis Miguel Blanco" escribió
en el mensaje news:
> Hola Francisco
>
> No hay de qué, me alegro de que te sirviera 8-D
>
> Respecto a la capacidad de aplicar este efecto que mencionas de forma
> selectiva a parte del texto de una celda, también es posible, aunque en
> este
> caso tenemos que "hilar más fino", y el evento CellFormatting se nos queda
> un
> poco corto de alcance 8-)
>
> Para ello lo que necesitamos es recurrir al otro evento: CellPainting, el
> cual deja al programador libertad absoluta para pintar como quiera la
> totalidad de la celda. Aunque claro, en este caso "tanto poder, conlleva
> una
> gran responsabilidad" 8-) y tenemos que encargarnos de toda la operación
> de
> dibujo de la celda.
>
> Te adjunto un bloque de código en el que utilizando este evento,
> comprobamos
> si estamos situados en una columna y fila adecuada, además de que la
> columna
> sea también la que vamos a manipular. En caso afirmativo, rellenamos el
> fondo
> de la celda con un color, y dibujamos su contorno.
>
> Supongamos que lo que queremos es poner en negrita la primera palabra del
> valor a mostrar en la celda. En ese caso, pasamos a sendas variables la
> cadena a mostrar resaltada y el resto del valor. Calculamos el tamaño del
> texto a resaltar con TextRenderer.MeasureText, y realizamos dos
> operaciones
> de dibujo de texto con TextRenderer.DrawText, una para la palabra en
> negrita
> y otra para el resto. Como puedes observar, también debemos encargarnos de
> ubicar el texto en la posición que necesitemos dentro de la celda.
>
> Observa que el final, mediante "e.Handled = true;" le decimos al control
> que
> somos nosotros quienes nos encargamos del dibujo de la celda, ya que de
> otra
> forma, el DataGridView efectuaría sus propias operaciones de dibujo encima
> de
> las nuestras, eliminándolas.
>
> //-
> private void dgvGrid_CellPainting(object sender,
> DataGridViewCellPaintingEventArgs e)
> {
> if (e.ColumnIndex > 0 && e.RowIndex >= 0 &&
> this.dgvGrid.Columns[e.ColumnIndex].Name == "SpanishProductName")
> {
> e.Graphics.FillRectangle(new SolidBrush(Color.Lavender), e.CellBounds);
> e.Graphics.DrawRectangle(new Pen(Color.DarkMagenta, 1), e.CellBounds);
>
> int nPosicionEspacio = e.Value.ToString().IndexOf(" ");
> string sP1 = e.Value.ToString().Substring(0, nPosicionEspacio);
> string sP2 = e.Value.ToString().Substring(nPosicionEspacio + 1);
>
> Size szTexto1 = TextRenderer.MeasureText(sP1, new Font(e.CellStyle.Font,
> FontStyle.Bold));
>
> TextRenderer.DrawText(e.Graphics,
> sP1,
> new Font(e.CellStyle.Font, FontStyle.Bold),
> new Point(e.CellBounds.X, e.CellBounds.Y + 2),
> Color.DarkBlue);
>
> TextRenderer.DrawText(e.Graphics,
> sP2,
> e.CellStyle.Font,
> new Point(e.CellBounds.X + szTexto1.Width, e.CellBounds.Y + 2),
> Color.DarkBlue);
>
> e.Handled = true;
> }
> }
> //-
>
> Espero que partiendo de este ejemplo, y con algunos retoques propios,
> consigas el efecto que necesitas.
>
> Un saludo
> Luis Miguel Blanco
> http://www.dotnetmania.com
>
>
> "Francisco Zavala Hernandez" wrote:
>
>> Hol a Luis.
>>
>> Muchas gracias por la ayuda, me sirve mucho el ejemplo que me has puesto.
>> Pero no sabes si es posible aplicar un Formato a una celda pero solo
>> particial mente
>> ejemplo que la celda contenga "Hola Mundo " y que solo resalte Mundo ya
>> sea
>> con un tamaño de letra mas grande o otro color ..
>>
>> :P gracias por la ayuda
>>
>> saludos!!
>>
>>
>>
>>
>>
>> "Luis Miguel Blanco"
>> escribió
>> en el mensaje news:
>> > Hola Francisco
>> >
>> > Puedes utilizar el evento CellFormatting del DataGridView, que se
>> > produce
>> > cada vez que el control necesita dibujar una celda, permitiendo
>> > aplicarle
>> > un
>> > formato al valor a dibujar. Te adjunto un bloque de ejemplo en el que
>> > se
>> > comprueba a qué columna pertenece el valor a mostrar. Si además se
>> > cumple
>> > una
>> > condición, se aplica un formato de negrita al valor a dibujar,
>> > utilizando
>> > para ello el estilo correspondiente a la celda.
>> >
>> > //--
>> > private void dgvGrid_CellFormatting(object sender,
>> > DataGridViewCellFormattingEventArgs e)
>> > {
>> > if (this.dgvGrid.Columns[e.ColumnIndex].Name == "ListPrice")
>> > {
>> > // y se cumple esta condición
>> > if ((decimal)e.Value > 1000)
>> > {
>> > e.CellStyle.Font = new Font("Comic Sans MS", 12, FontStyle.Bold);
>> > }
>> > }
>> > }
>> > //--
>> >
>> > Espero que te sirva de ayuda
>> >
>> > Un saludo
>> > Luis Miguel Blanco
>> > http://www.dotnetmania.com
>> >
>> >
>> > "Francisco Zavala Hernandez" wrote:
>> >
>> >> Hola amigos.
>> >>
>> >> Quiero hacer lo siguiente pero no se si pueda...
>> >> Hice una aplicacion que realiza una busquedas en una base de datos y
>> >> el
>> >> resultado lo despliego en un datagridview y hasta ahi todo bien..
>> >> Pero lo que quierero hacer es por ejemplo que si pongo en le buscador
>> >> "Impresora HP" (la base de datos es de productos de computo) que esas
>> >> palabras salgan resaltadas en el datagridview...
>> >>
>> >> No se si se pueda hacer y si se puede hacer no se como jejejeje
>> >>
>> >> gracias de antemano .
>> >>
>> >> att: Francisco Zavala
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#4 Francisco Zavala Hernandez
22/05/2007 - 17:41 | Informe spam
Muchas gracias Luis

he utilizado la primera opcion que me has propuesto y me afuncionado a la
perfeccion...

:P y de nuevo muchas gracias por tu ayuda!!!

saludos!!

"Luis Miguel Blanco" escribió
en el mensaje news:
Hola Francisco

Acabo de echar un vistazo al enlace que me has pasado y creo que te ha
quedado estupendo 8-)

Respecto al pequeño ajuste en el centrado del texto que me comentas,
puedes
conseguirlo empleando dos técnicas. Primero vamos con la difícil -que no
lo
es tanto- 8-).

Bastaría con obtener las alturas de la celda y el texto a pintar en la
misma, hallar su diferencia y dividirla entre dos, con lo que obtendrías
la
coordenada Y en la cual pintar el texto. Algo parecido a lo siguiente:

//-
Size sizeCadena = TextRenderer.MeasureText(cadena1, e.CellStyle.Font);
int coorYEscritura = (e.CellBounds.Height - sizeCadena.Height) / 2;
TextRenderer.DrawText(e.Graphics, cadena1, e.CellStyle.Font, new Point(X,
coorYEscritura), Color.Black);
//-

Y ahora vamos con la fácil: en el método DrawText, utiliza como último
parámetro la enumeración TextFormatFlags, entre cuyos miembros hay valores
para realizar la alineación del texto dentro de la celda, de forma
parecida a
la siguiente:

//-
TextRenderer.DrawText(e.Graphics, cadena1, e.CellStyle.Font, new Point(X,
Y), Color.Black, TextFormatFlags.VerticalCenter);
//-

Pues estas serían las dos formas, espero que ahora ya te quede totalmente
ajustado.

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


"Francisco Zavala Hernandez" wrote:

Hola Luis..

Pues de nuevo un millon de gracias mi estimado Luis :P

Tu bloque de codigo me sirvio a la perfecion para lograr lo que queria..

aqui esta un link de una imagen del programa...
http://www.exactolp.com.mx/imagenes...ograma.jpg
*solo un detallito si te fijas en la columna Descripcion esta un poquito
desalineada respecto a las otras columnas.. y no se como arreglar eso :P

aqui esta el codigo:
private void dgvResultado_CellPainting(object sender,
DataGridViewCellPaintingEventArgs e)

{

DataGridView dgv =(DataGridView) sender;

if (rbDecripcion.Checked && e.ColumnIndex == 1 && e.RowIndex >= 0 )

{

Color fondo = dgv.DefaultCellStyle.BackColor;

if (dgv.CurrentRow.Index == e.RowIndex)

fondo = dgv.DefaultCellStyle.SelectionBackColor;

e.Graphics.FillRectangle(new SolidBrush(fondo), e.CellBounds);

e.Graphics.DrawRectangle(new Pen(Color.Silver), e.CellBounds);

string[] palabras = txtDescripcion.Text.Split(' ');

int X = e.CellBounds.X, posicion = 0,carateresDesplegados=0, Y >> e.CellBounds.Y + 2;

for (int i = 0; i < palabras.Length; i++)

{

posicion = e.Value.ToString().IndexOf(palabras[i], carateresDesplegados);

string cadena1 >> e.Value.ToString().Substring(carateresDesplegados,posicion-(carateresDesplegados));

string cadena2 =
e.Value.ToString().Substring(posicion,palabras[i].Length);

TextRenderer.DrawText(e.Graphics,cadena1,e.CellStyle.Font,new
Point(X,Y),Color.Black);

Size sizeCadena = TextRenderer.MeasureText(cadena1,e.CellStyle.Font);

X += sizeCadena.Width;

TextRenderer.DrawText(e.Graphics, cadena2, new Font(e.CellStyle.Font,
FontStyle.Bold), new Point(X,Y), Color.Black);

sizeCadena = TextRenderer.MeasureText(cadena2, new Font(e.CellStyle.Font,
FontStyle.Bold));

X += sizeCadena.Width-8;

carateresDesplegados+= cadena1.Length + cadena2.Length;

}

if (carateresDesplegados < e.Value.ToString().Length)

{

string cadena1= e.Value.ToString().Substring(carateresDesplegados);

TextRenderer.DrawText(e.Graphics, cadena1, e.CellStyle.Font, new Point(X,
Y), Color.Black);

}

e.Handled = true;

}








"Luis Miguel Blanco"
escribió
en el mensaje news:
> Hola Francisco
>
> No hay de qué, me alegro de que te sirviera 8-D
>
> Respecto a la capacidad de aplicar este efecto que mencionas de forma
> selectiva a parte del texto de una celda, también es posible, aunque en
> este
> caso tenemos que "hilar más fino", y el evento CellFormatting se nos
> queda
> un
> poco corto de alcance 8-)
>
> Para ello lo que necesitamos es recurrir al otro evento: CellPainting,
> el
> cual deja al programador libertad absoluta para pintar como quiera la
> totalidad de la celda. Aunque claro, en este caso "tanto poder,
> conlleva
> una
> gran responsabilidad" 8-) y tenemos que encargarnos de toda la
> operación
> de
> dibujo de la celda.
>
> Te adjunto un bloque de código en el que utilizando este evento,
> comprobamos
> si estamos situados en una columna y fila adecuada, además de que la
> columna
> sea también la que vamos a manipular. En caso afirmativo, rellenamos el
> fondo
> de la celda con un color, y dibujamos su contorno.
>
> Supongamos que lo que queremos es poner en negrita la primera palabra
> del
> valor a mostrar en la celda. En ese caso, pasamos a sendas variables la
> cadena a mostrar resaltada y el resto del valor. Calculamos el tamaño
> del
> texto a resaltar con TextRenderer.MeasureText, y realizamos dos
> operaciones
> de dibujo de texto con TextRenderer.DrawText, una para la palabra en
> negrita
> y otra para el resto. Como puedes observar, también debemos encargarnos
> de
> ubicar el texto en la posición que necesitemos dentro de la celda.
>
> Observa que el final, mediante "e.Handled = true;" le decimos al
> control
> que
> somos nosotros quienes nos encargamos del dibujo de la celda, ya que de
> otra
> forma, el DataGridView efectuaría sus propias operaciones de dibujo
> encima
> de
> las nuestras, eliminándolas.
>
> //-
> private void dgvGrid_CellPainting(object sender,
> DataGridViewCellPaintingEventArgs e)
> {
> if (e.ColumnIndex > 0 && e.RowIndex >= 0 &&
> this.dgvGrid.Columns[e.ColumnIndex].Name == "SpanishProductName")
> {
> e.Graphics.FillRectangle(new SolidBrush(Color.Lavender), e.CellBounds);
> e.Graphics.DrawRectangle(new Pen(Color.DarkMagenta, 1), e.CellBounds);
>
> int nPosicionEspacio = e.Value.ToString().IndexOf(" ");
> string sP1 = e.Value.ToString().Substring(0, nPosicionEspacio);
> string sP2 = e.Value.ToString().Substring(nPosicionEspacio + 1);
>
> Size szTexto1 = TextRenderer.MeasureText(sP1, new
> Font(e.CellStyle.Font,
> FontStyle.Bold));
>
> TextRenderer.DrawText(e.Graphics,
> sP1,
> new Font(e.CellStyle.Font, FontStyle.Bold),
> new Point(e.CellBounds.X, e.CellBounds.Y + 2),
> Color.DarkBlue);
>
> TextRenderer.DrawText(e.Graphics,
> sP2,
> e.CellStyle.Font,
> new Point(e.CellBounds.X + szTexto1.Width, e.CellBounds.Y + 2),
> Color.DarkBlue);
>
> e.Handled = true;
> }
> }
> //-
>
> Espero que partiendo de este ejemplo, y con algunos retoques propios,
> consigas el efecto que necesitas.
>
> Un saludo
> Luis Miguel Blanco
> http://www.dotnetmania.com
>
>
> "Francisco Zavala Hernandez" wrote:
>
>> Hol a Luis.
>>
>> Muchas gracias por la ayuda, me sirve mucho el ejemplo que me has
>> puesto.
>> Pero no sabes si es posible aplicar un Formato a una celda pero solo
>> particial mente
>> ejemplo que la celda contenga "Hola Mundo " y que solo resalte Mundo
>> ya
>> sea
>> con un tamaño de letra mas grande o otro color ..
>>
>> :P gracias por la ayuda
>>
>> saludos!!
>>
>>
>>
>>
>>
>> "Luis Miguel Blanco"
>> escribió
>> en el mensaje
>> news:
>> > Hola Francisco
>> >
>> > Puedes utilizar el evento CellFormatting del DataGridView, que se
>> > produce
>> > cada vez que el control necesita dibujar una celda, permitiendo
>> > aplicarle
>> > un
>> > formato al valor a dibujar. Te adjunto un bloque de ejemplo en el
>> > que
>> > se
>> > comprueba a qué columna pertenece el valor a mostrar. Si además se
>> > cumple
>> > una
>> > condición, se aplica un formato de negrita al valor a dibujar,
>> > utilizando
>> > para ello el estilo correspondiente a la celda.
>> >
>> > //--
>> > private void dgvGrid_CellFormatting(object sender,
>> > DataGridViewCellFormattingEventArgs e)
>> > {
>> > if (this.dgvGrid.Columns[e.ColumnIndex].Name == "ListPrice")
>> > {
>> > // y se cumple esta condición
>> > if ((decimal)e.Value > 1000)
>> > {
>> > e.CellStyle.Font = new Font("Comic Sans MS", 12, FontStyle.Bold);
>> > }
>> > }
>> > }
>> > //--
>> >
>> > Espero que te sirva de ayuda
>> >
>> > Un saludo
>> > Luis Miguel Blanco
>> > http://www.dotnetmania.com
>> >
>> >
>> > "Francisco Zavala Hernandez" wrote:
>> >
>> >> Hola amigos.
>> >>
>> >> Quiero hacer lo siguiente pero no se si pueda...
>> >> Hice una aplicacion que realiza una busquedas en una base de datos
>> >> y
>> >> el
>> >> resultado lo despliego en un datagridview y hasta ahi todo bien..
>> >> Pero lo que quierero hacer es por ejemplo que si pongo en le
>> >> buscador
>> >> "Impresora HP" (la base de datos es de productos de computo) que
>> >> esas
>> >> palabras salgan resaltadas en el datagridview...
>> >>
>> >> No se si se pueda hacer y si se puede hacer no se como jejejeje
>> >>
>> >> gracias de antemano .
>> >>
>> >> att: Francisco Zavala
>> >>
>> >>
>> >>
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#5 cmosteiro
15/06/2007 - 21:40 | Informe spam
Hola, estoy buscando como cargar imagenes en un datagridview.

El tema es qeu estoy mostrando categorias... y en caso de qeu la
categoria tenga subcategorias me gustaria mostrar un tipo de imagen,
caso contrario otra imagen

Creo qeu el caso es algo similar al problema del resaltado...


Desde ya muchas gracias.

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