我想提出一個簡單的類擴展CheckedListBox,只是增加了一個小的文本框,一個項目的權當它被選中。我的問題是找到一個把盒子放在正確位置的好方法。有一個簡單的方法來獲取特定項目的座標在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)I可以使用鼠標的位置,其中,如果輸入是通過鍵盤當然將不起作用。我不認爲它會如此,但最好不要離開這種可能性。
隨着一些谷歌搜索,我發現可能做到這一點的唯一方式是使用ListBoxItem和TranslatePoint方法,但我沒有得到這個工作,我不確定它是否可以用CheckedListBox而不是一個ListBox。
那麼,有沒有發現我不知道的檢查項目的x和y的一個簡單的方法?還是僅限於將上面的x和y聲明提取到方法中並將其留在那裏?
正是我一直在尋找。多謝。 – ltab
這幾乎太方便了!可能這屬於一個更通用的控制 - 比方說,如果你在一個組中有一個RadioButton或者什麼的?試圖在MSDN上找到它,但它只是給我ListBox頁面......所以我猜測答案不是。 – sab669
@ sab669的GetItemRectangle是特定於列表框控件,其由CheckedListBox控件繼承。 – LarsTech