2010-01-30 41 views
6

Estoy trabajando con XtraGrid Suite creado por DevExpress. No puedo encontrar ningún tipo de funcionalidad para hacer esto, pero tengo curiosidad si puede agregar un botón o hipervínculo a una celda de la cuadrícula.Suite XtraGrid: ¿hay alguna manera de agregar un botón o hipervínculo a una celda?

Contexto: Tengo una lista de eventos. Cada evento tiene un tiempo, inicio/final y una categoría (utilidad y mantenimiento). Puede haber eventos de inicio y eventos de detención. Habiendo hecho mi análisis del problema, he decidido que tener StartTime y EndTime para cada evento no funcionaría.

Por lo tanto, si se inicia un evento, registraría la hora actual en el objeto Evento y lo configuraría como un evento 'Inicio'. Me gustaría agregar un botón/hipervínculo "Parar" a una celda en esa fila. Si el usuario desea registrar un evento Ends, el tipo de evento, etc. se copiará en un nuevo evento con el tipo 'Stop' y el botón desaparecerá.

Espero que esto tenga sentido.

EDITAR: La respuesta de Aaronaught es en realidad mejor de lo que originalmente estaba preguntando (un botón), así que actualicé la pregunta. De esta forma, cualquier persona que busque poner un hipervínculo en una celda puede beneficiarse de su ejemplo:)

Respuesta

15

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.

+0

Gracias por la oferta, me gustaría ver un exmple del hipervínculo. Mientras tanto, usaré el trabajo 'RepositoryItemButtonEdit'. –

+1

@ calico-cat: ¡Aquí tienes, como prometiste! – Aaronaught

+2

Muchas gracias por todo el esfuerzo que puso en esta respuesta. ¡Ojalá pudiera votarlo más de una vez! –

5

Utilice RepositoryItemButtonEdit y configure TextEditStyle en HideTextEditor.

1

puede usar RepositoryItemButtonEdit: seleccione su columna de destino, en "Propiedades", haga clic en "ColumnEdit" y seleccione "nuevo", después de seleccionar "ButtonEdit". haga clic en su cuadrícula y seleccione "ejecutar diseñador", seleccione "in situ Repositorio del Editor" en el grupo "Repositorio". seleccione "repositoryItemButtonEdit1" (si no ha cambiado el botón editar el nombre del componente), seleccione la pestaña "evento" y seleccione el evento "ButtonPressed". llena tu código en este evento. si lo desea, oculte la parte del editor del componente, seleccione la columna de destino, en "Propiedades", haga clic en "ColumnEdit", busque "TextEditStyle" y elija "HideTextEditor".

¡Pero, una pregunta! ?? quiero agregar una imagen en mi botón, alguien tiene alguna idea?

+0

Lo publicaría como una nueva pregunta. –

Cuestiones relacionadas