Комплект XtraGrid - является там способом добавить кнопку или гиперссылку к ячейке?

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

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

Таким образом, если бы событие запускается, я записал бы текущее время к Объекту-событию и установил бы его как событие 'Start'. Я хотел бы добавить кнопку/гиперссылку "Stop" к ячейке в той строке. Если бы пользователь, пожелания зарегистрировать событие Ends, тип события, и т.д. были бы скопированы в новое Событие с типом 'Остановка' и кнопка, исчезнет.

Я надеюсь, что это имеет смысл.

Править: Ответ Aaronaught на самом деле лучше, чем, что я первоначально спрашивал (кнопка), таким образом, я обновил вопрос. Тем путем любой поиск помещения гиперссылки в ячейке может извлечь выгоду из его примера:)

6
задан DevExpress Team 15 September 2010 в 09:51
поделиться

3 ответа

Я предпочитаю использовать текст в стиле гиперссылки, переопределяя код чертежа и обрабатывая события перемещения/клика мышью, так как кнопки не слишком хорошо масштабируются до типичной высоты рядов сетки. Однако, если кнопка действительно нужна вам, вы должны иметь возможность сделать это, используя RepositoryItemButtonEdit в качестве типа редактора.

Если вас интересует первое, оставьте комментарий, и я обновлю его на примере. В противном случае, как уже упоминалось, просто используйте RepositoryItemButtonEdit. Вы можете изменить его свойства, чтобы он занимал всю ячейку, если хотите, а затем сделать колонку фиксированного размера, чтобы кнопка не растягивалась.


UPDATE: Ниже я размещаю пример кода для "красивой гиперссылки", который мне нравится намного больше, чем стандартная ячейка гиперссылки, потому что (а) он выглядит лучше, (б) дает обратную связь по наведению курсора, и (в) вы можете изменить курсор, если хотите (я использую утилитный метод, чтобы получить нативный курсор руки из операционной системы, которая имеет более трехмерный вид, чем встроенный курсор руки Winforms).

Обратите внимание на пользователей, не использующих DevExpress, читая следующее: Я использую почти идентичную технику для стандартного System.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.

  • MyColors - это класс утилит, который определяет пару публичных статических readonly Color полей, используемых для UI вещей. Вы можете заменить ссылки на него жестко закодированными цветами, если собираетесь делать это только на одной сетке.

  • Я не беспокоюсь о кэшировании Шрифта , хотя вы, вероятно, могли бы, так как их всего два.

  • Логика курсора будет путаться с любой другой логикой курсора, которую Вы можете использовать на сетке (которая практически отсутствует почти в каждом случае для меня, так что в общем всё должно быть в порядке).

  • Если вы хотите иметь более одного "связующего столбца", вам нужно поддерживать поле состояния hoverColumn в дополнение к hoverRowHandle, и, очевидно, изменить эти сравнения равенства одного столбца, чтобы искать несколько столбцов.

Для моих собственных Winforms приложений у меня есть провайдер-расширитель, который позволяет мне прикрепить это поведение к GridView или ListView, выбрасывая в список пары название столбца/ссылка текста, но этот код слишком длинный, чтобы писать его здесь. Пример выше должен помочь вам начать.

15
ответ дан 8 December 2019 в 05:54
поделиться

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

5
ответ дан 8 December 2019 в 05:54
поделиться

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

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

1
ответ дан 8 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: