изображение не появляется, если важно, то файл формы находится в debug/BuyMenu.cs
файл ItemsProcessing.cs в debug/BuyMenu/ItemsProcessing.cs
а файлы картинок debug/BuyMenu/ItemsIco/ (все в формате .png)
и имеют такие названия
T3_MAIN_ARCANESTAFF для уровня 3 и чары 0
T4_MAIN_ARCANESTAFF для уровня 4 и чары 0
T4_MAIN_ARCANESTAFF@1 для уровня 4 и чары 1
T4_MAIN_ARCANESTAFF@2 для уровня 4 и чары 2

ItemsProcessing.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Reflection.Emit;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Albion_Helper
{

    public class ItemsProcessing
    {

        public ItemsList itemsList;
        private TextBox CountTextBox;
        private ComboBox LevelComboBox;
        private ComboBox EnchantmentComboBox;
        private Form Changing;
        public ItemsProcessing(Form form)
        {
            itemsList = new ItemsList();
            Changing = form;
            CountTextBox = CreateOrGetCountTextBox();
            LevelComboBox = CreateOrGetComboBox(forLevel: true);
            EnchantmentComboBox = CreateOrGetComboBox(forLevel: false);

            // Установка начальных значений для ComboBox’ов (можно использовать другие методы для их заполнения)
            PopulateLevelCombobox(LevelComboBox, 1);
            PopulateEnchantmentCombobox(EnchantmentComboBox);
        }


        public void HandleCountKeyPress(KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
        }
        public List<Item> GetSortedItems()
        {
            List<Item> items = itemsList.GetItems();
            return items.OrderBy(item => item.EnglishName).ToList();
        }
        public void LoadImagesToImageList(ImageList imageList, string basePath)
        {
            foreach (var item in itemsList.GetItems())
            {
                string imagePath = Path.Combine(basePath, "BuyMenu", "ItemsIco", item.ImageFileName + ".png");

                if (File.Exists(imagePath))
                {
                    using (var bmpTemp = new Bitmap(imagePath))
                    {
                        // Заменим item.EnglishName на ImageFileName, чтобы использовать уникальное имя файла,
                        // так как один и тот же товар может иметь разные уровни.
                        imageList.Images.Add(item.ImageFileName, new Bitmap(bmpTemp));
                    }
                }
            }
        }
        public void PopulateBrowseList(ListView browserList, ImageList imageList)
        {
            List<Item> items = GetSortedItems();
            browserList.Items.Clear();

            foreach (Item item in items)
            {
                ListViewItem listViewItem = CreateBrowserListViewItem(item);
                browserList.Items.Add(listViewItem);
            }
        }

        public ListViewItem CreateBrowserListViewItem(Item item)
        {
            ListViewItem listViewItem = new ListViewItem();
            // Фиксируем уровень и зачарование для BrowserList
            item.Level = 3; // Минимальный уровень для BrowserList
            item.Charms = 0; // Без зачарований для BrowserList
            listViewItem.ImageKey = item.GetImageFileName(); // используем метод объекта для получения имени файла картинки
            listViewItem.SubItems.Add(item.EnglishName); // используем только название предмета без префикса
            listViewItem.SubItems.Add(item.GetLocalizedCategory()); // колонка категория
            listViewItem.Tag = item;
            return listViewItem;
        }

        public ListViewItem CreateInventoryListViewItem(Item item)
        {
            ListViewItem listViewItem = new ListViewItem();
            listViewItem.ImageKey = item.ImageFileName;
            listViewItem.SubItems.Add(item.GetFullEnglishName());
            listViewItem.SubItems.Add("1"); // Default quantity
            listViewItem.SubItems.Add(item.Level.ToString());
            listViewItem.SubItems.Add(item.Charms.ToString());
            listViewItem.SubItems.Add(item.GetLocalizedCategory());
            listViewItem.Tag = item;
            return listViewItem;
        }




        // Конструктор с параметром, принимающий форму

        public void ShowCountTextBox(ListViewItem selectedItem, ListViewItem.ListViewSubItem subItemCount)
        {
            TextBox quantityTextBox = CreateOrGetCountTextBox();

            // Определите сдвиг по Y, чтобы подвинуть вниз, например на 2 пикселя
            int yOffset = 20;

            // Получаем положение ячейки внутри ListView и применяем сдвиг
            Rectangle subItemRect = subItemCount.Bounds;
            Point textBoxLocation = selectedItem.ListView.PointToScreen(new Point(subItemRect.Left, subItemRect.Top + yOffset));
            textBoxLocation = Changing.PointToClient(textBoxLocation);

            // Устанавливаем границы TextBox
            quantityTextBox.SetBounds(textBoxLocation.X, textBoxLocation.Y, subItemRect.Width, subItemRect.Height - yOffset); // Уменьшаем высоту на yOffset, чтобы сохранить размер
            quantityTextBox.Text = subItemCount.Text;
            quantityTextBox.Visible = true;
            quantityTextBox.BringToFront();
            quantityTextBox.Focus();

            // Важно! Связываем TextBox с ListViewItem через Tag
            quantityTextBox.Tag = selectedItem;
        }
        private TextBox CreateOrGetCountTextBox()
        {
            if (CountTextBox == null || CountTextBox.IsDisposed)
            {
                CountTextBox = new TextBox();
                CountTextBox.KeyPress += CountTextBox_KeyPress; // Обновлено
                CountTextBox.Leave += CountTextBox_Leave;
                Changing.Controls.Add(CountTextBox); // Добавляем контрол на форму
            }
            return CountTextBox;
        }
        private void CountTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                TextBox tb = (TextBox)sender;
                UpdateQuantity((ListViewItem)tb.Tag, tb.Text);
                tb.Visible = false; // Скрыть после Enter
                e.Handled = true; // Предотвратить “beep” звук
            }
            else
            {
                HandleCountKeyPress(e);
            }
        }
        private void UpdateQuantity(ListViewItem selectedListViewItem, string newQuantity)
        {
            // Вы можете обновить Tag или SubItem, который содержит количество
            if (selectedListViewItem != null && selectedListViewItem.Tag is Item item)
            {
                // Примените изменения к вашему объекту Item или обновите SubItem
                selectedListViewItem.SubItems[2].Text = newQuantity; // Предполагаем, что это колонка с количеством
            }
        }

        private void CountTextBox_Leave(object sender, EventArgs e)
        {
            TextBox tb = (TextBox)sender;
            UpdateQuantity((ListViewItem)tb.Tag, tb.Text); // Сохранить значение перед скрытием
            tb.Visible = false; // Затем скрыть TextBox
        }

        public void InitializeListViewMouseHandlers(ListView InventoryList)
        {
            InventoryList.MouseClick += InventoryListMouseClick;
        }

        private void InventoryListMouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ListView listView = sender as ListView;
                ListViewHitTestInfo hit = listView.HitTest(e.X, e.Y);
                int quantityColumnIndex = 2; // Примерный индекс для количества
                int levelColumnIndex = 3; // Примерный индекс для уровня
                int enchantmentColumnIndex = 4; // Примерный индекс для качества

                if (hit.SubItem != null)
                {
                    if (hit.Item.SubItems.IndexOf(hit.SubItem) == quantityColumnIndex)
                    {
                        ShowCountTextBox(hit.Item, hit.SubItem);
                    }
                    else if (hit.Item.SubItems.IndexOf(hit.SubItem) == levelColumnIndex)
                    {
                        ShowComboBox(hit.Item, hit.SubItem, forLevel: true);
                    }
                    else if (hit.Item.SubItems.IndexOf(hit.SubItem) == enchantmentColumnIndex)
                    {
                        ShowComboBox(hit.Item, hit.SubItem, forLevel: false);
                    }
                }
            }
        }
        // В этом методе устанавливаем ComboBox в позицию в ListView и обрабатываем его отображение и выбор значения
        private void ShowComboBox(ListViewItem selectedItem, ListViewItem.ListViewSubItem subItem, bool forLevel)
        {
            ComboBox comboBox = forLevel ? LevelComboBox : EnchantmentComboBox;
            int minLevel = (selectedItem.Tag as Item)?.Level ?? 1;
            if (forLevel)
            {
                PopulateLevelCombobox(comboBox, minLevel);
            }
            else
            {
                // Если это не уровень, тогда мы работаем с зачарованиями.
                PopulateEnchantmentCombobox(comboBox);
            }

            // Получаем положение ячейки внутри ListView
            int yOffset = 20;
            Rectangle subItemRect = subItem.Bounds;
            Point comboLocation = selectedItem.ListView.PointToScreen(new Point(subItemRect.Left, subItemRect.Top + yOffset));
            comboLocation = Changing.PointToClient(comboLocation);
            comboBox.SetBounds(comboLocation.X, comboLocation.Y, subItemRect.Width, subItemRect.Height - yOffset);
            // Устанавливаем границы ComboBox точно в положении ячейки ListViewItem
            comboBox.SetBounds(comboLocation.X, comboLocation.Y, subItemRect.Width, subItemRect.Height - yOffset); // Уменьшаем высоту на yOffset, чтобы сохранить размер
            comboBox.Visible = true;
            comboBox.BringToFront();
            comboBox.Focus();
            if (selectedItem.Tag is Item item)
            {
                // Установить значение ComboBox в соответствии с Level или Charms
                comboBox.SelectedItem = forLevel ? item.Level.ToString() : item.Charms.ToString();
            }

            // Подписываемся на событие SelectedIndexChanged если оно уже не подписано
            if (comboBox.Tag == null)
            {
                comboBox.SelectedIndexChanged += (sender, e) =>
                {
                    ComboBox cb = sender as ComboBox;
                    if (cb != null)
                    {
                        string value = cb.SelectedItem.ToString();
                        subItem.Text = value;
                        if (forLevel) UpdateItemLevel(selectedItem, int.Parse(value));
                        else UpdateItemCharm(selectedItem, int.Parse(value));
                    }
                };
                comboBox.Tag = new object(); // Устанавливаем Tag во избежание повторной подписки
            }
        }

        // Обновление уровня предмета в теге ListViewItem
        private void UpdateItemLevel(ListViewItem listViewItem, int newLevel)
        {
            if (listViewItem.Tag is Item item)
            {
                item.Level = newLevel;
                listViewItem.ImageKey = item.GetImageFileName(); // обновляем ImageKey для нового уровня
            }
        }

        // Обновление привлекательности предмета в теге ListViewItem
        private void UpdateItemCharm(ListViewItem listViewItem, int newCharm)
        {
            if (listViewItem.Tag is Item item)
            {
                item.Charms = newCharm;
                listViewItem.ImageKey = item.GetImageFileName(); // обновляем ImageKey для нового зачарования
            }
        }

        // Создание или получение ComboBox
        private ComboBox CreateOrGetComboBox(bool forLevel)
        {
            ComboBox comboBox = new ComboBox
            {
                DropDownStyle = ComboBoxStyle.DropDownList // Установите нужный стиль
            };
            Changing.Controls.Add(comboBox); // Сохраняем ссылку на форму для добавления контролов
            comboBox.Leave += (sender, e) => comboBox.Visible = false; // Скрыть ComboBox при потере фокуса

            // Добавление элементов в ComboBox
            if (forLevel)
            {
                PopulateLevelCombobox(comboBox, 1); // Предполагаем, что уровни начинаются с 1
            }
            else
            {
                PopulateEnchantmentCombobox(comboBox); // Заполнение колдовства
            }
            return comboBox;
        }
        public void PopulateLevelCombobox(ComboBox comboBox, int minimumLevel)
        {
            comboBox.Items.Clear();
            for (int i = minimumLevel; i <= 8; i++)
            {
                comboBox.Items.Add(i.ToString());
            }
            comboBox.SelectedIndex = 0; // Установка выбранного элемента по умолчанию
        }

        // Метод для заполнения ComboBox качеством (зачарованиями)
        public void PopulateEnchantmentCombobox(ComboBox comboBox)
        {
            comboBox.Items.Clear();
            for (int i = 0; i <= 3; i++)
            {
                comboBox.Items.Add(i.ToString());
            }
            comboBox.SelectedIndex = 0; // Установка выбранного элемента по умолчанию
        }

    }

}

