Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
mkmen100500
Member

Откуда:
Сообщений: 5
Здравствуйте, прошу вашей помощи. Есть такой код C#:
Dictionary<int, Color> colorsList = new Dictionary<int, Color>();
        private void toolStripButton5_Click(object sender, EventArgs e)//ИЗМЕНЕНИЕ ЦВЕТА СТРОКИ
        {

            for (int i = 0; i < listView1.Items.Count; i++)
            {
                if (listView1.Items[i].Selected == true)
                {
                    if (toolStripComboBox1.Text == "Красный")
                        

                    {

                        listView1.Items[i].BackColor = Color.Red;
                        if (!colorsList.ContainsKey(i)) { colorsList.Add(i, Color.Red); }
                        else { colorsList[i] = Color.Red; }
                    }

                    else if (toolStripComboBox1.Text == "Желтый")

                    {

                        listView1.Items[i].BackColor = Color.Yellow;
                        if (!colorsList.ContainsKey(i)) { colorsList.Add(i, Color.Yellow); }
                        else { colorsList[i] = Color.Yellow; }
                    }

                    else if (toolStripComboBox1.Text == "Зеленый")

                    {

                        listView1.Items[i].BackColor = Color.Green;
                        if (!colorsList.ContainsKey(i)) { colorsList.Add(i, Color.Green); }
                        else { colorsList[i] = Color.Green; }

                    }

                    else if (toolStripComboBox1.Text == "Без цвета")

                    {

                        listView1.Items[i].BackColor = Color.White;
                        if (!colorsList.ContainsKey(i)) { colorsList.Add(i, Color.White); }
                        else { colorsList[i] = Color.White; }
                    }
                }
            }
        }

        void SetColor()
        {

            foreach (var c in colorsList)
            {
                if (listView1.Items.Count >= c.Key)
                    listView1.Items[c.Key].BackColor = c.Value;
            }
        }


Выбранная строка в listview цветом выделяется, но после обновления данных из mysql в форму происходит сброс цвета соответственно. Подскажите как заставить строки listview запомнить цвет?

Код обновления просто по кнопке:

private async void toolStripButton4_Click(object sender, EventArgs e)//ОБНОВЛЕНИЕ ДАННЫХ
        {

            listView1.Items.Clear();
            await LoadBanksAsync();
            SetColor();
        }


Теперь собственно проблема:

При закрытии и новом открытии цвета сбрасываются и если строка закрашивается, и после этого добавить новую строку, то выводит Исключение типа "System.ArgumentOutOfRangeException " возникло в mscorlib.dll, но не было обработано в коде пользователя

Дополнительные сведения: InvalidArgument=Значение '0' недопустимо для 'index'.

Еще посмотрел что если в таблице более одной строки и все их окрасить, обновить то выбивает ту же ошибку. Решено только для одной строки в общем.
Прошу помощи, дорогие друзья! Если нужен еще какой либо код, скину.
28 янв 19, 10:18    [21795536]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
mkmen100500
Member

Откуда:
Сообщений: 5
Данные заполняются из MySQL базы.
28 янв 19, 10:22    [21795544]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3604
не знаю, что вам сказать, уверен, вы начинающий, и излишне критиковать вас было бы глупо, но код в помойку
мало того, что понять, что происходит просто довольно сложно, потому, что имена методов и полей мне практически не о чем не говорят, такого рода код if (toolStripComboBox1.Text == "Красный") мягко говоря недопустим.
Если переменная i по сути является индексом, становится совершенно не понятно, зачем тут поле
Dictionary<int, Color> colorsList = new Dictionary<int, Color>();
Использование справочника тут избыточно, хватит даже обычного массива.
Для цветов есть масса классов в .NET
Если вам нужен предустановленный набор цветов возможно взять существующий:
Посмотрите класс System.Windows.Media.Color из сборки PresentationCore, в ней перечислены все цвета,
в wpf используется несколько другие типы
            System.Drawing.Color dc = Color.Red;
            Color dsc = SystemColors.ActiveBorder;
            Color named = System.Drawing.Color.FromName("Red");
            Color known = Color.FromKnownColor(KnownColor.WindowText);
            Color green = Color.FromArgb(unchecked((int)0xFF008000));
            Console.WriteLine(Color.Green.ToArgb().ToString("x")); // ff008000
            //Получение списка всех предопределенных цветов из класса Color
            IEnumerable<string> colors = typeof(Color)
                .GetProperties(BindingFlags.Public | BindingFlags.Static)
                .Select(p => ((Color)p.GetValue(null, null)).Name);
            Console.WriteLine(string.Join(", ", colors));

попробуйте переделать свою логику и переложить все эти вопросы с цветами на код .net, ведь вы пилите самокат, которые не поедет, когда рядом стоит велосипед и не один, их много.
Color это структура, в операциях требующих высокой производительности и не безопасного кода, это может быть очень кстати.
28 янв 19, 12:26    [21795665]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
mkmen100500
после обновления данных из mysql в форму происходит сброс цвета
цвет записать в доп.колнку в базе. А форму потом просто обновить refresh
28 янв 19, 12:35    [21795674]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3604
ошибка, не System.Windows.Media.Color , а System.Drawing.Color, как в примере, первое как раз из WPF
28 янв 19, 12:39    [21795681]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
mkmen100500
Member

Откуда:
Сообщений: 5
Roman Mejtes, да, я начинающий и даже не расчитываю связать свою жизнь с программированием, просто наткнулся на видео, сидя на работе как человек делаем форму и подключает базу, попробовал, получилось, пошел дальше. Вот теперь такая проблема) Спасибо, буду думать.
28 янв 19, 12:48    [21795688]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
mkmen100500
Member

Откуда:
Сообщений: 5
Petro123, имеете ввиду при выборе из тулбокса записывать значение в доп колонку строки?
28 янв 19, 12:49    [21795692]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
mkmen100500
Petro123, имеете ввиду при выборе из тулбокса записывать значение в доп колонку строки?
я сказал в mySql базу.
А какким макаром писать, это надо от вас скрин, юз кейс, сочинение на тему что вы делаете.
28 янв 19, 13:23    [21795748]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
mkmen100500
Member

Откуда:
Сообщений: 5
Petro123,ну в колонку базы естественно.
28 янв 19, 13:55    [21795822]     Ответить | Цитировать Сообщить модератору
 Re: Как сохранить цвет выбранной строки после обновления данных из базы Mysql?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
mkmen100500
Petro123,ну в колонку базы естественно.
еще раз да))))
28 янв 19, 14:20    [21795867]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить