XtraGrid Suite - есть ли способ добавить кнопку или гиперссылку в ячейку? - PullRequest
6 голосов
/ 30 января 2010

Я работаю с XtraGrid Suite, разработанным DevExpress. Я не могу найти какую-либо функциональность, чтобы сделать это, но мне любопытно, можете ли вы добавить кнопку или гиперссылку в ячейку сетки.

Контекст: у меня есть список событий. Каждое событие имеет время, начало / конец и категорию (утилиты и обслуживание). Могут быть события Start и Stop. Проведя анализ проблемы, я решил, что использование StartTime и EndTime для каждого события не будет работать.

Таким образом, если событие начинается, я записываю текущее время для объекта Event и устанавливаю его как событие «Start». Я хотел бы добавить кнопку "Стоп" / гиперссылку на ячейку в этой строке. Если пользователь желает зарегистрировать событие Ends, его тип и т. Д. Будут скопированы в новое событие с типом «Стоп», и кнопка исчезнет.

Надеюсь, это имеет смысл.

РЕДАКТИРОВАТЬ: Aaronaught ответ на самом деле лучше, чем я первоначально просил (кнопка), поэтому я обновил вопрос. Таким образом, каждый, кто хочет разместить гиперссылку в ячейке, может извлечь пользу из своего примера:)

Ответы [ 4 ]

15 голосов
/ 30 января 2010

Я предпочитаю использовать текст в стиле гиперссылки, переопределяя код рисования и обрабатывая события перемещения / щелчка мыши, поскольку кнопки не слишком хорошо масштабируются до типичной высоты строки сетки.Однако, если кнопка действительно то, что вам нужно, вы можете сделать это, используя 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 путем добавления в список пар столбцов / текстовых ссылок, но этот код слишком длинен для размещения здесь.Приведенный выше пример поможет вам начать.

5 голосов
/ 30 января 2010

Используйте RepositoryItemButtonEdit и установите TextEditStyle на HideTextEditor.

1 голос
/ 25 марта 2013

Теперь это можно сделать с помощью элемента управления RepositoryItemHyperLinkEdit.

См .: RepositoryItemHyperLinkEdit Class

1 голос
/ 16 марта 2010

вы можете использовать RepositoryItemButtonEdit: выберите целевой столбец, в «Свойствах» нажмите «ColumnEdit» и выберите «новый», после чего выберите «ButtonEdit». нажмите на свою сетку и выберите «запустить конструктор», выберите «Репозиторий на месте» в группе «Репозиторий». выберите «repositoryItemButtonEdit1» (если вы не изменили имя компонента Button edit), выберите вкладку «event» и выберите событие «ButtonPressed». заполните свой код в этом событии. если вы хотите, скрыть часть редактора компонента, выбрать целевой столбец, в «Свойствах» нажать «ColumnEdit», найти «TextEditStyle» и выбрать «HideTextEditor».

Но один вопрос! ?? Я хочу добавить картинку в мою кнопку, у кого-нибудь есть идеи?

...