Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как организовать выделение столбцов


Автор: ДобренькийПапаша 22.9.2009, 17:08
У меня есть одна строка в ListView. У неё 18 столбцов. Должна быть возможность выбора отдельного столбца, и соответственно подсвечиваться должен синим цветом выбранный. FullRowSelect поставил в false.

Код

            lvWeek.Items.Add("");
            const byte weeks = 18;
            for(byte i=0; i<weeks; i++)
            {
                lvWeek.Items[0].SubItems.Add("");
            }


После этого выбирается (подсвечивается синим) только первый столбец. Как сделать возможность выбора каждого столбца и его подсветки?

p.s. Когда создаю ListView, ставлю вид Details, gridline=true, то всегда отображается минимум две строки, как сделать чтобы была одна строка?

Автор: VeryWell 22.9.2009, 17:46
Работай над измененнием цвета ячейки. 
Код

lvWeek.Items[i].UseItemStyleForSubItems = false;
lvWeek.Items[i].SubItems[8].BackColor = Color.Blue;

Определять ячейку можно через событие (вроде ItemCheck)

Автор: ДобренькийПапаша 23.9.2009, 10:36
Нет, так не получается.

Нашёл с помощью http://www.gotdotnet.ru/Forums/Windows/119201.aspx

Но не хочу так(((

Просто чую, что можно без этого обойтись.

Автор: ДобренькийПапаша 23.9.2009, 14:28
Хех, всё, что я нашёл, это не то. Там выделяется вся строка. И причём событие клик по ListView срабатывает только если клик произошёл на первом элементе строки, то есть не на subitem'e...

Вот это всё по сути решало бы проблему:

Код

 private void HighlightRow(ListViewItem item)
    {
       Rectangle iRect = item.GetBounds(ItemBoundsPortion.Label);
       
       Graphics grph = Graphics.FromHwnd(this.Handle);

       Brush brLine = new SolidBrush(System.Drawing.SystemColors.Highlight);
       Brush brString = new SolidBrush(System.Drawing.SystemColors.ActiveCaptionText);
    
       grph.FillRectangle(brLine, iRect);
       grph.DrawString(item.Text, this.Font, brString, iRect);

       for(int i = 1; i < item.SubItems.Count; i++)
       {
          ListViewItem.ListViewSubItem subItem = item.SubItems[i];                //Если бы вот тут можно было получить конкретный индекс
                                                                                                                     //того сабайтема на котором кликнули! (как это сделать непонятно)

          Rectangle sRect = GetSubItemBounds(item.Index, i, ItemBoundsPortion.Label);
              
          grph.FillRectangle(brLine, sRect);

          grph.DrawString(subItem.Text, this.Font, brString, sRect);
       }

       brLine.Dispose();
       brString.Dispose();
       grph.Dispose();   
    }


Тут тупо подсвечиваются весь текст во всех сабайтемах, переписать на FillRectangle() не проблема. Проблема получить конкретный сабайтем, его индекс, или его границы.. Чтобы залить конкретно его...

Какие идеи?

p.s. И в конце концов, если никто не знает, то скажите, всё это можно реализовать через DataGrid? Мне тут надо выделять отдельно ячейку, возможность заносить туда текстовую инфу программно, и считывание того, что записали в ячейку...

Автор: VeryWell 23.9.2009, 19:14
У DataGrid усть свойства SelectedRows, SelectedColomns и SelectedCells...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)