是否有一种简单的方法来获取复选列表框中特定项的坐标
本文关键字:列表 坐标 获取 方法 简单 一种 是否 | 更新日期: 2023-09-27 18:11:14
我正在做一个简单的类扩展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)。这是有效的,但是感觉像一个hack,并且不是很好读。
我想到的另外两个想法:
1)我可以在开始时创建所有的文本框,并简单地隐藏它们,直到需要它们。然而,像这样的控件都是在程序的其余部分动态创建的,我不希望这些控件成为奇怪的例外。这也意味着在添加或删除项目时需要添加一些更多的功能。
2)我可以使用鼠标位置,当然,如果输入是通过键盘,这将不起作用。我不期望会是这样,但最好不要放弃这种可能性。
通过一些谷歌搜索,我发现可能这样做的唯一其他方法是使用ListBoxItem和TranslatePoint方法,但我还没有得到工作,我不确定它是否甚至可以用checkkedlistbox代替ListBox。
那么,有没有一种简单的方法可以找到我不知道的选中项的x和y ?或者我是否仅限于将上面的x和y声明提取到一个方法中并将其留在那里?
您可以使用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);
//...
}