Prefiero usar texto de estilo de hipervínculo anulando el código de dibujo y manejando movimientos de mouse/clic, ya que los botones no escalan demasiado bien a la altura de fila típica de una cuadrícula. Sin embargo, si un botón es realmente lo que desea, debe poder hacerlo utilizando el RepositoryItemButtonEdit
como tipo de editor.
Si está interesado en el primero, deje un comentario y lo actualizaré con un ejemplo. De lo contrario, como se mencionó, simplemente use el RepositoryItemButtonEdit
. Puede cambiar sus propiedades para ocupar toda la celda si lo desea, y luego hacer que la columna tenga un tamaño fijo para que el botón no se estire.
ACTUALIZACIÓN: les dejo algunos ejemplos de código para el "bastante hipervínculo" a continuación, que me gusta mucho mejor que una celda de hipervínculo estándar porque (a) se ve más bonito, (b) da hover retroalimentación, y (c) puede cambiar el cursor si lo desea (utilizo un método de utilidad para obtener el cursor nativo de la mano del sistema operativo, que tiene un aspecto más 3D que la mano incorporada de Winforms).
Nota para los usuarios que no son DevExpress que lee esto: uso casi una técnica idéntica para el estándar System.Windows.Forms.ListView
. Microsoft usa bastante este patrón de interfaz de usuario en Vista y Windows 7 y es bueno aprender a hacerlo, incluso si el resultado no es una réplica perfecta.
private int hoverRowHandle = GridControl.InvalidRowHandle;
private void gridView_Click(object sender, EventArgs e)
{
if (hoverRowHandle != GridControl.InvalidRowHandle)
{
MyItem item = gridView.GetRow(hoverRowHandle) as MyItem;
if (item != null)
// Do whatever the "click" action is here
}
}
private void gridView_CustomDrawCell(object sender,
RowCellCustomDrawEventArgs e)
{
if (e.Column == linkColumn)
{
bool hover = (hoverRowHandle == e.RowHandle);
FontStyle style = hover ? FontStyle.Underline : FontStyle.Regular;
TextFormatFlags formatFlags =
TextFormatFlags.Left | TextFormatFlags.VerticalCenter |
TextFormatFlags.WordEllipsis;
Color foreColor = gridView.IsRowSelected(e.RowHandle) ?
Color.White : (hover ? MyColors.LinkHover : MyColors.Link);
using (Font font = new Font(gridControl.Font, style))
{
TextRenderer.DrawText(e.Graphics, "Link Text", font, e.Bounds,
foreColor, formatFlags);
}
e.Handled = true;
}
}
private void gridView_MouseLeave(object sender, EventArgs e)
{
int tempRowHandle = hoverRowHandle;
hoverRowHandle = GridControl.InvalidRowHandle;
if (tempRowHandle != GridControl.InvalidRowHandle)
{
gridView.InvalidateRowCell(tempRowHandle, linkColumn);
}
}
private void gridView_MouseMove(object sender, MouseEventArgs e)
{
int tempRowHandle = hoverRowHandle;
if (tempRowHandle != GridControl.InvalidRowHandle)
{
hoverRowHandle = GridControl.InvalidRowHandle;
gridView.InvalidateRowCell(tempRowHandle, linkColumn);
}
GridHitInfo hitInfo = gridView.CalcHitInfo(e.Location);
if (hitInfo.InRowCell && (hitInfo.Column == linkColumn))
{
hoverRowHandle = hitInfo.RowHandle;
gridView.InvalidateRowCell(hoverRowHandle, linkColumn);
}
bool hoverDetail = (hoverRowHandle != GridControl.InvalidRowHandle);
gridControl.Cursor = hoverDetail ? Cursors.Hand : Cursors.Default;
}
Algunas notas acerca de este código:
MyItem
es cualquier tipo de datos que se han unido a la vista de cuadrícula. Tal vez es DataRow
, o tal vez es un tipo personalizado si la fuente de datos es IList<T>
.
MyColors
es una clase de utilidad que define un par de campos public static readonly Color
utilizados para cosas de UI. Puede reemplazar las referencias a eso con colores codificados si solo va a hacer esto en una cuadrícula.
No me molesto en el almacenamiento en caché del Font
, aunque probablemente podría, ya que solo hay dos.
La lógica del cursor interferirá con cualquier otra lógica de cursor que pueda usar en la cuadrícula (que prácticamente no existe en casi todos los casos para mí, por lo que generalmente debería estar bien).
Si usted desea tener más de una "columna de enlace", que necesita para mantener un campo hoverColumn
Estado además de la hoverRowHandle
, y, obviamente, cambiar esas comparaciones de igualdad de una sola columna para buscar múltiples columnas.
Por mis propias aplicaciones Winforms, que en realidad tienen un proveedor extensor que me permite adjuntar este comportamiento a un GridView
o ListView
lanzando en una lista de pares de nombre de la columna/texto del enlace, pero que el código es sólo un wee demasiado largo para publicar aquí. El ejemplo anterior debería ayudarte a comenzar.
Gracias por la oferta, me gustaría ver un exmple del hipervínculo. Mientras tanto, usaré el trabajo 'RepositoryItemButtonEdit'. –
@ calico-cat: ¡Aquí tienes, como prometiste! – Aaronaught
Muchas gracias por todo el esfuerzo que puso en esta respuesta. ¡Ojalá pudiera votarlo más de una vez! –