【问题标题】:C# listbox select and unselect item in MultiExtended modeC#列表框在MultiExtended模式下选择和取消选择项目
【发布时间】:2012-07-25 12:41:21
【问题描述】:

当我单击列表框中未选择的项目时,它将被选中。客户希望如果您再次单击(因此不使用 cntrl 键)它会取消选择。

但是我尝试了很多东西,但没有任何效果。那么这可能吗?如果可能的话,有人可以解释一下如何使用一些 C# 代码吗?

【问题讨论】:

  • 这是 Windows 应用程序还是 ASP.Net 应用程序?
  • 你考虑过使用MultiSimple模式吗? stackoverflow.com/questions/11350514/…
  • 我没有使用 MultiSimple,因为我认为这没有我想要的行为(是的,很简单)但这正是我想要的。

标签: c# listbox


【解决方案1】:

使用内置选项没有简单的方法可以做到这一点。我的解决方案是在鼠标悬停在控件上时以编程方式发送虚拟 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

【讨论】:

  • @NominSim 您不需要按 Ctrl 键。虚拟按键以编程方式执行。
  • 哦,我现在明白了,你说它丑是对的,但无论如何 +1。
  • 这个答案值得两票赞成。好吧,你已经回答了两次,所以你得到了两个赞成票!
【解决方案2】:

您可以在选定索引事件中添加一些内容,如果选定索引与珍贵选定的索引相同(将其存储在某处),然后将选定索引设置为 -1,则不会选择任何内容。

【讨论】:

    【解决方案3】:

    当您单击列表框的空白区域时,这将取消选择所有/特定列表框项目。

            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.
                }
            }
    

    您还可以在选择/取消选择项目时使用您想要执行的操作更改代码。

    • 如有任何问题,请发表评论。

    【讨论】:

      【解决方案4】:

      遵守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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        相关资源
        最近更新 更多