0

Всем привет. Нужно вставить в dgv значения из Dictionary. Как эти значения правильно вывести в таблицу, чтобы не начиналось каждый раз с новой строки? введите сюда описание изображения

Да, я понимаю, что я просто вставляю в новую строку данные. Хотелось-бы узнать, как можно вставлять в ранее созданную строку данные.

Код:

            var Dictionary = BusinessMenu.dic;
            foreach (var Product in Dictionary.Values)
            {
                switch (Product.Type)
                {
                    case "Business":
                        dgv.Rows.Add($"{Product.Title}/{Product.Price}", null, null, null, null, null);
                        break;
                    case "Salad":
                        dgv.Rows.Add(null, $"{Product.Title}/{Product.Price}", null, null, null, null);
                        break;
                    case "Soup":
                        dgv.Rows.Add(null, null, $"{Product.Title}/{Product.Price}", null, null, null);
                        break;
                    case "HotDishes":
                        dgv.Rows.Add(null, null, null, $"{Product.Title}/{Product.Price}", null, null);
                        break;
                    case "Dessert":
                        dgv.Rows.Add(null, null, null, null, $"{Product.Title}/{Product.Price}", null);
                        break;
                    case "Drinkable":
                        dgv.Rows.Add(null, null, null, null, null, $"{Product.Title}/{Product.Price}");
                        break;
                }
            }
Frehzy
  • 1,316
  • в ранее созданную строку данные - подумайте логически, вам нужна для начала строка, верно? Ну так берите ее из коллекции dgv.Rows через индекс, ну или .Last(). Строку получили, что дальше? Наверно, нужна ячейка, ок, как по англ. ячейка? Cell. Что есть из доступного с таким названием? Наверно Cells, что это? Массив? Да. Ну так берем смело через индекс нужную ячейку. Все, присваивайте ей нужное значение. В итоге получаете нечто dgv.Rows[0].Cells[1] = $"{Product.Title}/{Product.Price}". Ну или сокращенный вариант dgv[0, 1] = $"{Product.Title}/{Product.Price}". Не ленитесь думать! – EvgeniyZ Nov 07 '21 at 20:40
  • То, что вы написали - это было моей первой идей. Я изначально хотел попробовать dgv.Rows[0].Cells[1].Value, но как я пойму, что данная ячейка является действительно последней и в ней не написано ничего. – Frehzy Nov 07 '21 at 20:43
  • Яж написал через индекс, ну или .Last(). Тут идет простая работа с массивами. Будь то dgv.Rows.Last(), или dgv.Rows[dgv.RowCount], да даже dgv.Rows[^1], все это даст вам последний объект массива/коллекции. Аналогично с Cells (если надо). не написано ничего - вы не знаете как проверять на null или пустоту? string.IsNullOrEmpty(...), если просто на null, то == null или is null. – EvgeniyZ Nov 07 '21 at 20:51
  • Как эти данные изначально попали в Dictionary? Не лучше ли сразу заносить их в правильную структуру данных? – Alexander Petrov Nov 07 '21 at 22:02
  • 1
    Чтобы оьметить вопрос решенным, достаточно принять ответ, не нужно редактировать заголовок. – aepot Nov 07 '21 at 23:37
  • @AlexanderPetrov через другую форму, в которой нужно было вписывать эти данные. Данная форма является "предпросмотром". Глобальной нагрузки она не несёт. Нужно было, чтобы просто оно работало. Спасибо – Frehzy Nov 07 '21 at 23:58
  • Спрашиваю ещё раз: как эти данные попадают в Dictionary? Покажите код! Можно задать новый вопрос. – Alexander Petrov Nov 08 '21 at 00:35
  • @AlexanderPetrov Создал новый вопрос: https://ru.stackoverflow.com/questions/1347153/c-%d0%9e%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%9f%d1%80%d0%b0%d0%b2%d0%ba%d0%b0-%d0%ba%d0%be%d0%b4%d0%b0 – Frehzy Nov 08 '21 at 03:26

2 Answers2

2

Можно использовать обращение к конкретной ячейке.

dataGridView1.Rows[1].Cells[1].Value = "Tets";
S. Nick
  • 74,889
0

Написал решение. Не очень красиво, с костылями, но работает:

dgv.Rows.Add();
FreeIndex = 0;
foreach (DataGridViewRow row in dgv.Rows)
    {
        if (row.Cells[5].Value is null)
        {
            dgv.Rows[FreeIndex].Cells[5].Value = $"{Product.Title}/{Product.Price}";
            break;
        }    
        else
        FreeIndex++;
    }

и потом, чтоб убрать лишние строки пустые:

            var rowsToRemove = new List<int>();
            foreach (DataGridViewRow row in dgv.Rows)
            {
                int NullCount = 0;
                foreach (DataGridViewColumn column in dgv.Columns)
                {
                    if (row.Cells[column.Index].Value is null)
                        NullCount++;
                }
            if (NullCount == dgv.Columns.Count)
                rowsToRemove.Add(row.Index);
        }

        rowsToRemove.Reverse();
        rowsToRemove.ForEach(i =&gt; dgv.Rows.RemoveAt(i));
        rowsToRemove.Reverse();

Frehzy
  • 1,316
  • Жаль, нельзя несколько минусов поставить. – Alexander Petrov Nov 08 '21 at 00:36
  • 1
    @AlexanderPetrov зачем минусить? Можно дать свой правильный ответ. – aepot Nov 08 '21 at 08:24
  • 1
    @Frehzy А вообще - вот решение, которое может позволить избежать костылей вовсе. – aepot Nov 08 '21 at 08:26
  • Тут, я смотрю, класс называется Product. Хорошо. Но в нём уже должны быть агрегированные данные. Тогда не понадобится возня с занесением данных в грид и удалением строк. – Alexander Petrov Nov 12 '21 at 09:50