ItemsList.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace Albion_Helper
{
    public class Item
    {
        public string EnglishName { get; set; }
        public string RussianName { get; set; }
        public string EnglishCategory { get; set; }
        public string RussianCategory { get; set; }
        public string EnglishSubcategory { get; set; }
        public string RussianSubcategory { get; set; }
        public int Level { get; set; }
        public int Charms { get; set; }
        public string Quality { get; set; }
        public string ImageFileName { get; set; }

        public string GetImageFileName()
        {
            string enchantmentSuffix = Charms > 0 ? "@" +Charms.ToString() : string.Empty;
            return $"T{Level}_{ImageFileName}{enchantmentSuffix}{0}";
        }

        public Item(string englishName, string russianName,
                    string englishCategory, string russianCategory,
                    string englishSubcategory, string russianSubcategory,
                    int level, int charms, string quality, string imageFileName)
        {
            EnglishName = englishName;
            RussianName = russianName;
            EnglishCategory = englishCategory;
            RussianCategory = russianCategory;
            EnglishSubcategory = englishSubcategory;
            RussianSubcategory = russianSubcategory;
            Level = level;
            Charms = charms;
            Quality = quality;
            ImageFileName = imageFileName;
        }

        // Методы класса Item, имитирующие некоторую локализацию и логику
        public string GetLocalizedCategory()
        {
            // Вставьте логику для выбора локализованной категории
            return EnglishCategory;
        }

        public string GetFullEnglishName()
        {
            string prefix = GetLevelPrefix();
            return prefix + " " + EnglishName;
        }

        public string GetLevelPrefix()
        {
            // Вставьте логику для возвращения префикса уровня
            switch (Level)
            {
                case 1: return "Beginner's";
                case 2: return "Novice's";
                case 3: return "Journeyman’s";
                case 4: return "Adept’s";
                case 5: return "Expert’s";
                case 6: return "Master’s";
                case 7: return "Grandmaster’s";
                case 8: return "Elder’s";
                default: return "";
            }
        }
    }

    public class ItemsList
    {
        // Приватное поле для хранения списка предметов
        public List<Item> items;

        // Конструктор класса ItemsList
        public ItemsList()
        {
            items = new List<Item>();

            items.Add(new Item("Arcane Staff", "Арканый посох",
                               "Weapons", "Оружие",
                               "Magic Staffs", "Магические посохи",
                               3, 0, "Normal", "MAIN_ARCANESTAFF"));
        }

        public List<Item> GetItems()
        {
            return items;
        }

    }
}