В коде реализовано то что при нажатии на определенную колонку, например количество у нас открывается textbox  в которую мы вводим число, далее нужно изменить позицию появления этого textbox, еще добавить функцию чтобы он изчезал, когда мы ввели значение или выбрали что-то другое, тоже самое нужно сделать чтобы при нажатии на колонку уровень и качество, у нас появлялся выпадающий список

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;
        public ItemsProcessing()
        {

            itemsList = new ItemsList();
        }
        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;
        }

        private void CountTextBoxKeyPress(object sender, KeyPressEventArgs e)
        {
            // Проверяем, является ли введенный символ числом или управляющим символом (например, backspace)
            if (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar))
            {
                e.Handled = true; // Игнорируем введенный символ
            }
        }


        private TextBox CountTextBox;
        private ComboBox LevelComboBox;
        private ComboBox EnchantmentComboBox;
        private Form Changeing; // Форма для добавления контролов

        // Конструктор с параметром, принимающий форму
        public ItemsProcessing(Form form)
        {
            itemsList = new ItemsList();
            Changeing = form;
        }
        public void ShowCountTextBox(ListViewItem selectedItem, ListViewItem.ListViewSubItem subItemCount)
        {
            // Пример создания TextBox (вам нужно рассчитать правильное расположение и размеры)
            TextBox quantityTextBox = CreateOrGetCountTextBox();
            quantityTextBox.Bounds = new Rectangle(selectedItem.Position.X+ subItemCount.Bounds.Left, selectedItem.Position.Y + subItemCount.Bounds.Top, subItemCount.Bounds.Width, subItemCount.Bounds.Height);
            quantityTextBox.Text = subItemCount.Text;
            quantityTextBox.Visible = true;
            quantityTextBox.BringToFront();
            quantityTextBox.Focus();

            // … Другие действия, например подписка на событие Leave и т.д.
        }
        private TextBox CreateOrGetCountTextBox()
        {
            if (CountTextBox == null || CountTextBox.IsDisposed)
            {
                CountTextBox = new TextBox();
                Changeing.Controls.Add(CountTextBox); // Добавляем контрол на форму
            }
            return CountTextBox;
        }
        private void RemoveEditingControls()
        {
            // Сначала проверяем, были ли созданы контролы
            if (CountTextBox != null)
            {
                Changeing.Controls.Remove(CountTextBox);
                CountTextBox.Dispose();
                CountTextBox = null;
            }
            if (LevelComboBox != null)
            {
                Changeing.Controls.Remove(LevelComboBox);
                LevelComboBox.Dispose();
                LevelComboBox = null;
            }
            if (EnchantmentComboBox != null)
            {
                Changeing.Controls.Remove(EnchantmentComboBox);
                EnchantmentComboBox.Dispose();
                EnchantmentComboBox = null;
            }
        }
        public void PopulateLevelCombobox(ComboBox LevelComboBox, int minimumLevel)
        {
            LevelComboBox.Items.Clear();
            for (int i = minimumLevel; i <= 8; i++)
            {
                LevelComboBox.Items.Add(i.ToString());
            }
            LevelComboBox.SelectedIndex = 0;
        }
        public void PopulateEnchantmentCombobox(ComboBox EnchantmentComboBox)
        {
            EnchantmentComboBox.Items.Clear();
            for (int i = 0; i <= 3; i++)
            {
                EnchantmentComboBox.Items.Add(i.ToString());
            }
            EnchantmentComboBox.SelectedIndex = 0;
        }


        public void InitializeComboboxes(ComboBox LevelComboBox, ComboBox EnchantmentComboBox)
        {
            LevelComboBox.Items.Clear();
            EnchantmentComboBox.Items.Clear();

            for (int i = 1; i <= 8; i++)
            {
                LevelComboBox.Items.Add(i.ToString());
            }
            for (int i = 0; i <= 3; i++)
            {
                EnchantmentComboBox.Items.Add(i.ToString());
            }

            LevelComboBox.SelectedIndex = 0;
            EnchantmentComboBox.SelectedIndex = 0;
        }
        public void ApplyChangesToSelectedItem(ListViewItem selectedItem, string quantity, string level, string charm)
        {
            if (selectedItem != null && selectedItem.Tag is Item item)
            {
                item.Level = int.Parse(level);
                item.Charms = int.Parse(charm);

                selectedItem.SubItems[2].Text = quantity;
                selectedItem.SubItems[3].Text = level;
                selectedItem.SubItems[4].Text = charm;
            }
        }
        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);

                // Предположим, что колонка “Количество” имеет индекс 2, но вам нужно использовать фактический индекс колонки в вашем ListView
                int quantityColumnIndex = 2;

                if (hit.SubItem != null && hit.Item.SubItems.IndexOf(hit.SubItem) == quantityColumnIndex)
                {
                    ShowCountTextBox(hit.Item, hit.SubItem);

                }

            }

        }


    }

}