Я предпочитаю использовать текст в стиле гиперссылки, переопределяя код рисования и обрабатывая события перемещения / щелчка мыши, поскольку кнопки не слишком хорошо масштабируются до типичной высоты строки сетки.Однако, если кнопка действительно то, что вам нужно, вы можете сделать это, используя RepositoryItemButtonEdit
в качестве типа редактора.
Если вы заинтересованы в первом, оставьте комментарий, и яобновите это с примером.В противном случае, как уже упоминалось, просто используйте RepositoryItemButtonEdit
.Вы можете изменить его свойства, чтобы он занимал всю ячейку, если хотите, а затем сделать столбец фиксированного размера, чтобы кнопка не растягивалась.
ОБНОВЛЕНИЕ: IНиже выложен пример кода для «симпатичной гиперссылки», который мне нравится намного лучше, чем стандартная ячейка гиперссылки, потому что (а) она выглядит лучше, (б) она дает всплывающую обратную связь, и (в) вы можете изменить курсоресли хотите (я использую служебный метод для получения встроенного ручного курсора из ОС, который выглядит более трехмерно, чем встроенная рука Winforms).
Примечание для пользователей, не являющихся DevExpress, читающихэто: Я использую почти идентичную технику для стандарта System.Windows.Forms.ListView
.Microsoft довольно часто использует этот шаблон пользовательского интерфейса в Vista и Windows 7, и было бы полезно узнать, как это сделать, даже если результат не является совершенной копией.
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;
}
Несколькопримечания к этому коду:
MyItem
- это любой тип данных, который вы привязали к представлению таблицы.Может быть, это DataRow
, или, может быть, это некоторый пользовательский тип, если источником данных является IList<T>
.
MyColors
- это служебный класс, который определяет пару public static readonly Color
поля, используемые для пользовательского интерфейса.Вы можете заменить ссылки на это жестко закодированными цветами, если вы собираетесь делать это только на одной сетке.
Я не беспокоюсь о кэшировании Font
, хотяВы, вероятно, могли бы, так как их всего два.
Логика курсора будет связываться с любой другой логикой курсора, которую вы можете использовать в сетке (которой практически нет практически во всех случаях длямне, так что в целом у вас все будет в порядке).
Если вы хотите иметь более одного «столбца ссылок», вам необходимо сохранить поле состояния hoverColumn
в дополнение к hoverRowHandle
, и, очевидно, измените эти сравнения равенства в одном столбце для поиска нескольких столбцов.
Для моих собственных приложений Winforms у меня фактически есть поставщик расширителя, который позволяет мне присоединять это поведение кGridView
или ListView
путем добавления в список пар столбцов / текстовых ссылок, но этот код слишком длинен для размещения здесь.Приведенный выше пример поможет вам начать.