Как я могу изменить задний цвет строки ObjectListView? - PullRequest
1 голос
/ 05 апреля 2019

У меня есть список объектов от BrightIdeasSoftware.В настоящее время я могу добавлять и удалять этот список, но не могу закрасить цвета строк (НЕ ЗАГОЛОВОК). Просто хочу перекрасить половину списка в красный, а в качестве примера - синий.

Обычно я хотел бысделать это:

            for (int i = 0; i < index; i++)
            {
                mainForm.MyListView.Items[i].BackColor = Color.LightGray;
            }
            mainForm.MyListView.Items[index].BackColor = Color.DarkGreen;
            for (int i = index; i < mainForm.MyListView.Items.Count; i++)
            {
                mainForm.MyListView.Items[i].BackColor = Color.FromArgb(18, 18, 18);
            }

Но это не работает, я также пытался обновить объект после их перекраски, но все еще не работает.Я проверил это , но я не хочу делать это с условием. Я просто хочу дать индекс, а затем перекрасить мой список.

Может кто-нибудь показать мне, как я могу достичьэтот?Большое спасибо

РЕДАКТИРОВАТЬ: Я поделюсь всем своим методом, чтобы он был более понятным ..

public void PaintToIndex(int index)
        {
            for (int i = 0; i < index; i++)
            {
                mainForm.MyListView.Items[i].BackColor = Color.LightGray;
            }
            mainForm.MyListView.Items[index].BackColor = Color.DarkGreen;
            for (int i = index; i < mainForm.MyListView.Items.Count; i++)
            {
                mainForm.MyListView.Items[i].BackColor = Color.FromArgb(18, 18, 18);
            }

        }

РЕДАКТИРОВАТЬ2: Я думаю, что я мог бы найти что-то, я изменил свой метод на это, ноон сам обновляется.

            for (int i = 0; i < index; i++)
            {
                OLVListItem CurItem = mainForm.MyListView.GetItem(i);
                CurItem.BackColor = Color.LightGray;
                //mainForm.MyListView.RefreshItem(CurItem);
            }
            mainForm.MyListView.GetItem(index).BackColor = Color.LightGray;
            for (int i = index; i < mainForm.MyListView.Items.Count; i++)
            {
                OLVListItem CurItem = mainForm.MyListView.GetItem(i);
                CurItem.BackColor = Color.FromArgb(18, 18, 18);
                //mainForm.MyListView.RefreshItem(CurItem);
            }

Когда я открываю RefreshItem, он обновляет свой OLVListItem до предыдущего цвета.

РЕДАКТИРОВАТЬ 3: Я нашел решение.Я сделал Refresh () после того, как установил все свои цвета, но теперь у меня есть другая проблема, когда я наводю курсор мыши, цвет меняется обратно ..

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Документация на их сайте включает очень похожий пример . Вы слушаете событие FormatRow или FormatCell.

Чтобы показать клиентам красное, когда они должны деньги, вы должны настроить обработчик для события FormatRow в IDE, а затем сделать что-то вроде этого:

private void olv1_FormatRow(object sender, FormatRowEventArgs e) {
    Customer customer = (Customer)e.Model;
    if (customer.Credit < 0)
        e.Item.BackColor = Color.Red;
}

Чтобы изменить форматирование отдельной ячейки, необходимо установить для UseCellFormatEvents значение true, а затем прослушивать события FormatCell. Чтобы отобразить только кредитный баланс красным цветом, вы можете сделать что-то вроде этого:

private void olv1_FormatCell(object sender, FormatCellEventArgs e) {
    if (e.ColumnIndex == this.creditBalanceColumn.Index) {
        Customer customer = (Customer)e.Model;
        if (customer.Credit < 0)
            e.SubItem.ForeColor = Color.Red;
    }
}

Эти события хорошо работают с UseAlternatingBackColors. Любое форматирование, которое вы выполняете в этих событиях, имеет приоритет над альтернативными цветами заднего плана.

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

Для повышения производительности события FormatCell запускаются только тогда, когда обработчик события FormatRow устанавливает для UseCellFormatEvents значение true. Если вы хотите, чтобы событие FormatCell запускалось для каждой ячейки, вы можете установить UseCellFormatEvents в самом ObjectListView.

0 голосов
/ 09 апреля 2019

Хорошо, я нашел решение.Вот как я это сделал

            int CurrentIndex = StaticVariables.MyListView.GetPlaylistCurrentIndex();
            int count = StaticVariables.MyListView.GetPlaylistCount();
            for (int i = 0; i < CurrentIndex; i++)
            {
                OLVListItem item = mainForm.MyListView.GetItem(i);
                item.BackColor = Color.FromArgb(35, 35, 35);
            }
            for (int i = CurrentIndex; i < count; i++)
            {
                OLVListItem item = mainForm.MyListView.GetItem(i);
                item.BackColor = Color.FromArgb(18, 18, 18);
            }
            OLVListItem item2 = mainForm.MyListView.GetItem(CurrentIndex);
            item2.BackColor = Color.DarkGreen;
            mainForm.MyListView.Refresh();

Я вызываю этот метод для события FormatRow.Есть еще 1 вещь, которую я хочу упомянуть.Это не работало, пока я не проверил UseHotControls на false.Вы знаете, что это свойство делает некоторые причудливые вещи, когда вы наводите курсор мыши на ячейку или строку или что-то еще, но я предполагаю, что оно не работает хорошо с изменениями заднего цвета, потому что когда оно было истинным (по умолчанию), мой ObjectListView не обновлял свой задний цвет, пока янаведите курсор мыши на OLV или щелкните любой элемент, но затем, когда я завис и активировал HotControl, они меняли цвет на исходный (прозрачный).Мне удается изменить цвет спины HotControl, но все же у меня возникла проблема с не обновлением себя.После того, как я установил UseHotControls в false и вызвал тот же метод, все работает отлично.Я оставлю этот метод и этот длинный абзац здесь на случай, если кому-то еще понадобится.

...