그림 코드를 재정의하고 마우스 이동/클릭 이벤트를 처리하여 단추가 확장되지 않으므로 하이퍼 링크 스타일의 텍스트를 사용하는 것을 선호합니다. 그리드의 일반적인 행 높이와 너무 잘 맞습니다. 그러나 버튼이 실제로 원하는 것이면 편집기 유형으로 RepositoryItemButtonEdit
을 사용하여 버튼을 수행 할 수 있어야합니다.
전자에 관심이 있다면 의견을 남겨주세요. 예를 들어이를 업데이트하겠습니다. 그렇지 않으면 언급 한 바와 같이 RepositoryItemButtonEdit
을 사용하십시오. 원하는 경우 전체 셀을 차지하도록 속성을 변경 한 다음 버튼이 늘어나지 않도록 열을 고정 크기로 만들 수 있습니다.
UPDATE : (A)가 낫 네요, (B)가 제공하기 때문에는 내가 표준 하이퍼 링크 세포보다 훨씬 더 좋아 아래 "꽤 하이퍼 링크"에 대한 몇 가지 예제 코드를 게시하도록하겠습니다 마우스 오버 피드백과 (c) 원하는 경우 커서를 변경할 수 있습니다 (유틸리티 메서드를 사용하여 Winforms의 기본 제공 손보다 3D보기가 더한 OS에서 기본 손 모양 커서를 가져옵니다).
DevExpress가 아닌 사용자는 다음을 읽습니다. 나는 System.Windows.Forms.ListView
표준과 거의 동일한 기술을 사용합니다. Microsoft는 Vista 및 Windows 7에서이 UI 패턴을 상당히 사용하며, 결과가 복제본이 아니더라도 수행 방법을 배우는 것이 좋습니다. 이 코드에 대한
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
은 UI 항목에 사용되는 두 개의 public static readonly Color
필드를 정의하는 유틸리티 클래스입니다. 하나의 그리드에서만이 작업을 수행하려는 경우 참조를 하드 코딩 된 색상으로 바꿀 수 있습니다.
Font
을 캐싱하지 않아도 되겠지만, 실제로는 두 개 밖에 없기 때문에 가능합니다.
커서 로직은 그리드에서 사용할 수있는 다른 커서 로직과 혼동을 일으킬 것입니다. (사실상 거의 모든 경우에있어 거의 모든 경우에있어 일반적으로 괜찮을 것입니다).
개 이상 "링크를 열"을 갖고 싶어
, 당신은 hoverRowHandle
외에 hoverColumn
상태 필드를 유지하고, 분명히 여러 열을 검색하는 단일 열 동등 비교를 변경해야합니다. 내 자신의 윈폼 앱의
, 사실은 나 열 이름/링크 텍스트 쌍의 목록에 던지기하여 GridView
또는 ListView
에이 동작을 첨부 할 수 있도록하는 익스텐더 공급자를 가지고 있지만, 그 코드는 단지 꼬마입니다 조금 너무 길어 여기에 게시 할 수 없습니다. 위의 예제를 시작해야합니다.
감사를 제안, 나는 하이퍼 링크의 부여 됨으로써를보고 싶어요. 그 동안, 나는'RepositoryItemButtonEdit' 작업을 사용할 것이다. –
@ calico-cat : 약속대로! – Aaronaught
이 답변에 대한 모든 노력을 진심으로 감사드립니다. 나는 그것이 한 번 이상 upvote 수 있었으면 좋겠다! –