Есть ли простой способ получить координаты определенного элемента в проверенном списке?
Я делаю простой класс, расширяющий 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);
//...
}