我在我正在使用的小应用程序中使用CheckedListBox控件。这是一个很好的控制,但有一件事困扰我;我无法设置属性,以便在我实际选中复选框时仅检查项目。 克服这个问题的最佳方法是什么? 我一直在考虑从复选框的左侧获取鼠标点击的位置。这部分工作,但如果我点击一个空的空格,左边足够靠近,仍然会检查当前所选项目。关于这个的任何想法?
答案 0 :(得分:11)
我知道这个帖子有点旧,但我不认为提供另一个解决方案是个问题:
private void checkedListBox1_MouseClick(object sender, MouseEventArgs e)
{
if ((e.Button == MouseButtons.Left) & (e.X > 13))
{
this.checkedListBox1.SetItemChecked(this.checkedListBox1.SelectedIndex, !this.checkedListBox1.GetItemChecked(this.checkedListBox1.SelectedIndex));
}
}
(值为CheckOnClick = True
)。
你可以在矩形中使用那个东西,但为什么要使它变得更加复杂。
答案 1 :(得分:7)
嗯,这很难看,但是您可以通过挂钩CheckedListBox.MouseDown
和CheckedListBox.ItemCheck
来计算项目矩形的鼠标点击坐标,如下所示
/// <summary>
/// In order to control itemcheck changes (blinds double clicking, among other things)
/// </summary>
bool AuthorizeCheck { get; set; }
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if(!AuthorizeCheck)
e.NewValue = e.CurrentValue; //check state change was not through authorized actions
}
private void checkedListBox1_MouseDown(object sender, MouseEventArgs e)
{
Point loc = this.checkedListBox1.PointToClient(Cursor.Position);
for (int i = 0; i < this.checkedListBox1.Items.Count; i++)
{
Rectangle rec = this.checkedListBox1.GetItemRectangle(i);
rec.Width = 16; //checkbox itself has a default width of about 16 pixels
if (rec.Contains(loc))
{
AuthorizeCheck = true;
bool newValue = !this.checkedListBox1.GetItemChecked(i);
this.checkedListBox1.SetItemChecked(i, newValue);//check
AuthorizeCheck = false;
return;
}
}
}
答案 2 :(得分:6)
另一个解决方案是简单地使用Treeview 将CheckBoxes设置为true,将ShowLines设置为false,将ShowPlusMinus设置为false,并且您与CheckedListBox基本相同。只有在单击实际的CheckBox时才会检查这些项目。
CheckedListBox更加简单,但TreeView提供了许多可能更适合您的程序的选项。
答案 3 :(得分:1)
我成功使用了此属性:
CheckedBoxList.CheckOnClick
答案 4 :(得分:0)
默认情况下,CheckedListBox中复选框的文本是在复选框输入后放置HTML标签,并将标签的“for”属性设置为复选框的ID。
当标签表示它是“for”的元素时,点击该标签会告诉浏览器关注该元素,这就是您所看到的。
两个选项是使用单独的CheckBox控件和文本(不是CheckBox的Text属性,因为它与CheckBoxList做同样的事情)呈现您自己的列表(如果列表是静态的)或使用类似Repeater的内容清单是动态的。
答案 5 :(得分:0)
试试这个。将iLastIndexClicked声明为表单级int变量。
private void chklst_MouseClick(object sender, MouseEventArgs e)
{
Point p = chklst.PointToClient(MousePosition);
int i = chklst.IndexFromPoint(p);
if (p.X > 15) { return; } // Body click.
if (chklst.CheckedIndices.Contains(i)){ return; } // If already has focus click anywhere works right.
if (iLastIndexClicked == i) { return; } // native code will check/uncheck
chklst.SetItemChecked(i, true);
iLastIndexClicked = i;
}
只是检查用户是否点击了选中列表的最左边15个像素(复选框区域),除了重新检查当前选定的项目外,它始终有效。存储最后一个索引并退出而不进行更改可以让本机代码正确处理,尝试将其设置为已检查,在这种情况下将其打开,并且当&#34; ItemCheck&#34;代码运行。