Есть ли простой способ получить координаты определенного элемента в проверенном списке?

Я делаю простой класс, расширяющий CheckedListBox, который просто добавляет небольшое текстовое поле справа от элемента при его проверке. Моя проблема - найти хороший способ разместить коробку в правильном месте.

Сначала я мог использовать Controls.Find() вместе с индексом ItemCheckEventArgs, чтобы получить координаты рассматриваемого флажка, и оттуда перейти к правому краю столбца. Однако это не сработало, и краткий обзор класса CheckedListBox, казалось, показал, что он на самом деле не содержит никаких элементов управления CheckBox, а просто рисует их изображения.

Затем я придумал следующий метод:

void CreateAmountBox(int index)
    {
        int itemsPerCol = Height/ItemHeight;
        int x = GetColumn(index, itemsPerCol)*ColumnWidth - boxWidth;
        int y = (index % itemsPerCol)*ItemHeight - offset;

        System.Windows.Forms.TextBox NewAmountTextBox = new System.Windows.Forms.TextBox();
        NewAmountTextBox.Location = new System.Drawing.Point(x, y);
        NewAmountTextBox.Name = Items[index] + "Amount";
        NewAmountTextBox.Size = new System.Drawing.Size(20, boxWidth);
        Controls.Add(NewAmountTextBox);
    }

где GetColumn(...) возвращает столбец данного индекса (из CheckEventArgs). Это работает, но похоже на хак и не очень читабельно.

Две другие идеи, о которых я подумал:

1) Я мог бы просто создать все текстовые поля в начале и просто скрывать их, пока они не понадобятся. Однако подобные элементы управления динамически создаются в остальной части программы, и я не хочу, чтобы они были странным исключением. Это также означает, что для случаев, когда элемент добавлен или удален, необходимо добавить еще некоторые функциональные возможности.

2) Я мог бы использовать положение мыши, которое, конечно, не будет работать, если ввод осуществляется с клавиатуры. Я не ожидаю, что так будет, но лучше не оставлять такую ​​возможность.

При некотором поиске в Google единственный другой способ, который я нашел, возможно, сделал это, используя методы ListBoxItem и TranslatePoint, но я не понял, как это работает, и я не уверен, может ли это вообще быть с CheckedListBox вместо ListBox,

Итак, есть ли простой способ найти x и y отмеченного элемента, о котором я не знаю? Или я ограничен простым извлечением описаний x и y выше в метод и оставлением его там?

1 ответ

Решение

Вы можете просто использовать функцию GetItemRectangle для этого:

void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
  Rectangle r = checkedListBox1.GetItemRectangle(e.Index);
  TextBox newAmountTextBox = new TextBox();
  newAmountTextBox.Location = new Point(r.Left, r.Top);
  //...
}
Другие вопросы по тегам