是否有一种简单的方法来获取复选列表框中特定项的坐标

本文关键字:列表 坐标 获取 方法 简单 一种 是否 | 更新日期: 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);
  //...
}