2013-05-06 2 views
2

После некоторого поиска я не столкнулся с моим конкретным вопросом.Удалить выделение и добавить границу выделения в WinForms ListView C#

Я хотел бы изменить поведение по умолчанию выбора ListView на WinForm в C#

мне нужно сделать это, потому что я использую свои собственные цвета в клетках, чтобы представлять метаинформационную necessecary пользователя.

(я использую единственный выбор строки только, т.е. MutiSelect = false;)

Когда я выбираю строку в ListView вся строка highlighed синий по умолчанию,

Selected Row with Blue Background

Вместо этого я хотел бы знаете,

Как я могу очертить границу строки и не изменять цвет (ы) ячеек в строке?

Как видно в следующем

Selected Row without Blue Background and dotted line

ответ

0

Там нет никакого способа сделать это, единственный способ, чтобы удалить выделение, чтобы создать пользовательский элемент управления ListView себя и переопределить как рисуется выбранный элемент.

EDIT:

дать этому классу попробовать:

public class NativeListView : System.Windows.Forms.ListView 
{ 
    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)] 
    private extern static int SetWindowTheme(IntPtr hWnd, string pszSubAppName, 
             string pszSubIdList); 

    protected override void CreateHandle() 
    { 
     base.CreateHandle(); 

     SetWindowTheme(this.Handle, "explorer", null); 
    } 
} 
+0

Вы уверены? этот пользователь имеет противоположную проблему. http://stackoverflow.com/questions/9642281/listview-selection-rectangle. –

+0

У него нет того же, он также хочет изменить свой выбор на что-то другое (стиль проводника Windows в этом случае), вы хотите сделать его прозрачным и просто выделить границы. – Max

+0

хорошо в любом случае, на этом вопросе появляется «прямоугольник выбора», в то время как его нет в моих тестах C#/listview. Если может быть показан «прямоугольник выбора», я могу переопределить другие аспекты окраски строк. –

2

Да, ListView поддерживает пользовательский рисунок, установив свойство OwnerDraw в True. Это, как правило, сложное, но ваши потребности просты, вы можете использовать много рисунков по умолчанию здесь. Только когда выбран пункт, вам нужно что-то другое. Класс ControlPaint может рисовать нужный прямоугольник. Внедрите три обработчика событий Draw, примерно так:

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

    private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { 
     e.DrawBackground(); 
     e.DrawText(); 
     if ((e.State & ListViewItemStates.Selected) == ListViewItemStates.Selected) { 
      var bounds = e.Bounds; 
      bounds.Inflate(-1, -1); 
      ControlPaint.DrawFocusRectangle(e.Graphics, bounds); 
     } 
    } 

    private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) { 
     e.DrawBackground(); 
     e.DrawText(); 
     if ((e.ItemState & ListViewItemStates.Selected) == ListViewItemStates.Selected) { 
      var bounds = e.Bounds; 
      bounds.Inflate(-1, -1); 
      ControlPaint.DrawFocusRectangle(e.Graphics, bounds); 
     } 
    } 

Тонкая настройка по желанию. Обратите внимание, что вы, вероятно, также хотите реализовать событие MouseDown, чтобы пользователь мог щелкнуть любой подэлемент и выбрать строку. Непонятно, что это ведет себя как ListView. Используйте метод HitTest() для его реализации.

+0

Спасибо, я попробую это. –

+0

Это работает, но у меня есть странная ошибка. При наведении курсора на строку в первый раз без щелчка сразу после того, как функция 'e.DrawText()' вызывается в 'listView1_DrawItem()', другие подэлементы исчезают. Единственное, что остается, это первый столбец. Это не повторится после щелчка по строке один раз. Какие-либо предложения? –

+0

Не знаю. Я подозреваю исключение, посмотрите в окне «Вывод». –