Выполни рефакторинг 
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();
            listViewItem.ImageKey = item.ImageFileName; // иконка
            listViewItem.SubItems.Add(item.GetFullEnglishName()); // колонка название
            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();


            // Подписываемся на событие 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 item, int newLevel)
        {
            if (item.Tag is Item itm)
            {
                itm.Level = newLevel;
            }
        }

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

        // Создание или получение 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; // Установка выбранного элемента по умолчанию
        }

    }

}