2010-01-30 6 views
6

DevExpress에서 만든 XtraGrid Suite를 사용하고 있습니다. 이 작업을 수행하는 기능을 찾을 수 없지만 단추 또는 하이퍼 링크를 표 셀에 추가 할 수 있는지 궁금합니다.XtraGrid Suite - 버튼 또는 하이퍼 링크를 셀에 추가하는 방법이 있습니까?

컨텍스트 : 이벤트 목록이 있습니다. 각 이벤트에는 시간, 시작/종료 및 범주 (유틸리티 및 유지 관리)가 있습니다. Start 이벤트와 Stop 이벤트가있을 수 있습니다. 문제에 대한 분석을 마친 후 각 이벤트에 대해 StartTime 및 EndTime을 사용하면 효과가 없다고 결정했습니다.

이벤트가 시작되면 현재 시간을 Event 개체에 기록하고 '시작'이벤트로 설정합니다. 그 행에있는 셀에 "Stop"버튼/하이퍼 링크를 추가하고 싶습니다. 사용자가 종료 이벤트를 기록하려면 이벤트 유형 등이 '중지'유형의 새 이벤트에 복사되고 버튼이 사라집니다.

나는 이것이 의미가 있기를 바랍니다.

편집 : Aaronaught의 답변이 원래 질문 (버튼)을 묻는 질문보다 업데이트되었습니다. 그런 식으로 셀에 하이퍼 링크를 넣으려는 사람은 그의 예제에서 이점을 얻을 수 있습니다.)

답변

15

그림 코드를 재정의하고 마우스 이동/클릭 이벤트를 처리하여 단추가 확장되지 않으므로 하이퍼 링크 스타일의 텍스트를 사용하는 것을 선호합니다. 그리드의 일반적인 행 높이와 너무 잘 맞습니다. 그러나 버튼이 실제로 원하는 것이면 편집기 유형으로 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에이 동작을 첨부 할 수 있도록하는 익스텐더 공급자를 가지고 있지만, 그 코드는 단지 꼬마입니다 조금 너무 길어 여기에 게시 할 수 없습니다. 위의 예제를 시작해야합니다.

+0

감사를 제안, 나는 하이퍼 링크의 부여 됨으로써를보고 싶어요. 그 동안, 나는'RepositoryItemButtonEdit' 작업을 사용할 것이다. –

+1

@ calico-cat : 약속대로! – Aaronaught

+2

이 답변에 대한 모든 노력을 진심으로 감사드립니다. 나는 그것이 한 번 이상 upvote 수 있었으면 좋겠다! –

5

RepositoryItemButtonEdit을 사용하고 TextEditStyleHideTextEditor으로 설정하십시오.

1

RepositoryItemButtonEdit : "등록 정보"에서 "ColumnEdit"을 클릭하고 "ButtonEdit"을 선택한 후 "new"를 선택하여 대상 열을 선택하십시오. 그리드를 클릭하고 "디자이너 실행"을 선택하고 "리포지토리"그룹에서 "현재 위치 편집기 리포지토리"를 선택하십시오. "repositoryItemButtonEdit1"을 선택하십시오 (변경하지 않은 경우 단추 구성 요소 이름 편집). "이벤트"탭을 선택하고 "ButtonPressed"이벤트를 선택하십시오. 이 이벤트에서 코드를 작성하십시오. "ColumnEdit"을 클릭하고 "TextEditStyle"을 찾은 다음 "HideTextEditor"를 선택하여 구성 요소의 편집기 부분을 숨기고 대상 열을 선택하십시오.

하지만 한 가지 질문이 있습니다. ?? 버튼에 그림을 추가하고 싶습니다. 누군가 어떤 아이디어가 있습니까?

+0

나는 이것을 새로운 질문. –

관련 문제