当我点击列表框中的未选项时,它将被选中。客户端希望如果再次单击(因此不使用cntrl键),则取消选择。
但是我尝试了很多东西,但没有任何作用。那么这是可能的吗?如果可能的话,有人可以解释一下如何使用一些C#代码吗?
答案 0 :(得分:2)
使用内置选项没有简单的方法。我的解决方案是在鼠标悬停在Control上时以编程方式发送虚拟Ctrl键(因此用户无需按或思考任何事情)。如果您不需要MultiExtended
的其他功能,请尝试使用MultiSimple
(MSDN)。
如果你这样做,这是一个丑陋的解决方案:
[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
public const byte KEYEVENTF_KEYUP = 0x02;
public const int VK_CONTROL = 0x11;
private void listBox1_MouseEnter(object sender, EventArgs e)
{
keybd_event(VK_CONTROL, (byte)0, 0, 0);
}
private void listBox1_MouseLeave(object sender, EventArgs e)
{
keybd_event(VK_CONTROL, (byte)0, KEYEVENTF_KEYUP, 0);
}
从我的回答here。
答案 1 :(得分:1)
您可以在所选索引事件中添加一些内容,如果所选索引与精心选择的索引相同(将其存储在某处),则将所选索引设置为-1,这样就不会选择任何内容。
答案 2 :(得分:0)
坚持SelectedValueChanged
事件并添加此内容:
string selected = null;
private void listBox1_SelectedValueChanged(object sender, EventArgs e)
{
ListBox lb = sender as ListBox;
if (lb == null) { return; }
if (lb.SelectedItem != null && lb.SelectedItem.ToString() == selected)
{
selected = lb.SelectedItem.ToString();
lb.SetSelected(lb.SelectedIndex, false);
}
else
{
selected = lb.SelectedItem == null ? null : lb.SelectedItem.ToString();
}
}
答案 3 :(得分:0)
当您单击ListBox的空白区域时,这将取消选择All / Specific ListBox项目。
private void listBox1_MouseClick(object sender, MouseEventArgs e)
{
int totalHeight = listBox1.ItemHeight * listBox1.Items.Count;
if(e.Y < totalHeight && e.Y >= 0)
{
// Item is Selected which user clicked.
if(listBox1.SelectedIndex == 0 && listBox1.SelectedItem != null) // Check if Selected Item is NOT NULL.
{
MessageBox.Show("Selected Index : " + listBox1.SelectedItem.ToString().Trim());
}
else
{
listBox1.SelectedIndex = -1;
MessageBox.Show("Selected Index : No Items Found");
}
}
else
{
// All items are Unselected.
listBox1.SelectedIndex = -1;
MessageBox.Show("Selected Index : " + listBox1.SelectedItem); // Do NOT use 'listBox1.SelectedItem.ToString().Trim()' here.
}
}
当您选择/取消选择项目时,您也可以使用您想要执行的操作更改代码。