2014-11-19 4 views
1

ListView에서 선택한 항목 주위에 직사각형을 그려야합니다. Microsoft에서 해당 항목의 '강조 표시된 색'을 변경하지 말 것을 권장합니다. 그러나 selectedIndexChanged 이벤트를 사용하고 실제 listviewitem 그릴 때 내 사각형이 사라집니다. 교양있는 추측은 내 직사각형이 그 뒤에 있거나 다시 그려 질 때 지워 졌다고 제안 할 것입니까? 그래서 내 질문은 언제 볼 수있는 사각형을 그리는 것이 가장 좋은 시간일까요? 지금까지 아래에서 볼 수 있습니다 내 코드 :선택한 ListView 항목 주위 사각형 사각형

void lvMain_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (lvMain.SelectedItems.Count > 0) 
     { 
      if (lastSelectedItem == null) // First time called 
      { 
       lastSelectedItem = (sender as System.Windows.Forms.ListView).SelectedItems[0]; 
       DrawHighlightRectanlge(lastSelectedItem); 
      } 
      else 
      { 
       // TODO: Remove previous highlight 
       lastSelectedItem = (sender as System.Windows.Forms.ListView).SelectedItems[0]; 
       DrawHighlightRectanlge(lastSelectedItem); 
      } 
     } 
    } 

    internal void DrawHighlightRectanlge(System.Windows.Forms.ListViewItem item) 
    { 
     using (Graphics g = item.ListView.CreateGraphics()) 
     {     
      g.DrawRectangle(new Pen(Color.Red), new Rectangle(item.Position.X, item.Position.Y, item.Bounds.Width, item.Bounds.Height)); 
     } 
    } 

TIA 여기

+0

예, 'DrawItem' 이벤트에서 오버 페인트됩니다. 직사각형 그리기 코드를 추가하고 추가해야하는 곳입니다. 이제 모든 그림을 한 장씩 가져와야합니다. 하지만 대부분의 어려운 일은'e' 매개 변수에서 함수를 호출하여 수행 할 수 있습니다. - 어떤보기 모드를 사용합니까? – TaW

+0

'세부 정보'보기를 사용 중입니다. –

답변

0

가에 대한 아주 기본적인 버전 소유자가 그린 ListView을. true로 OwnerDraw 속성을 설정하고 DrawItem 이벤트를 코딩, 어쩌면 같은 :

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) 
{ 
    e.DrawBackground(); 
    e.DrawText(); 

    if (e.Item.Selected) 
    { 
     Rectangle R = e.Bounds; 
     R.Inflate(-1, -1); 
     using (Pen pen = new Pen(Color.Red, 1.5f)) 
     e.Graphics.DrawRectangle(pen, R); 
    } 
} 

내가 그것을 Details View에서 작동하려면 약간의 작은 사각형을, 그러나 당신은 당신의 요구에 맞게 만들기 위해 놀러해야하며 공상 ..!

참고 :부터 ColumnHeaders이있는 경우는 다음과 같이 단순한 형태에서 DrawColumnHeader 이벤트를 코딩해야합니다

private void listView1_DrawColumnHeader(object sender, 
             DrawListViewColumnHeaderEventArgs e) 
{ 
    e.DrawDefault = true; 
} 

을 그리고 당신은 당신이 DrawSubItem 이벤트를 가질 필요가 하위 항목, 다시 이상 등이있는 경우 이 :

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) 
{ 
    e.DrawDefault = true; 
} 

사각형을 여기에 그리려면 분명히이 이벤트에 더 많은 코드를 작성해야합니다. 그러나 DrawBackgroundDrawText의 기본 기능도 여기에서 사용할 수 있습니다.

+0

이것은 훌륭합니다. 감사합니다. –